如何使用HttpWebRequest同时发送JSON请求体与文件至API?
如何在C#中通过multipart/form-data同时发送JSON请求体和文件?
你的问题核心是要正确构建multipart/form-data格式的请求——这种格式需要用指定的边界分隔不同的内容块(JSON和文件),而不是直接把JSON写入流就完事。我帮你修改代码,实现同时发送JSON请求体和指定路径的文件:
修改后的完整代码
using System; using System.IO; using System.Text; class Program { static void Main() { const string WEBSERVICE_URL = "https://myurl.com"; const string boundary = "12345678912345678912345678"; var webRequest = System.Net.WebRequest.Create(WEBSERVICE_URL); webRequest.Method = "POST"; webRequest.ContentType = $"multipart/form-data; boundary={boundary}"; webRequest.Headers.Add("Authorization:7786FFFGFDDDP"); // 1. 准备JSON内容 string json = "{\"some json\":\"here\"}"; byte[] jsonBytes = Encoding.UTF8.GetBytes(json); // 2. 准备文件内容 string filePath = @"c:\myFile.txt"; byte[] fileBytes = File.ReadAllBytes(filePath); string fileName = Path.GetFileName(filePath); using (var requestStream = webRequest.GetRequestStream()) using (var writer = new BinaryWriter(requestStream)) { // 写入JSON部分 writer.Write(Encoding.UTF8.GetBytes($"--{boundary}\r\n")); writer.Write(Encoding.UTF8.GetBytes("Content-Disposition: form-data; name=\"body\"\r\n")); writer.Write(Encoding.UTF8.GetBytes("Content-Type: application/json\r\n\r\n")); writer.Write(jsonBytes); writer.Write(Encoding.UTF8.GetBytes("\r\n")); // 写入文件部分 writer.Write(Encoding.UTF8.GetBytes($"--{boundary}\r\n")); writer.Write(Encoding.UTF8.GetBytes($"Content-Disposition: form-data; name=\"file\"; filename=\"{fileName}\"\r\n")); writer.Write(Encoding.UTF8.GetBytes("Content-Type: text/plain\r\n\r\n")); // 根据文件类型调整Content-Type writer.Write(fileBytes); writer.Write(Encoding.UTF8.GetBytes("\r\n")); // 写入结束边界 writer.Write(Encoding.UTF8.GetBytes($"--{boundary}--\r\n")); } try { var httpResponse = (System.Net.HttpWebResponse)webRequest.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var result = streamReader.ReadToEnd(); Console.WriteLine(result.ToString()); } } catch (System.Net.WebException ex) { // 处理请求异常,比如获取错误响应内容 using (var errorStream = new StreamReader(ex.Response.GetResponseStream())) { Console.WriteLine("请求错误:" + errorStream.ReadToEnd()); } } } }
关键修改点说明
- 边界一致性:确保
ContentType中的边界和代码中使用的边界字符串完全一致,这是multipart格式被服务端正确识别的核心。 - 内容块结构:每个内容块(JSON和文件)都需要以
--{boundary}开头,然后是Content-Disposition头(指定参数名,文件还要附加文件名),接着是Content-Type头,空一行后才是内容本身。 - 字节流写入:改用
BinaryWriter直接写入字节数组,避免StreamWriter的编码自动转换可能带来的格式问题,确保请求内容完全符合规范。 - 异常处理:增加了
WebException捕获逻辑,方便调试请求失败的场景,能直接获取服务端返回的错误信息。 - Content-Type适配:文件部分的
Content-Type可以根据实际文件类型调整,比如图片用image/jpeg、Excel用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,这里用text/plain适配txt文件。
内容的提问来源于stack exchange,提问作者user9256499




