Xamarin Android使用Refit调用POST API报400 Bad Request求助
先给你揪出一个一眼就能看到的问题——你的create_request模型里有个拼写错误:DekiveryLocationLatitude应该是DeliveryLocationLatitude,少了个'l'!API肯定识别不了这个字段,这大概率是导致400错误的元凶之一。
接下来我们一步步排查其他可能的原因,帮你彻底解决问题:
1. 修正字段拼写错误,确保属性名和API要求完全匹配
先把那个拼写错误改过来:
request.DeliveryLocationLatitude = 2323; // 原来的Dekivery改成Delivery
另外,建议给模型属性加上JsonPropertyName特性,明确指定和API一致的字段名(比如API用驼峰命名的话),避免大小写或命名风格不匹配:
public class create_request { [JsonPropertyName("pickUpPhone")] public string PickUpPhone { get; set; } [JsonPropertyName("deliveryLocationLatitude")] public double DeliveryLocationLatitude { get; set; } // 其他所有属性都按这个方式配置,确保和API的字段名完全一致 }
2. 对比请求体结构,和Postman的请求内容对齐
Postman能正常请求,说明它的请求体结构是对的。你可以在代码里把要发送的对象序列化成JSON,和Postman的请求体对比:
// 先安装Newtonsoft.Json NuGet包 var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(request); // 用调试工具查看这个字符串,和Postman里的Raw请求体对比
重点检查嵌套对象(比如BroadcastType、Cargosize):有些API可能只需要ID字段,不需要Name,如果你的代码里传了多余字段,API可能会返回400。比如Postman里可能只传{"broadcastType": {"id":60}},那你可以只给ID赋值,去掉Name的设置,或者确认API是否接受多余字段。
3. 配置Refit使用正确的序列化器
Refit默认用System.Text.Json,但有些API是基于Newtonsoft.Json(Json.NET)开发的,两者的序列化规则可能有差异(比如日期格式、空值处理等)。你可以切换Refit使用Newtonsoft.Json:
- 安装
Refit.Newtonsoft.JsonNuGet包 - 创建Refit实例时指定序列化配置:
var refitSettings = new RefitSettings { ContentSerializer = new NewtonsoftJsonContentSerializer() }; requestAPI = RestService.For<RequestAPI>("http://courier-magconsulting.azurewebsites.net/api", refitSettings);
4. 捕获详细的API错误信息
400错误通常会返回具体的错误描述,比如“缺少XX字段”、“XX字段格式错误”。你可以捕获ApiException来获取这些细节,而不是只捕获通用的Exception:
catch (ApiException ex) { var errorDetails = await ex.GetContentAsStringAsync(); Toast.MakeText(this, $"错误:{ex.Message} | 详情:{errorDetails}", ToastLength.Long).Show(); }
这些细节能帮你快速定位到底哪个字段出了问题。
5. 检查请求头是否和Postman一致
Postman里可能设置了必要的请求头(比如Content-Type: application/json、Authorization令牌等),而你的代码里没添加。比如如果API需要授权,你可以在接口里添加头:
public interface RequestAPI { [Post("/request")] [Headers("Content-Type: application/json")] // 如果需要Token,添加Authorization头: // [Headers("Authorization: Bearer {yourToken}")] Task<create_request> submit([Body] create_request request); }
先从修正拼写错误开始,然后按上面的步骤逐一排查,应该就能解决问题了!
内容的提问来源于stack exchange,提问作者Rana

