C# https post formdata调用接口

使用C#进行HTTPS请求及身份验证的实战示例
该代码示例展示了如何使用C#进行HTTPS POST请求,包括设置自定义的UserAgent、处理SSL证书验证、Base64编码认证信息以及构造form-data请求体。同时,它还演示了从配置文件读取数据并获取AccessToken的过程。

using Newtonsoft.Json.Linq;

using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using Newtonsoft.Json;
using System.IO;
using System.Net;
  private static readonly string DefaultUserAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36";
 private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        }
``

 public static string Base64Encode(Encoding encodeType, string source)
        {
            string encode = string.Empty;
            byte[] bytes = encodeType.GetBytes(source);
            try
            {
                encode = Convert.ToBase64String(bytes);
            }
            catch
            {
                encode = source;
            }
            return encode;
        }`
 public static string GetFormdata(Dictionary<string, string> dic, string ticks)
        {
            string Info = "";
            string Head = string.Format("----------------------------{0}", ticks);
            string Foot = string.Format("----------------------------{0}--", ticks);
            foreach (var item in dic)
            {
                Info += string.Format("{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n", Head, item.Key, item.Value);
            }
            Info += Foot;
            return Info;
        }

  #region formdata格式获取AccessToken
        public static string PostAccessTokenByHttps()
        {
            try
            {
                string jsonlist = "";
                string access_token = "";
                string Ticks = DateTime.Now.Ticks.ToString();
                //从配置文件获取固定数据
                string comid = System.Configuration.ConfigurationManager.AppSettings["HLYCompanyID"];
                string comkey = System.Configuration.ConfigurationManager.AppSettings["HLYCompanyKey"];
                string url = System.Configuration.ConfigurationManager.AppSettings["HLYJKTokenURL"];
                HttpWebRequest request = null;
                CookieContainer cookie = new CookieContainer();
                //HTTPSQ请求
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                request = WebRequest.Create(url) as HttpWebRequest;
                request.CookieContainer = cookie;
                request.ProtocolVersion = HttpVersion.Version11;
                request.Method = "POST";
                //request.ContentType = "application/x-www-form-urlencoded";
                //request.ContentType = "application/json;charset=UTF-8";
                request.ContentType = string.Format("multipart/form-data; boundary=--------------------------{0}", Ticks);
                request.UserAgent = DefaultUserAgent;
                request.KeepAlive = true;
                string source = comid + ':' + comkey;
                **//注意Basic后面有空格**
                string Authorization = "Basic " + Base64Encode(Encoding.UTF8, source);
                request.Headers["Authorization"] = Authorization;
                //  request.Timeout = 300000;
                //request.Headers["Cookie"] = "username=aaaaaa; Language=zh_CN";
                //如果需要POST数据   
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add("grant_type", "client_credentials");
                dic.Add("scope", "write");
                //StringBuilder builder = new StringBuilder();
                //int i = 0;
                //foreach (var item in dic)
                //{
                //    if (i > 0)
                //        builder.Append("&");
                //    builder.AppendFormat("{0}={1}", item.Key, item.Value);
                //    i++;
                //}

                string Paramter = GetFormdata(dic, Ticks);
                byte[] byteData = Encoding.UTF8.GetBytes(Paramter);
                int length = byteData.Length;
                request.ContentLength = length;
                 ServicePointManager.Expect100Continue = false; //2022-12-05调接口时突然报500错误,加了这句就可以了。
                //证书,要求.net framework 4.5.1及以上
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11;
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(byteData, 0, byteData.Length);
                }
                var response = (HttpWebResponse)request.GetResponse();
                using (StreamReader st = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
                {
                    jsonlist = st.ReadToEnd().ToString();
                    // return st.ReadToEnd().ToString();
                    JObject jo = (JObject)JsonConvert.DeserializeObject(jsonlist);
                    access_token = jo["access_token"].ToString();
                }
                return access_token;
            }
            catch (Exception ex)
            {
                string err = ex.Message;
                return string.Empty;
            }
        }
        #endregion
C#调用 POST 接口通常使用 `HttpClient` 类(.NET Core/5+)或 `HttpWebRequest`(旧版 .NET Framework)。以下是两种常见实现方式: --- ### **方法1:使用 `HttpClient`(推荐,.NET Core/5+)** ```csharp using System; using System.Net.Http; using System.Text; using System.Text.Json; // 或 Newtonsoft.Json using System.Threading.Tasks; public class ApiClient { private static readonly HttpClient _httpClient = new HttpClient(); public async Task<string> PostDataAsync(string url, object data) { try { // 序列化请求数据为JSON string jsonData = JsonSerializer.Serialize(data); var content = new StringContent(jsonData, Encoding.UTF8, "application/json"); // 发送POST请求 HttpResponseMessage response = await _httpClient.PostAsync(url, content); // 确保响应成功,否则抛出异常 response.EnsureSuccessStatusCode(); // 读取响应内容 string responseBody = await response.Content.ReadAsStringAsync(); return responseBody; } catch (HttpRequestException ex) { Console.WriteLine($"请求错误: {ex.Message}"); throw; } } } // 调用示例 var apiClient = new ApiClient(); var requestData = new { Name = "John", Age = 30 }; string result = await apiClient.PostDataAsync("https://api.example.com/data", requestData); Console.WriteLine(result); ``` #### **关键点说明** 1. **`HttpClient` 实例**:建议全局复用(避免频繁创建/销毁)。 2. **JSON 序列化**:使用 `System.Text.Json`(.NET Core 3.0+)或 `Newtonsoft.Json`。 3. **异步调用**:使用 `async/await` 避免阻塞。 4. **异常处理**:捕获 `HttpRequestException` 处理网络错误。 --- ### **方法2:使用 `HttpWebRequest`(旧版 .NET Framework)** ```csharp using System; using System.IO; using System.Net; using System.Text; using System.Web.Script.Serialization; // 用于JSON序列化 public class LegacyApiClient { public string PostData(string url, object data) { try { // 序列化请求数据 var serializer = new JavaScriptSerializer(); string jsonData = serializer.Serialize(data); // 创建请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/json"; // 写入请求体 using (var streamWriter = new StreamWriter(request.GetRequestStream())) { streamWriter.Write(jsonData); } // 获取响应 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (var streamReader = new StreamReader(response.GetResponseStream())) { return streamReader.ReadToEnd(); } } catch (WebException ex) { Console.WriteLine($"请求错误: {ex.Message}"); throw; } } } // 调用示例 var legacyClient = new LegacyApiClient(); var requestData = new { Name = "John", Age = 30 }; string result = legacyClient.PostData("https://api.example.com/data", requestData); Console.WriteLine(result); ``` #### **注意事项** 1. **同步调用**:`HttpWebRequest` 是同步的,可能阻塞线程。 2. **JSON 序列化**:旧版需用 `JavaScriptSerializer` 或 `Newtonsoft.Json`。 3. **资源释放**:确保用 `using` 释放 `Stream` 和 `Response` 对象。 --- ### **进阶优化** 1. **添加请求头**: ```csharp _httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer token123"); ``` 2. **处理超时**: ```csharp _httpClient.Timeout = TimeSpan.FromSeconds(30); ``` 3. **上传表单数据**(非JSON): ```csharp var formData = new MultipartFormDataContent { { new StringContent("value"), "key" } }; await _httpClient.PostAsync(url, formData); ``` --- ### **常见问题** 1. **Q**: 如何发送 `x-www-form-urlencoded` 数据? **A**: 使用 `FormUrlEncodedContent`: ```csharp var formData = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("key1", "value1"), new KeyValuePair<string, string>("key2", "value2") }); ``` 2. **Q**: 如何处理 HTTPS 证书错误? **A**: 开发环境可忽略证书验证(生产环境禁用!): ```csharp var handler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true }; var client = new HttpClient(handler); ``` 3. **Q**: 如何上传文件? **A**: 使用 `MultipartFormDataContent`: ```csharp var fileContent = new ByteArrayContent(File.ReadAllBytes("file.txt")); fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data"); var formData = new MultipartFormDataContent { { fileContent, "file", "file.txt" } }; ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值