RestSharp v107+无法添加同时指定参数名与内容类型的参数
解决方案:在Multipart Form-Data中添加指定名称的JSON参数
针对你遇到的RestSharp无法同时设置JSON参数名和Content-Type的问题,这里提供两种可行方案:
方案一:使用RestSharp手动序列化并添加参数
RestSharp的AddJsonBody和AddBody在Multipart场景下会固定参数名为application/json,直接用AddParameter默认Content-Type是text/plain,所以需要手动序列化JSON对象,再指定参数名和正确的Content-Type:
var request = new RestRequest(url, Method.Post); request.AddHeader("Host", _connectionDetails._HostUrl); request.AlwaysMultipartFormData = true; // 处理文件参数(优化文件MIME类型为对应格式) byte[] bytes = System.IO.File.ReadAllBytes(@"C:\Temp\test.xlsx"); request.AddFile("binary", bytes, "test.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // 手动序列化JSON对象为字符串 var jsonContent = Newtonsoft.Json.JsonConvert.SerializeObject(fileDetailsDataObject); // 添加名为"data"的JSON参数,指定Content-Type为application/json request.AddParameter("data", jsonContent, "application/json", ParameterType.RequestBody);
说明
- 手动序列化让我们能完全控制参数内容,通过
AddParameter的重载指定"application/json"作为MediaType,生成的form-data部分会同时拥有正确的name="data"和Content-Type: application/json。 - 若项目未引用Newtonsoft.Json,可改用.NET自带的
System.Text.Json.JsonSerializer完成序列化。
方案二:切换到HttpClient实现
如果RestSharp的处理方式过于繁琐,使用.NET原生HttpClient能更直观地构建符合要求的Multipart请求:
using System.Net.Http; using System.Net.Http.Headers; using System.Text; using Newtonsoft.Json; // 初始化HttpClient using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Host", _connectionDetails._HostUrl); // 构建Multipart表单内容 using var formContent = new MultipartFormDataContent(); // 添加文件参数 byte[] fileBytes = System.IO.File.ReadAllBytes(@"C:\Temp\test.xlsx"); var fileByteArrayContent = new ByteArrayContent(fileBytes); fileByteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); formContent.Add(fileByteArrayContent, "binary", "test.xlsx"); // 添加名为"data"的JSON参数 var jsonString = JsonConvert.SerializeObject(fileDetailsDataObject); var jsonStringContent = new StringContent(jsonString, Encoding.UTF8, "application/json"); formContent.Add(jsonStringContent, "data"); // 发送请求 var response = await client.PostAsync(url, formContent); response.EnsureSuccessStatusCode(); // 确保请求执行成功
说明
HttpClient的MultipartFormDataContent可灵活添加任意类型的表单项,每个项都能独立设置名称、内容和Content-Type,完全匹配API的参数要求。
内容的提问来源于stack exchange,提问作者Matthew Hart
相关产品推荐
相关产品推荐

