C# 调POST 传form-data数据方法
1、采用HttpClient + MultipartFormDataContent 一直调不通,后面采用更原始的HttpWebRequest可以调通
代码:
/// <summary> /// 接口调用--form表单提交 /// </summary> /// <param name="url">接口地址,包含url参数</param> /// <param name="headerMap">请求头</param> /// <param name="formParams">form表单参数</param> /// <returns>返回响应内容,失败时返回 null</returns> public static async Task<HttpResponseMessage> InvokeFormApi(string url, Dictionary<string, string> headerMap, Dictionary<string, object> formParams) { var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.Timeout = 30000; // 生成boundary var boundary = $"------------------------{DateTime.Now.Ticks:x}"; request.ContentType = $"multipart/form-data; boundary={boundary}"; // 设置headers if (headerMap != null) { foreach (var header in headerMap) { if (header.Key.Equals("Content-Type", StringComparison.OrdinalIgnoreCase)) continue; request.Headers[header.Key] = header.Value; } } // 构建form-data内容 using (var requestStream = await request.GetRequestStreamAsync()) using (var writer = new StreamWriter(requestStream, Encoding.UTF8)) { if (formParams != null) { foreach (var param in formParams) { await writer.WriteAsync($"--{boundary}\r\n"); await writer.WriteAsync($"Content-Disposition: form-data; name=\"{param.Key}\"\r\n\r\n"); await writer.WriteAsync($"{param.Value}\r\n"); } } await writer.WriteAsync($"--{boundary}--\r\n"); await writer.FlushAsync(); } // 获取响应 var response = (HttpWebResponse)await request.GetResponseAsync(); var responseStream = response.GetResponseStream(); var reader = new StreamReader(responseStream, Encoding.UTF8); var responseText = await reader.ReadToEndAsync(); return new HttpResponseMessage(response.StatusCode) { Content = new StringContent(responseText, Encoding.UTF8, "application/json") }; }
关键差异总结
| 特性 | HttpWebRequest(你的代码) | HttpClient + MultipartFormDataContent |
|---|---|---|
| Content-Disposition | name="key"(有引号) |
可能 name=key(无引号) |
| Boundary格式 | boundary=xxx(无引号) |
可能 boundary="xxx"(有引号) |
| 换行符 | 明确 \r\n |
内部实现可能不同 |
| 转义字符 | 直接字符串 | 可能进行额外转义 |
| 内容编码 | UTF8 StreamWriter | 依赖StringContent编码 |

浙公网安备 33010602011771号