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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:05:49