当前位置:   article > 正文

C#发起http的GET/POST请求并处理响应,及其函数封装_c# http get

c# http get

HTTP请求需要引入的命名空间

using System.Net;

1、先整个窗体

       我会先些一个命令行程序分别实现GET请求和POST请求,这是最终的窗体程序。

        如下:

  •          url输入框用来获取要发起的http请求的地址
  •          GET/POST 单选框用来选择发起的http请求的方式
  •          选择post方式的时候,需要在输入文本框输入内容
  •          点击连接按钮发起请求
  •          发起请求后获得的响应会显示到响应文本框

2、设置一下服务器

        用nodejs实现的服务器逻辑,用PHP更方便。

  1. var _http = require('http');
  2. var _query = require('querystring');
  3. var server = _http.createServer(function (req, res) {
  4. res.writeHead(200, {"Content-Type": 'text/html;charset=utf-8'});
  5. let obj;
  6. //如果请求方式是POST
  7. if(req.method == "POST"){
  8. var buff = '';
  9. //监控响应内容
  10. req.on('data', (data) => {
  11. buff += data;
  12. });
  13. req.on('end', () => {
  14. obj = _query.parse(buff);
  15. var a = 'POST 方式的请求,请求内容:'+JSON.stringify(obj);
  16. //把 a 作为响应的数据返回给请求方。
  17. res.end(a);
  18. });
  19. }
  20. if(req.method == "GET"){
  21. //把url里的query字符串(a=abc&b=bbb)解析成对象obj
  22. obj = _query.parse(req.url);
  23. var a = 'GET 方式的请求,请求内容:'+JSON.stringify(obj);
  24. //把 a作为响应的数据返回给请求方。
  25. res.end(a);
  26. }
  27. //把 a 显示到命令行
  28. console.log(a);
  29. });
  30. //服务器端口设置为3001
  31. server.listen(3001, function () {
  32. console.log('服务器创建成功!port:3001');
  33. });

3、实现http GET请求

  1. //请求的http地址
  2. string url = "http://localhost:3001/qq?a=abc&b=bbb";
  3. //预备请求的资源
  4. HttpWebRequest request = null;
  5. HttpWebResponse response = null;
  6. StreamReader reader = null;
  7. string content = string.Empty;
  8. try
  9. {
  10. //实例化一个http请求
  11. request = (HttpWebRequest)WebRequest.Create(url);
  12. //设置请求头 请求方式method=get
  13. request.Method = "GET";
  14. //使request。getResponse()返回的一个响应对象
  15. response = (HttpWebResponse)request.GetResponse();
  16. //reader 读取响应流
  17. using (reader = new StreamReader(response.GetResponseStream()))
  18. {
  19. //意思是从头读到尾,全部读完
  20. content = reader.ReadToEnd();
  21. }
  22. }
  23. catch (System.Exception err)
  24. {
  25. Console.WriteLine("1.GET出现了错误!\n错误来源:" + err.Source + "错误信息:" + err.Message);
  26. }
  27. Console.WriteLine("响应:" + content);
  28. //为啥read大家都懂
  29. Console.Read();

        看一下效果:

输出符合预期,显然代码是可行。

4、接下来实现的是post请求

  1. //请求的http地址
  2. string url = "http://localhost:3001/qq?a=abc&b=bbb";
  3. //要发送的数据
  4. string msg = "method is post.";
  5. //预备请求的资源
  6. HttpWebRequest request = null;
  7. HttpWebResponse response = null;
  8. //post请求需要一个流把数据写进去
  9. Stream requestStream = null;
  10. StreamReader reader = null;
  11. //request所携带的数据是字节码,所以msg需要转化为byte[]数组才能读入
  12. var data = Encoding.UTF8.GetBytes(string.Format("a={0}&b={1}", "message", msg));
  13. string content = string.Empty;
  14. try
  15. {
  16. //实例化一个http请求
  17. request = (HttpWebRequest)WebRequest.Create(url);
  18. //设置请求头 请求方式method=post
  19. request.Method = "POST";
  20. //请求类型
  21. request.ContentType = "application/text";
  22. requestStream = request.GetRequestStream();
  23. requestStream.Write(data, 0, data.Length);
  24. response = (HttpWebResponse)request.GetResponse();
  25. //reader 读取响应流
  26. using (reader = new StreamReader(response.GetResponseStream()))
  27. {
  28. content = reader.ReadToEnd();
  29. }
  30. }
  31. catch (System.Exception err)
  32. {
  33. Console.WriteLine("1.POST出现了错误!\n错误来源:" + err.Source + "错误信息:" + err.Message);
  34. }
  35. Console.WriteLine("响应:" + content);
  36. Console.Read();

         输出:

5、封装成函数

       封装的函数已经可以直接使用了。

        首先是GET请求:

  1. /// <summary>
  2. /// GET方式发送得结果
  3. /// </summary>
  4. /// <param name="url">请求的url</param>
  5. /// <returns>服务器响应的数据</returns>
  6. public static string getHttpRequest(string url)
  7. {
  8. //预备请求的资源
  9. HttpWebRequest request = null;
  10. HttpWebResponse response = null;
  11. StreamReader reader = null;
  12. string content = string.Empty;
  13. try
  14. {
  15. request = (HttpWebRequest)WebRequest.Create(url);
  16. request.Method = "GET";
  17. response = (HttpWebResponse)request.GetResponse();
  18. using (reader = new StreamReader(response.GetResponseStream()))
  19. {
  20. content = reader.ReadToEnd();
  21. }
  22. }
  23. catch (System.Exception err)
  24. {
  25. MessageBox.Show("1.GET出现了错误!\n错误来源:" + err.Source + "\n错误信息:" + err.Message+"\n"+err);
  26. Console.WriteLine("1.GET出现了错误!\n错误来源:" + err.Source + "错误信息:" + err.Message);
  27. }
  28. //用完销毁
  29. response.Dispose();
  30. reader.Dispose();
  31. return content;
  32. }

        然后是POST方式:

  1. /// <summary>
  2. /// 发起一个http请求,方式为POST
  3. /// </summary>
  4. /// <param name="uri">发送请求的目标url</param>
  5. /// <param name="reMsg">要发送的消息</param>
  6. /// <returns>服务器响应的数据</returns>
  7. public string postHttpRequest(string uri, string msg)
  8. {
  9. //预备请求的资源
  10. HttpWebRequest request = null;
  11. HttpWebResponse response = null;
  12. Stream requestStream = null;
  13. StreamReader reader = null;
  14. var data = Encoding.UTF8.GetBytes(string.Format("a={0}&b={1}", "message", msg));
  15. string content = "";
  16. try
  17. {
  18. request = (HttpWebRequest)WebRequest.Create(uri);
  19. request.Method = "POST";
  20. requestStream = request.GetRequestStream();
  21. request.ContentType = "application/text";
  22. requestStream.Write(data, 0, data.Length);
  23. response = (HttpWebResponse)request.GetResponse();
  24. using (reader = new StreamReader(response.GetResponseStream()))
  25. {
  26. content = reader.ReadToEnd();
  27. }
  28. }
  29. catch (Exception err) {
  30. MessageBox.Show("1.POST出现了错误!\n错误来源:" + err.Source + "\n错误信息:" + err.Message + "\n" + err);
  31. Console.WriteLine("1.POST出现了错误!\n错误来源:" + err.Source + "错误信息:" + err.Message);
  32. }
  33. //资源用完回收
  34. requestStream.Dispose();
  35. response.Dispose();
  36. reader.Dispose();
  37. return content;
  38. }

       注意事项

        这里需要注意的是,封装后我加了几段销毁资源的代码。这个http请求方法我原本是用来进行一个课设项目的:本地程序 APP 监控一个温度感应器,每500毫秒就通过串口获取感应器的温度信息,然后通过http轮询把温度数据发送给服务器。

        但是在给老师演示的时候,演示的时间长了点,这个APP的后台内存占用五分钟飙升了600MB。

        后来看了一下微软的C#文档,原因是C#的垃圾回收机制 C#的垃圾回收机制 | 微软文档 ,用人能看懂的话描述就是:C#的垃圾回收器会不断遍历内存,查看哪些内存不再使用的,就打上标记,每隔一段时间回收一次被标记的内存

        但是在我发起的http请求中,我使用了reader读取响应流,却没有关闭它。让垃圾回收器以为这些资源还在使用,所以没有被回收造成了内存堆积。于是如果使用上面的方法进行http轮询,就需要手动回收内存。

6、在窗体程序中演示       

         GET方式:

        POST方式:

        下面是窗体程序的完整代码: 

  1. using System;
  2. using System.Text;
  3. using System.Windows.Forms;
  4. using System.IO;
  5. using System.Net;
  6. namespace CSharp_http
  7. {
  8. public partial class Form1 : Form
  9. {
  10. public Form1()
  11. {
  12. InitializeComponent();
  13. }
  14. private void btnConnec_Click(object sender, EventArgs e)
  15. {
  16. if (rabPOST.Checked && (txtSend.Text == "" || txtSend.Text == null))
  17. {
  18. MessageBox.Show("POST方式进行请求请输入信息");
  19. txtSend.Focus();
  20. }
  21. else {
  22. if (rabGET.Checked)
  23. {
  24. //如果是get请求方式
  25. txtRecive.Text = getHttpRequest(txtURL.Text.Trim());
  26. }
  27. else {
  28. //如果是post请求方式
  29. txtRecive.Text = postHttpRequest(txtURL.Text.Trim(),txtSend.Text);
  30. }
  31. }
  32. }
  33. /// <summary>
  34. /// GET方式发送得结果
  35. /// </summary>
  36. /// <param name="url">请求的url</param>
  37. /// <returns>服务器响应的数据</returns>
  38. public static string getHttpRequest(string url)
  39. {
  40. //预备请求的资源
  41. HttpWebRequest request = null;
  42. HttpWebResponse response = null;
  43. StreamReader reader = null;
  44. string content = string.Empty;
  45. try
  46. {
  47. request = (HttpWebRequest)WebRequest.Create(url);
  48. request.Method = "GET";
  49. //hwRequest.Timeout = 30000;
  50. //hwRequest.ContentType = "application/text";
  51. response = (HttpWebResponse)request.GetResponse();
  52. using (reader = new StreamReader(response.GetResponseStream()))
  53. {
  54. content = reader.ReadToEnd();
  55. }
  56. }
  57. catch (System.Exception err)
  58. {
  59. MessageBox.Show("1.GET出现了错误!\n错误来源:" + err.Source + "\n错误信息:" + err.Message+"\n"+err);
  60. Console.WriteLine("1.GET出现了错误!\n错误来源:" + err.Source + "错误信息:" + err.Message);
  61. }
  62. //用完销毁
  63. response.Dispose();
  64. reader.Dispose();
  65. return content;
  66. }
  67. /// <summary>
  68. /// 发起一个http请求,方式为POST
  69. /// </summary>
  70. /// <param name="uri">发送请求的目标url</param>
  71. /// <param name="reMsg">要发送的消息</param>
  72. /// <returns>服务器响应的数据</returns>
  73. public string postHttpRequest(string uri, string msg)
  74. {
  75. //预备请求的资源
  76. HttpWebRequest request = null;
  77. HttpWebResponse response = null;
  78. Stream requestStream = null;
  79. StreamReader reader = null;
  80. var data = Encoding.UTF8.GetBytes(string.Format("a={0}&b={1}", "message", msg));
  81. string content = "";
  82. try
  83. {
  84. request = (HttpWebRequest)WebRequest.Create(uri);
  85. request.Method = "POST";
  86. requestStream = request.GetRequestStream();
  87. request.ContentType = "application/text";
  88. requestStream.Write(data, 0, data.Length);
  89. response = (HttpWebResponse)request.GetResponse();
  90. using (reader = new StreamReader(response.GetResponseStream()))
  91. {
  92. content = reader.ReadToEnd();
  93. }
  94. }
  95. catch (Exception err) {
  96. MessageBox.Show("1.POST出现了错误!\n错误来源:" + err.Source + "\n错误信息:" + err.Message + "\n" + err);
  97. Console.WriteLine("1.POST出现了错误!\n错误来源:" + err.Source + "错误信息:" + err.Message);
  98. }
  99. //资源用完回收
  100. requestStream.Dispose();
  101. response.Dispose();
  102. reader.Dispose();
  103. return content;
  104. }
  105. }
  106. }

PS:整个窗体小程序的解决方案我打包上传了,有兴趣的可以下载来康康

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/259653
推荐阅读
相关标签
  

闽ICP备14008679号