为何使用Android Studio结合Retrofit/Volley时所有请求均以GET方式发送?
排查所有请求被强制转为GET的问题
Retrofit 部分排查
- 核对接口方法的注解:确保用了正确的HTTP方法注解,比如
@POST、@PUT、@DELETE,不要误写为@GET。比如正确的POST接口定义应该是:
另外注意如果用表单提交,需要搭配@POST("/api/user") Call<User> createUser(@Body User user);@FormUrlEncoded和@Field,不要错用@Query(@Query会把参数拼在URL上,但不改变请求方法,不过如果注解本身写错就会出问题)。 - 检查OkHttp拦截器:如果给Retrofit配置了自定义OkHttp拦截器,确认拦截器里没有修改请求方法的逻辑,比如不要出现类似
request.newBuilder().method("GET", null).build()的代码。 - 验证Retrofit客户端构建:确保没有通过转换器或其他配置篡改请求方法,比如某些第三方转换器可能存在bug导致方法被修改。
Volley 部分排查
- 检查请求对象的方法参数:创建
StringRequest或自定义Request时,第二个参数是请求方法,要明确指定Request.Method.POST/PUT等,不要默认用GET(默认构造器如果只传URL和Listener,默认是GET)。比如:StringRequest postRequest = new StringRequest(Request.Method.POST, url, responseListener, errorListener) { // ... 重写getParams()或getBody() }; - 检查自定义Request的
getMethod()重写:如果继承了Request类自定义请求,确保重写的getMethod()返回的是正确的方法常量,不要硬返回Request.Method.GET。 - 确认参数传递:POST请求需要重写
getParams()(表单提交)或getBody()(JSON提交),如果没有设置任何请求体/参数,部分服务器可能会将请求转为GET,但Volley本身不会主动改方法,所以先确认代码里有没有正确实现参数逻辑。
通用排查步骤
- 抓包验证实际请求:用Charles、Fiddler或Android Studio的Network Inspector抓包,确认请求的实际方法是GET还是客户端代码里指定的方法。如果抓包显示确实是GET,那问题出在客户端代码;如果抓包显示是正确的方法但服务器返回GET的结果,那要排查服务器端的配置。
- 检查服务器端跳转:有些服务器会对POST请求做301/302跳转,而跳转后的请求默认会变成GET,这种情况需要服务器端调整跳转逻辑,或者客户端处理跳转时保留原请求方法。
内容的提问来源于stack exchange,提问作者Carlos Cárdenas
相关产品推荐
相关产品推荐

