如果响应与发布类不同,如何从发布请求中获取响应

时间:2019-05-24 21:51:20

标签: java android api retrofit2

我正在使用改造将登录详细信息通过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;
}

1 个答案:

答案 0 :(得分:1)

在进行Retrofit调用时,不要对请求使用POJO类,而应使用与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使用哪个对象来解析Response(如果要将对象用作发布主体数据,则需要以不同的方式声明API) :

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

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