请选择 进入手机版 | 继续访问电脑版

[C#教程] C#通过HttpWebRequest发送带有JSON Body的POST哀求 实现

[复制链接]
查看147 | 回复18 | 2021-9-14 11:57:51 | 显示全部楼层 |阅读模式
目次

因由

很多博客都有形貌 到这个题目 ,那么为什么我还要写一篇文章来说一下呢,由于 其他的都好像 已颠末 时了,会导致着实 body 并没有发送过去。至于为什么不使用 其他的诸如 HttpClient 之类的,是由于业务必要 。

原来的处理方式

通过 GetRequestStream 来获取哀求 流,后把必要 发送的 Json 数据写入到流中

  1. private T PostDataViaHttpWebRequest<T>(string baseUrl,
  2. IReadOnlyDictionary<string, string> headers,
  3. IReadOnlyDictionary<string, string> urlParas,
  4. string requestBody=null)
  5. {
  6. var resuleJson = string.Empty;
  7. try
  8. {
  9. var apiUrl = baseUrl;
  10. if (urlParas != null)
  11. urlParas.ForEach(p =>
  12. {
  13. if (apiUrl.IndexOf("{" + p.Key + "}") > -1)
  14. {
  15. apiUrl = apiUrl.Replace("{" + p.Key + "}", p.Value);
  16. }
  17. else
  18. {
  19. apiUrl += string.Format("{0}{1}={2}", apiUrl.Contains("?") ? "&" : "?", p.Key, p.Value);
  20. }
  21. }
  22. );
  23. var req = (HttpWebRequest)WebRequest.Create(apiUrl);
  24. req.Method = "POST";
  25. req.ContentType = "application/json";
  26. req.ContentLength = 0;
  27. if (!requestBody.IsNullOrEmpty())
  28. {
  29. using (var postStream = req.GetRequestStream())
  30. {
  31. var postData = Encoding.ASCII.GetBytes(requestBody);
  32. req.ContentLength = postData.Length;
  33. postStream.Write(postData, 0, postData.Length);
  34. }
  35. }
  36. if (headers != null)
  37. {
  38. if (headers.Keys.Any(p => p.ToLower() == "content-type"))
  39. req.ContentType = headers.SingleOrDefault(p => p.Key.ToLower() == "content-type").Value;
  40. if (headers.Keys.Any(p => p.ToLower() == "accept"))
  41. req.Accept = headers.SingleOrDefault(p => p.Key.ToLower() == "accept").Value;
  42. }
  43. var response = (HttpWebResponse)req.GetResponse();
  44. using(Stream stream = response.GetResponseStream())
  45. {
  46. using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("UTF-8")))
  47. {
  48. resuleJson = reader.ReadToEnd();
  49. }
  50. }
  51. }
  52. catch (Exception ex)
  53. {
  54. return default(T);
  55. }
  56. return JsonConvert.DeserializeObject<T>(resuleJson);
  57. }
复制代码

但是会发现,数据不停 没有正常发送过去,而且代码还显得比较复杂

新的方式

这里修改一下写入 RequestStream 的方式,使用 StreamWriter 包装一下,然后直接写入必要 发送的 Json 数据

  1. private T PostDataViaHttpWebRequest<T>(string baseUrl,
  2. IReadOnlyDictionary<string, string> headers,
  3. IReadOnlyDictionary<string, string> urlParas,
  4. string requestBody=null)
  5. {
  6. var resuleJson = string.Empty;
  7. try
  8. {
  9. var apiUrl = baseUrl;
  10. if (urlParas != null)
  11. urlParas.ForEach(p =>
  12. {
  13. if (apiUrl.IndexOf("{" + p.Key + "}") > -1)
  14. {
  15. apiUrl = apiUrl.Replace("{" + p.Key + "}", p.Value);
  16. }
  17. else
  18. {
  19. apiUrl += string.Format("{0}{1}={2}", apiUrl.Contains("?") ? "&" : "?", p.Key, p.Value);
  20. }
  21. }
  22. );
  23. var req = (HttpWebRequest)WebRequest.Create(apiUrl);
  24. req.Method = "POST";
  25. req.ContentType = "application/json"; //Defalt
  26. if (!requestBody.IsNullOrEmpty())
  27. {
  28. using (var postStream = new StreamWriter(req.GetRequestStream()))
  29. {
  30. postStream.Write(requestBody);
  31. }
  32. }
  33. if (headers != null)
  34. {
  35. if (headers.Keys.Any(p => p.ToLower() == "content-type"))
  36. req.ContentType = headers.SingleOrDefault(p => p.Key.ToLower() == "content-type").Value;
  37. if (headers.Keys.Any(p => p.ToLower() == "accept"))
  38. req.Accept = headers.SingleOrDefault(p => p.Key.ToLower() == "accept").Value;
  39. }
  40. var response = (HttpWebResponse)req.GetResponse();
  41. using(Stream stream = response.GetResponseStream())
  42. {
  43. using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("UTF-8")))
  44. {
  45. resuleJson = reader.ReadToEnd();
  46. }
  47. }
  48. }
  49. catch (Exception ex)
  50. {
  51. return default(T);
  52. }
  53. return JsonConvert.DeserializeObject<T>(resuleJson);
  54. }
复制代码

如许 即可精确 发送 Json 数据。

到此这篇关于C#通过HttpWebRequest发送带有JSON Body的POST哀求 实现的文章就先容 到这了,更多相干 C# post哀求 HttpWebRequest内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章盼望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 当当当当裤裆坦 | 2021-9-20 17:04:00 | 显示全部楼层
论坛的人气越来越旺了!
回复

使用道具 举报

avatar 塞上云烟辣 | 2021-9-20 18:23:29 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar 心一路向南飞该 | 2021-9-21 11:35:58 | 显示全部楼层
有节操!
回复

使用道具 举报

avatar 心一路向南飞该 | 2021-9-22 08:10:54 | 显示全部楼层
我和我的小伙伴都惊呆了!
回复

使用道具 举报

avatar 张永峰 | 2021-9-24 21:50:33 | 显示全部楼层
admin楼主的病历本丢我这里了!
回复

使用道具 举报

avatar 大嘴997 | 2021-9-24 21:50:35 | 显示全部楼层
这个帖子好无聊啊!
回复

使用道具 举报

avatar 123457557 | 2021-9-26 23:28:13 | 显示全部楼层
很有看点!
回复

使用道具 举报

avatar 马马虎虎770 | 2021-10-7 00:45:27 | 显示全部楼层
好东西,学习学习!
回复

使用道具 举报

avatar 123456868 | 2021-10-10 09:48:03 | 显示全部楼层
admin楼主很有经验啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则