使用 HttpClient Post file、XML、Json 等各種HttpContent資料
Content-Type
常見的四種格式 application/x-www-form-urlencoded
、multipart/form-data
、application/json
、application/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-data
,HttpContent
的對應方法是採用 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 資料如果是純粹的 Stream
、Byte[]
格式,則另有 StreamContent
、ByteArrayContent
做對應,一般用於單純傳送檔案、圖片等,使用方法大同小異。