如何以form-data类型调用API?请求发送后抛出格式无效异常
问题:form-data提交JSON格式数据时触发格式无效异常
我向API发送POST请求,要求以form-data类型提交,但收到响应后抛出异常:
值'{"Id":"1111111","Message":"something","Description":"something"}'的格式无效。
原代码
SendingRequestModel requestModel = new SendingRequestModel(); requestModel.Id = "1111111"; requestModel.Message = "something"; requestModel.Description= "something"; string message = JsonSerializer.Serialize(requestModel); var serviceSettings = appSettings.ServiceSettings; var options = new RestClientOptions(serviceSettings.ServiceUrl) { Authenticator = new HttpBasicAuthenticator("username", "password") }; var client = new RestClient(options); var request = new RestRequest() { Method = Method.Post, RequestFormat = DataFormat.Json }; request.AddParameter("Content-Type", "multipart/form-data", ParameterType.RequestBody); using (MultipartFormDataContent formDataContent = new MultipartFormDataContent()) { KeyValuePair<string, string>[] keyValuePairs = new[] { new KeyValuePair<string, string>("message", message), new KeyValuePair<string, string>("queue-name", "notification") }; foreach (var keyValuePair in keyValuePairs) { request.AddParameter(keyValuePair.Value, keyValuePair.Key); } } var response = await client.ExecuteAsync(request);
问题分析
- 参数顺序完全错误:
request.AddParameter的标准参数顺序是(字段名, 值),但代码里写反成了(值, 字段名),导致API收到的字段名和内容完全错位,无法识别JSON格式的message值。 - 错误设置请求格式:
RequestFormat = DataFormat.Json会强制RestSharp按JSON格式处理请求体,和form-data的提交需求冲突。 - 手动设置Content-Type冗余且错误:RestSharp处理form-data请求时会自动生成正确的
multipart/form-data请求头,手动添加反而会破坏请求结构。 - 冗余代码:实例化了
MultipartFormDataContent但未实际使用,属于无效代码。
修正后的代码
SendingRequestModel requestModel = new SendingRequestModel(); requestModel.Id = "1111111"; requestModel.Message = "something"; requestModel.Description= "something"; string message = JsonSerializer.Serialize(requestModel); var serviceSettings = appSettings.ServiceSettings; var options = new RestClientOptions(serviceSettings.ServiceUrl) { Authenticator = new HttpBasicAuthenticator("username", "password") }; var client = new RestClient(options); // 无需设置RequestFormat,RestSharp会自动处理form-data类型 var request = new RestRequest() { Method = Method.Post }; // 按正确顺序添加form-data字段:(字段名, 值) request.AddParameter("message", message); request.AddParameter("queue-name", "notification"); var response = await client.ExecuteAsync(request);
如果API要求message字段的JSON需明确标注媒体类型,可改用AddStringBody:
request.AddStringBody(message, "application/json"); request.AddParameter("queue-name", "notification");
请求相关截图

内容的提问来源于stack exchange,提问作者Celal Sunnetci
相关产品推荐
相关产品推荐

