通過POST方式送出資料到接口的時候,常常會遇到這種句子:
webClient.Headers.Add("Content-Type", "application/json");
或者
webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
那究竟應該用哪種方式?
答案是跟我們送出的參數格式有關。
如果是通過頁面表單方式送出,那就是
"application/x-www-form-urlencoded"
;如果是json(要反序列化成字元串),那就是
"application/json"
。
對于
"application/x-www-form-urlencoded"
,其參數組織形式,是鍵值對,類似于get方式的參數形式:
name=張三&sex=男&tel=5354169
,而json大家都知道,是這樣的:
{
name:"張三",
sex:"男",
tel:"5354169",
}
是以,如果你傳遞的參數是json,而你聲明的header是
"application/x-www-form-urlencoded"
,或者沒有聲明這個"Content-Type"(似乎預設就是"application/x-www-form-urlencoded"),則伺服器拿不到送出的資料。資料是傳過去了,但讀不出來。
反之應該也一樣。
2018.7.20
另外,如果送出的資料中含有漢字,編碼跟伺服器不同的話,也有可能導緻伺服器接收不到送出的資料。
2019.06.20
采用哪種格式,可能也跟伺服器端有關。今天就遇到一種情況,用JSON不行,非要用鍵值對送出。用JSON的話,對方傳回一個錯誤:
無法從傳輸連接配接中讀取資料: 遠端主機強迫關閉了一個現有的連接配接
string postData = "value=a";
byte[] bytes = Encoding.UTF8.GetBytes(postData);
WebClient client = new WebClient();
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
client.Headers.Add("ContentLength", postData.Length.ToString());
Encoding enc = Encoding.GetEncoding("UTF-8");
byte[] responseData = client.UploadData("http://localhost:28450/api/values", "POST", bytes);
string re = enc.GetString(responseData);