使用Retrofit2向AspNet Core6传PNG图片时出现400错误求助
以下是针对该错误的常见排查方向及解决方法:
DTO字段与命名不匹配
Android端和服务器端的UploadDTO字段名称、类型必须严格一致(AspNet Core默认区分大小写,除非额外配置)。
示例:
Android端DTO(Java):public class UploadDTO { @SerializedName("FileName") // 若服务器用 PascalCase,需显式指定 private String fileName; @SerializedName("Image") private RequestBody image; // Getter/Setter 方法 }服务器端DTO(C#):
public class UploadDTO { public string FileName { get; set; } public IFormFile Image { get; set; } }注意:如果Android使用Gson序列化,若服务器采用小写驼峰命名,需确保DTO字段名一致,或通过
@SerializedName映射;AspNet Core可通过配置JsonOptions统一命名规则,或用[JsonPropertyName]标注字段。请求Content-Type与注解错误
Retrofit上传文件必须使用multipart/form-data格式,接口定义需正确标注:@Multipart @POST("api/upload") Call<ResponseBody> uploadImage(@Part MultipartBody.Part image, @Part("FileName") RequestBody fileName);服务器端Action必须添加
[FromForm]注解,以接收表单格式的multipart数据:[HttpPost("api/upload")] public IActionResult Upload([FromForm] UploadDTO dto) { // 业务逻辑 }错误场景:Retrofit用
@Body代替@Multipart,或服务器未加[FromForm],都会直接返回400。文件参数名不匹配
Retrofit中@Part的名称必须与服务器DTO中IFormFile字段名完全一致。比如服务器字段为Image,Retrofit构造请求时需指定对应名称:RequestBody imageBody = RequestBody.create(MediaType.parse("image/png"), file); MultipartBody.Part imagePart = MultipartBody.Part.createFormData("Image", file.getName(), imageBody);PNG文件有效性与大小限制
- 检查上传的PNG文件是否损坏,无效格式会导致服务器解析失败。
- AspNet Core默认限制请求大小,若文件超出阈值会返回400。可在
Program.cs中调整限制:builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 10 * 1024 * 1024; // 设置为10MB });
服务器端模型验证失败
若UploadDTO添加了数据验证注解(如[Required]),Android端未传递必填参数会触发400。示例:public class UploadDTO { [Required(ErrorMessage = "文件名不能为空")] public string FileName { get; set; } [Required] public IFormFile Image { get; set; } }可通过查看服务器日志获取具体验证失败信息,确保Android端传递所有必填参数。
Retrofit请求体构造错误
确保文件RequestBody的MediaType设置为image/png,避免因类型不匹配被服务器拒绝:RequestBody imageBody = RequestBody.create(MediaType.parse("image/png"), file);
内容的提问来源于stack exchange,提问作者Владислав Мельник

