You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Retrofit中@Body注解结合token参数实现POST请求的问题

解决Retrofit POST请求同时传递JSON体与URL参数的问题

你遇到的报错是因为@Field注解必须配合@FormUrlEncoded使用,而你当前用@Body发送JSON格式的请求,两者不能混用。结合后端Spring Boot的写法(@RequestBody接收JSON体,@RequestParam接收URL参数),有以下两种可行方案:

方案一:使用@Query传递token(推荐)

直接把token作为URL查询参数传递,对应后端的@RequestParam,Retrofit中用@Query注解即可,和@Body可以共存。

修改后的Retrofit接口:

@POST("appointment/book")
Call<ApiResponse> bookAppointment(@Body AppointmentBookingDto appointmentBookingDto, @Query("token") String token);

这样请求会以POST appointment/book?token=xxx的形式发送,后端能正常解析JSON体和token参数,不需要修改后端代码。

方案二:将token合并到DTO中(需修改后端)

如果允许调整后端代码,可以把token字段添加到AppointmentBookingDto类中,后端改为从@RequestBody中获取token:

Android端修改

给AppointmentBookingDto添加token属性:

public class AppointmentBookingDto {
    // 原有字段
    private String xxx;
    // 新增token字段
    private String token;
    
    // getter、setter或构造方法
}

Retrofit接口简化为:

@POST("appointment/book")
Call<ApiResponse> bookAppointment(@Body AppointmentBookingDto appointmentBookingDto);

后端修改

把@RequestParam("token") String token改为从DTO中获取:

@PostMapping("/book")
public ResponseEntity<ApiResponse> bookAppointment(@RequestBody AppointmentBookingDto appointmentBookingDto) throws DataNotFoundException, ParseException, DataAlreadyExistException {
    String token = appointmentBookingDto.getToken();
    return appointmentBookingService.bookAppointment(appointmentBookingDto, token);
}

为什么之前的写法报错?

@Field是用于**表单提交(application/x-www-form-urlencoded)**的注解,必须在接口方法上添加@FormUrlEncoded才能使用。而你用@Body发送的是JSON格式(application/json)的请求,两种请求格式不能混合使用,因此触发了报错。

内容的提问来源于stack exchange,提问作者Ukeme Elijah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:25:23