Android应用使用Retrofit发起@PUT请求无响应问题求助
解决Retrofit PUT请求无响应的问题
针对你遇到的Retrofit PUT请求无响应(GET正常、Postman测试通过)的情况,按以下步骤排查修复:
1. 补全Callback的日志输出
你当前的onResponse只打印成功场景,onFailure完全为空,这导致你无法获取任何错误信息。先把所有情况的日志补全:
userRestService.getInstance().putUser("25yw345iHNbq8rmO8VOKhkKqv9M2", "Teste") .enqueue(new Callback<MessageResponse>() { @Override public void onResponse(Call<MessageResponse> call, Response<MessageResponse> response) { // 打印完整响应信息,不管成功失败 logger.info("PUT请求响应码: " + response.code()); logger.info("请求是否成功: " + response.isSuccessful()); if (!response.isSuccessful()) { try { if (response.errorBody() != null) { logger.info("错误响应体: " + response.errorBody().string()); } } catch (IOException e) { e.printStackTrace(); } } else { if (response.body() != null) { logger.info("Webservice is working: " + response.body().getMessage()); } } } @Override public void onFailure(Call<MessageResponse> call, Throwable t) { // 打印失败原因,包括异常信息和请求详情 logger.error("PUT请求失败: ", t); logger.error("请求URL: " + call.request().url()); logger.error("请求Headers: " + call.request().headers()); } });
2. 添加OkHttp日志拦截器,查看完整请求/响应细节
通过拦截器可以对比Postman的请求,确认Android端发送的请求是否和Postman一致(比如Header、参数、请求体格式):
首先添加Gradle依赖:
implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'
然后修改Retrofit初始化代码,添加拦截器:
if (INSTANCE == null) { // 创建日志拦截器,设置日志级别为BODY(打印完整请求响应) HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { @Override public void log(String message) { logger.info("OkHttp日志: " + message); } }); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://MyIP:3000/") .client(okHttpClient) // 添加自定义OkHttpClient .addConverterFactory(MoshiConverterFactory.create()) .build(); INSTANCE = retrofit.create(userRestServiceInterface.class); logger.info("Calling the Rest: " + INSTANCE); } return INSTANCE;
添加后可以看到完整的请求URL、Headers、请求体,以及响应的Headers、响应体,和Postman的请求对比,就能发现差异(比如Content-Type是否正确、参数是否遗漏)。
3. 检查接口定义与请求格式是否匹配
你的服务采用x-www-form-urlencoded格式,当前接口的@FormUrlEncoded和@Field是正确的,但需要确认:
- 后端PUT接口是否接受
x-www-form-urlencoded格式的请求体(Postman测试时要和Android端用相同的格式) - 路径变量
{xifirebaseid}是否正确替换,查看日志拦截器输出的请求URL即可确认
4. 检查实体类与后端响应的匹配度
确认MessageResponse类的字段和后端返回的JSON结构一致,比如后端返回的是{"message": "success"},那么实体类应该是:
public class MessageResponse { @Json(name = "message") // 如果字段名和JSON键不一致,需要用@Json注解映射 private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
如果字段不匹配,Moshi解析失败可能导致异常,但通常会进入onFailure或onResponse的非成功分支,补全日志后就能发现。
5. 确认网络权限
虽然GET请求正常,但还是检查AndroidManifest.xml中是否添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
按以上步骤排查后,基本能定位到PUT请求无响应的原因,比如请求格式不匹配、参数错误、后端返回解析失败等。
内容的提问来源于stack exchange,提问作者Nuno Correia
相关产品推荐
相关产品推荐

