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")
    };
    
}
View Code

 

 

关键差异总结

 
特性HttpWebRequest(你的代码)HttpClient + MultipartFormDataContent
Content-Disposition name="key"(有引号) 可能 name=key(无引号)
Boundary格式 boundary=xxx(无引号) 可能 boundary="xxx"(有引号)
换行符 明确 \r\n 内部实现可能不同
转义字符 直接字符串 可能进行额外转义
内容编码 UTF8 StreamWriter 依赖StringContent编码
posted @ 2026-01-09 08:55  ziff123  阅读(3)  评论(0)    收藏  举报