C#通過HttpWebRequest發送帶有JSON Body的POST請求實現
起因
很多博客都有描述到這個問題,那麼為什麼我還要寫一篇文章來說一下呢,因為其他的都似乎已經過時瞭,會導致其實body 並沒有發送過去。至於為什麼不使用其他的諸如 HttpClient 之類的,是由於業務需要。
原來的處理方式
通過 GetRequestStream 來獲取請求流,後把需要發送的 Json 數據寫入到流中
private T PostDataViaHttpWebRequest<T>(string baseUrl, IReadOnlyDictionary<string, string> headers, IReadOnlyDictionary<string, string> urlParas, string requestBody=null) { var resuleJson = string.Empty; try { var apiUrl = baseUrl; if (urlParas != null) urlParas.ForEach(p => { if (apiUrl.IndexOf("{" + p.Key + "}") > -1) { apiUrl = apiUrl.Replace("{" + p.Key + "}", p.Value); } else { apiUrl += string.Format("{0}{1}={2}", apiUrl.Contains("?") ? "&" : "?", p.Key, p.Value); } } ); var req = (HttpWebRequest)WebRequest.Create(apiUrl); req.Method = "POST"; req.ContentType = "application/json"; req.ContentLength = 0; if (!requestBody.IsNullOrEmpty()) { using (var postStream = req.GetRequestStream()) { var postData = Encoding.ASCII.GetBytes(requestBody); req.ContentLength = postData.Length; postStream.Write(postData, 0, postData.Length); } } if (headers != null) { if (headers.Keys.Any(p => p.ToLower() == "content-type")) req.ContentType = headers.SingleOrDefault(p => p.Key.ToLower() == "content-type").Value; if (headers.Keys.Any(p => p.ToLower() == "accept")) req.Accept = headers.SingleOrDefault(p => p.Key.ToLower() == "accept").Value; } var response = (HttpWebResponse)req.GetResponse(); using(Stream stream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("UTF-8"))) { resuleJson = reader.ReadToEnd(); } } } catch (Exception ex) { return default(T); } return JsonConvert.DeserializeObject<T>(resuleJson); }
但是會發現,數據一直沒有正常發送過去,而且代碼還顯得比較復雜
新的方式
這裡修改一下寫入 RequestStream 的方式,使用 StreamWriter 包裝一下,然後直接寫入需要發送的 Json 數據
private T PostDataViaHttpWebRequest<T>(string baseUrl, IReadOnlyDictionary<string, string> headers, IReadOnlyDictionary<string, string> urlParas, string requestBody=null) { var resuleJson = string.Empty; try { var apiUrl = baseUrl; if (urlParas != null) urlParas.ForEach(p => { if (apiUrl.IndexOf("{" + p.Key + "}") > -1) { apiUrl = apiUrl.Replace("{" + p.Key + "}", p.Value); } else { apiUrl += string.Format("{0}{1}={2}", apiUrl.Contains("?") ? "&" : "?", p.Key, p.Value); } } ); var req = (HttpWebRequest)WebRequest.Create(apiUrl); req.Method = "POST"; req.ContentType = "application/json"; //Defalt if (!requestBody.IsNullOrEmpty()) { using (var postStream = new StreamWriter(req.GetRequestStream())) { postStream.Write(requestBody); } } if (headers != null) { if (headers.Keys.Any(p => p.ToLower() == "content-type")) req.ContentType = headers.SingleOrDefault(p => p.Key.ToLower() == "content-type").Value; if (headers.Keys.Any(p => p.ToLower() == "accept")) req.Accept = headers.SingleOrDefault(p => p.Key.ToLower() == "accept").Value; } var response = (HttpWebResponse)req.GetResponse(); using(Stream stream = response.GetResponseStream()) { using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("UTF-8"))) { resuleJson = reader.ReadToEnd(); } } } catch (Exception ex) { return default(T); } return JsonConvert.DeserializeObject<T>(resuleJson); }
這樣即可正確發送 Json 數據。
到此這篇關於C#通過HttpWebRequest發送帶有JSON Body的POST請求實現的文章就介紹到這瞭,更多相關C# post請求 HttpWebRequest內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C#使用Post調用接口並傳遞json參數
- C#記一次http協議multipart/form-data的boundary問題
- C#發送Get、Post請求(帶參數)
- C#調用HTTP POST請求上傳圖片的示例代碼
- C#爬蟲基礎之HttpClient獲取HTTP請求與響應