首页 > 解决方案 > 如果响应与 post 类不同,我如何从 post 请求中获得响应

问题描述

我正在使用改造通过 api 将登录详细信息传递给我的服务器。api 的发布请求只接受电子邮件和密码,但响应返回的 Json 格式与 POJO 类包含的不同。如何处理 api 响应?

我尝试将响应作为 JSONObject 返回以帮助从 api 获取 Json,但它不起作用。API 返回一个包含用户名和登录令牌的成功 json。

    Call<LoginPost> call = apiLink.loginUser(useremail, userpassword);

    call.enqueue(new Callback<LoginPost>() {
        @Override
        public void onResponse(Call<LoginPost> call, Response<LoginPost> response) {
            if(!response.isSuccessful()){
                String code = Integer.toString(response.code());
                Toast.makeText(LoginPage.this, code, Toast.LENGTH_LONG).show();
            }
            else {
             LoginPost postResponse = response.body();

             Log.e("viewResponse", 
                   postResponse.getSuccessResponse().toString());

               return;
            }
        }

        @Override
        public void onFailure(Call<LoginPost> call, Throwable t) {
            Log.e("error in createNewUser",  t.getMessage());
        }
    });

帖子类:

@SerializedName("email")
String userEmail;


@SerializedName("password")
String userPassword;

public JSONObject getSuccessResponse() {
    return successResponse;
}

@SerializedName("success")
JSONObject successResponse;


public String getUserEmail() {
    return userEmail;
}


public String getUserPassword() {
    return userPassword;
}

标签: javaandroidapiretrofit2

解决方案


在进行 Retrofit 调用时,不应将 POJO 类用于 Request,而应使用与 Response 匹配的 POJO 类。因为这只是使用参数进行调用,所以您可能甚至不需要 Request 对象,但拥有一个并没有什么坏处。

您的代码将如下所示:

Call<LoginResponse> call = apiLink.loginUser(useremail, userpassword);

call.enqueue(new Callback<LoginResponse>() {
    @Override
    public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
        if(!response.isSuccessful()){
            String code = Integer.toString(response.code());
            Toast.makeText(LoginPage.this, code, Toast.LENGTH_LONG).show();
        }
        else {
         LoginResponse postResponse = response.body();

         Log.e("viewResponse", 
               postResponse.getSuccessResponse().toString());

           return;
        }
    }

    @Override
    public void onFailure(Call<LoginResponse> call, Throwable t) {
        Log.e("error in createNewUser",  t.getMessage());
    }
});

为了进一步解释发生了什么,当您创建参数化调用时,您是在告诉 Retrofit 使用哪个对象来解析响应,(如果您想使用一个对象作为发布正文数据,您需要以不同的方式声明您的 API):

 @POST("auth/login")
 Call<LoginResponse> loginUser(@Body LoginPost body);

 Call<LoginResponse> call = apiLink.loginUser(LoginPost body);

推荐阅读