【问题标题】:How do I get a response from a post request if the response is different from the post class如果响应与 post 类不同,我如何从 post 请求中获得响应
【发布时间】:2019-10-11 11:37:52
【问题描述】:

我正在使用改造通过 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;
}

【问题讨论】:

    标签: java android api retrofit2


    【解决方案1】:

    在进行 Retrofit 调用时,不要为 Request 使用 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 使用哪个对象来解析响应,(如果您想使用一个对象作为帖子正文数据,您需要以不同的方式声明您的 API) :

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

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多