天天看點

通過接口送出資料,Content-Type應該是application/x-www-form-urlencoded還是application/json?

通過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);