java.lang.IllegalArgumentException: @Body parameters cannot be used with form or multi-part encoding

在学习Retrofit时遇到一个问题,报错说@Body参数不能与form或multi-part编码共用。原因在于误将@FormUrlEncoded与@Headers一起使用,但实际上并未使用到@FormUrlEncoded。解决方法是删除不需要的@FormUrlEncoded注解,修复后的代码成功运行。这是一个初学者在使用Retrofit时常见的问题和解决经验分享。

使用retrofit时报错IllegalArgumentException:@Body parameters cannot be used with form or multi-part encoding即Body参数不能与形式或多部分编码中使用

因为是才刚学习使用时,不知道@FormUrlEncoded不能跟@Headers一起使用,代码中其实也没有用到FormUrlEncoded,去掉就可以了,之后尝试,运行成功,这里在学习中,记录一下。

Java 中使用 `@DELETE` 注解的方法出现 `java.lang.IllegalArgumentException: Non-body HTTP method cannot contain @Body` 异常,是因为 HTTP 的 DELETE 方法按照标准通常不包含请求体,而 Retrofit 不允许在非支持请求体的 HTTP 方法(如 DELETE)中使用 `@Body` 注解[^1]。以下是几种解决该问题的方法: #### 1. 使用查询参数 将需要传递的参数作为查询参数拼接到 URL 后面。例如: ```java import retrofit2.Call; import retrofit2.http.DELETE; import retrofit2.http.Query; import rx.Observable; // 定义一个接口 public interface ApiService { @DELETE("/oss/del") Observable<ApiResponse> delUpload(@Query("fileName") String fileName); } ``` #### 2. 使用 POST 方法替代 DELETE 如果业务允许,可以将 DELETE 方法替换为 POST 方法,因为 POST 方法支持请求体。 ```java import retrofit2.Call; import retrofit2.http.Body; import retrofit2.http.POST; import rx.Observable; // 定义请求体类 class RequestBody { private String fileName; public RequestBody(String fileName) { this.fileName = fileName; } public String getFileName() { return fileName; } } // 定义一个接口 public interface ApiService { @POST("/oss/del") Observable<ApiResponse> delUpload(@Body RequestBody fileName); } ``` #### 3. 自定义拦截器模拟请求体 通过自定义拦截器,将参数添加到请求头或者其他合适的位置。以下是一个简单的自定义拦截器示例: ```java import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; public class CustomInterceptor implements Interceptor { private String fileName; public CustomInterceptor(String fileName) { this.fileName = fileName; } @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); Request.Builder requestBuilder = original.newBuilder() .header("X-FileName", fileName); Request request = requestBuilder.build(); return chain.proceed(request); } } ``` 然后在创建 Retrofit 实例时添加该拦截器: ```java import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(new CustomInterceptor("yourFileName")) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("yourBaseUrl") .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值