C# 发送POST和GET请求

该文章提供了C#代码示例,详细展示了如何在后台发送POST和GET请求,包括处理JSON数据的POST请求,以及简单的错误处理和日志记录功能。

参考来源:C#后台发送POST和GET请求方法 | IT柚子

 命名空间

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using System.Web;

POST

/// <summary>
/// 后台发送POST请求
/// </summary>
/// <param name="url">服务器地址</param>
/// <param name="data">发送的数据</param>
/// <returns></returns>
public string HttpPost(string url, string data)
{
    try
    {
        //创建post请求
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "POST";
        request.ContentType = "application/json;charset=UTF-8";
        byte[] payload = Encoding.UTF8.GetBytes(data);
        request.ContentLength = payload.Length;

        //发送post的请求
        Stream writer = request.GetRequestStream();
        writer.Write(payload, 0, payload.Length);
        writer.Close();

        //接受返回来的数据
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream stream = response.GetResponseStream();
        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
        string value = reader.ReadToEnd();

        reader.Close();
        stream.Close();
        response.Close();

        return value;
    }
    catch (Exception)
    {
        return "";
    }
}

 上面这个复杂一点的json就不好处理了

推荐用这个


        private static string HttpPost1(string url, string json)
        {
            var request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/json;charset=UTF-8";
            byte[] byteData = Encoding.UTF8.GetBytes(json);
            int length = byteData.Length;
            request.ContentLength = length;
            Stream writer = request.GetRequestStream();
            writer.Write(byteData, 0, length);
            writer.Close();
            var response = (HttpWebResponse)request.GetResponse();
            var responseString = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd();
           // MessageBox.Show(responseString.ToString());
            return responseString.ToString();

        }

 get

  /// <summary>
  /// 后台发送GET请求
  /// </summary>
  /// <param name="url">服务器地址</param>
  /// <param name="data">发送的数据</param>
  /// <returns></returns>
  public string HttpGet(string url, string data)
  {
      try
      {
          //创建Get请求
          url = url + (data == "" ? "" : "?") + data;
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
          request.Method = "GET";
          request.ContentType = "text/html;charset=UTF-8";

          //接受返回来的数据
          HttpWebResponse response = (HttpWebResponse)request.GetResponse();
          Stream stream = response.GetResponseStream();
          StreamReader streamReader = new StreamReader(stream, Encoding.GetEncoding("utf-8"));
          string retString = streamReader.ReadToEnd();

          streamReader.Close();
          stream.Close();
          response.Close();

          return retString;
      }
      catch (Exception)
      {
          return "";
      }
  }

补充一个log调试


        public void Log(params Object[] message)
        {
            string str = string.Empty;
            if (message == null || message.Length == 0)
            {
                str = "null";
            }
            else
            {
                for (int i = 0; i < message.Length; i++)
                {
                    if (str.Length > 0)
                    {
                        str += " ";
                    }
                    str += message[i];
                }
            }
            Console.WriteLine(str);
            // 写入到log日志文件
            StreamWriter sw = new StreamWriter(@"test.log", true, Encoding.UTF8);
            sw.WriteLine(str);
            sw.Close();
        }

<think>嗯,用户这次的需求很明确,就是要用C#实现HTTP的GETPOST请求。从引用内容看,用户已经提供了三份参考代码,但需要我整理出清晰易用的方法。 用户可能是个C#开发者,正在处理需要调用API的网络编程任务。考虑到用户直接贴了代码引用,应该是想要具体可运行的示例,而不是理论说明。需要特别注意以下几点: 1 基础方法要完整(异常处理、编码设置) 2 提供调用示例方便用户测试 3 补充关键注意事项 关于引用内容,注意到三个特点: 1 引用1是概念性说明,实际价值有限 2 引用2的GET方法存在缺陷(未释放response对象) 3 引用3的POST方法较完整但缺少GET方法 所以准备这样组织回复: 先用表格对比两种请求的核心差异,让用户建立基础认知。然后分别给出强化版的代码实现:GET部分要修复资源释放问题,POST部分基于引用3优化JSON处理。最后补充实用建议时重点强调异常处理异步方法的选择标准。 用户没有指定.NET版本,默认使用最通用的同步方法。但考虑实际应用场景时需要提示异步方案的存在。另外观察到引用代码都使用HttpWebRequest类,这符合传统.NET开发习惯,暂时不需要引入新的HttpClient方案增加复杂度。 </think>以下是C#实现GETPOST请求的**完整解决方案**,基于引用内容工业实践优化,包含关键细节注意事项: --- ### 一、GET请求实现(带异常处理) ```csharp public static string SendGetRequest(string url, int timeout = 10000) { try { var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.ContentType = "application/json"; // 推荐JSON格式 request.Timeout = timeout; request.UserAgent = "Mozilla/5.0"; // 避免某些服务器拦截 using (var response = (HttpWebResponse)request.GetResponse()) using (var stream = response.GetResponseStream()) using (var reader = new StreamReader(stream, Encoding.UTF8)) { return reader.ReadToEnd(); } } catch (WebException ex) // 关键异常捕获 { using (var errorResponse = (HttpWebResponse)ex.Response) using (var errorStream = errorResponse.GetResponseStream()) { var errorText = new StreamReader(errorStream).ReadToEnd(); throw new Exception($"HTTP Error {(int)errorResponse.StatusCode}: {errorText}"); } } } ``` --- ### 二、POST请求实现(支持JSON/FormData) #### 1. JSON格式传输 ```csharp public static string SendJsonPost(string url, object data, int timeout = 10000) { var json = JsonConvert.SerializeObject(data); // 使用Newtonsoft.Json var payload = Encoding.UTF8.GetBytes(json); var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/json"; request.ContentLength = payload.Length; request.Timeout = timeout; using (var stream = request.GetRequestStream()) { stream.Write(payload, 0, payload.Length); } using (var response = (HttpWebResponse)request.GetResponse()) using (var reader = new StreamReader(response.GetResponseStream())) { return reader.ReadToEnd(); } } ``` #### 2. FormData格式传输 ```csharp public static string SendFormPost(string url, Dictionary<string, string> formData) { var postString = string.Join("&", formData.Select(kv => $"{kv.Key}={Uri.EscapeDataString(kv.Value)}")); var payload = Encoding.UTF8.GetBytes(postString); var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = payload.Length; // 发送代码同上... } ``` --- ### 三、关键注意事项 1. **资源释放**:务必使用 `using` 语句包裹 `Stream` `WebResponse` 对象,避免内存泄漏 2. **超时设置**:生产环境建议 `timeout` 设为10-30秒(默认10秒) 3. **异常处理**:需区分网络错误(`WebException`)服务器返回的错误状态码 4. **性能优化**:高频请求场景推荐使用 `HttpClient`(.NET Core+)替代 `HttpWebRequest` --- ### 四、调用示例 ```csharp // GET请求 var resultGet = SendGetRequest("https://api.example.com/data?id=123"); // POST请求 (JSON) var resultPost = SendJsonPost("https://api.example.com/submit", new { User = "test", Value = 42 }); // POST请求 (Form) var resultForm = SendFormPost("https://api.example.com/login", new Dictionary<string, string> { ["username"] = "admin", ["password"] = "pass123" }); ``` > **工业实践建议**: > 现代.NET开发中,优先使用 `HttpClient`(支持异步/连接池): > ```csharp > using var client = new HttpClient(); > var response = await client.GetAsync("https://api.example.com"); > var content = await response.Content.ReadAsStringAsync(); > ``` --- ### 相关问题 1. 如何在C#中处理HTTPS证书验证问题? 2. 使用`HttpClient`时如何避免Socket端口耗尽? 3. 如何用C#实现文件上传的Multipart/form-data请求? 4. .NET Core中的IHttpClientFactory有什么优势? [^1]: HTTP协议中GET/POST方法的本质区别 [^2]: `HttpWebRequest`类的官方文档规范 [^3]: 微软异步编程最佳实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wenlong Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值