java - 如果响应与 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;
}
解决方案
在进行 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);
推荐阅读
- javascript - 根据nodejs中的另一个下拉菜单动态选择下拉菜单
- php - 如何获取 woocommerce 数据(wc_get_product())?
- scala - AWS Lambda 返回一个文件
- python - spark RDD中是否有类似sql中的'like'函数的功能?
- reactjs - Material-UI:如何使用 TextField 应用输入属性
- r - R中的Coeftest函数--输出中未报告变量
- unity3d - 将相机附加到与脚本相同的对象
- reactjs - 风格反应选择与阿芙罗狄蒂
- regex - 正则表达式以防止某些电话区号
- android - 连接 WiFi 时如何使用移动数据服务?