Contents

使用 HttpClient Post file、XML、Json 等各種HttpContent資料

使用 HttpClient Post file、XML、Json 等各種HttpContent資料

Content-Type 常見的四種格式 application/x-www-form-urlencodedmultipart/form-dataapplication/jsonapplication/xml,我們需要新增對應的 HttpContent實例,才能透過 HttpClient來傳送資料

Json格式,使用 StringContent 對應 application/json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
async Task Main()
{
	var client = new HttpClient();

	// 目前最常見的 Json 格式
	IDictionary<string, string> data = new Dictionary<string, string>
	{
		{ "Name", "王小明" },
		{ "Mobile", "0912345678" },
	};
	var jsonFormat = JsonConvert.SerializeObject(data);
	HttpContent contentPost = new StringContent(jsonFormat, Encoding.UTF8, "application/json");
	
	var response = await client.PostAsync("url",contentPost);
}

預設表單 Post 方式,使用 FormUrlEncodedContent 對應 application/x-www-form-urlencoded

如果表單不設置 enctype 屬性,那瀏覽器預設的 Post 方法,會以 application/x-www-form-urlencoded 送出資料

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
async Task Main()
{
	var client = new HttpClient();

	IDictionary<string, string> data = new Dictionary<string, string>
	{
		{ "Name", "王小明" },
		{ "Mobile", "0912345678" },
	};
	
	// application/x-www-form-urlencoded
	var formData = new FormUrlEncodedContent(data);
	var response = await client.PostAsync("url", formData);
}

有上傳檔案,使用 MultipartFormDataContent 對應 multipart/form-data

如果表單有上傳檔案的情況下,會將 enctype 屬性值設置為 multipart/form-dataHttpContent

的對應方法是採用 MultipartFormDataContent

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
async Task Main()
{
	var client = new HttpClient();

	var formContent = new MultipartFormDataContent
	{
		{ new StringContent("王小明"),"Name" },
		{ new StringContent("0912345678"),"Mobile"},
		{ new StreamContent(file.OpenReadStream()),"file",$"{file.FileName}" }
	};

	var response = await client.PostAsync("url", formContent);
}

指定檔案內容格式,或是設定預設編碼

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
async Task Main()
{
	var client = new HttpClient();
	
	// IFormFile 使用 file.OpenReadStream() 或 讀取檔案
	Stream fileStream = File.OpenRead("C:\\test\\test.xlsx"); 
	StreamContent streamContent = new StreamContent(fileStream);
	streamContent.Headers.Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
	
	var formContent = new MultipartFormDataContent
	{
		{ new StringContent("王小明",Encoding.UTF8),"Name" },
		{ new StringContent("0912345678"),"Mobile"},
	};
	formContent.Add(streamContent, "file", $"{file.FileName}");
	
	var response = await client.PostAsync("url", formContent);
}

XML格式,使用 StringContent 對應 application/xml

XML格市目前比較少用到,但還是有部分的 WebService 是透過 XML 傳遞,做法與 Json 相同,指定為 XML 格式即可

1
2
3
4
5
6
7
8
9
async Task Main()
{
	var client = new HttpClient();
	
	var xml = "<?xml version='1.0' encoding='UTF-8'?><Name>王小明</Name><Mobile>0912345678</Mobile>";
	var contentPost = new StringContent(xml, Encoding.UTF8, "application/xml"); // 或text/xml
	
	var response = await client.PostAsync("url", contentPost);
}

其他

Post 資料如果是純粹的 StreamByte[] 格式,則另有 StreamContentByteArrayContent 做對應,一般用於單純傳送檔案、圖片等,使用方法大同小異。