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
相关产品推荐
相关产品推荐

