【问题标题】:retrofit body return null改装体返回空
【发布时间】:2018-08-17 19:05:30
【问题描述】:

我已经发布了一个请求并在 postman 上测试它,响应在 postman 和 android logcat 上正确返回,但在改造时它在正文中返回 null

这里是响应的模型

public class DriverResponse implements Serializable{
@SerializedName("errors")
@Expose
public Errors errors;
@SerializedName("driversapi")
@Expose
public Driversapi driversapi;
}


public class Errors implements Serializable {

@SerializedName("driversapi")
@Expose
public List<String> driversapi = null;
}

public class Driversapi implements Serializable{
public String driverid ;
public String status ;
public String authtoken ;
}

这里是获取数据的代码

public void acceptOrder(String auth, AcceptOrderModel acceptOrderModel) {
    ApiInterface service = ApiClient.getClient().create(ApiInterface.class);
    Call<DriverResponse> connection = service.acceptOrder(auth, acceptOrderModel);
    if (connection != null) {
        connection.enqueue(new Callback<DriverResponse>() {
            @Override
            public void onResponse(Call<DriverResponse> call, Response<DriverResponse> response) {
                String reponseStr = response.toString().replaceAll("\\\\", "");
                Log.e("new String", reponseStr);
                apiResponse.onSuccess(response.body());
            }

            @Override
            public void onFailure(Call<DriverResponse> call, Throwable t) {

                Log.e("QR ", " " + t.getLocalizedMessage());
                apiResponse.onFailed(t.getLocalizedMessage());
            }
        });
    }
}


@Headers({"Content-Type: application/json"})
@POST("/api/drivers/driveracceptorder")
Call<DriverResponse> acceptOrder(@Header("Authorization") String Authorization, @Body AcceptOrderModel acceptOrderModel);

当我发送请求时,响应得到空响应和错误正文内容得到这个

[size=99 text={\r\n "errors": {\r\n "driversapi": [\r\n "order alredy assig...]

这是预期的 json,应该返回并且已经在 logcat 和 postman 中返回

{
"errors": {
  "driversapi": [
    "driver not found"
   ]
  }
}

编辑

这是我的 LogCat

 POST http://site.example.com/api/drivers/driveracceptorder http/1.1
03-09 10:57:17.533 8128-17940/com.trend.driver D/OkHttp: Content-Type: application/json
03-09 10:57:17.533 8128-17940/com.trend.driver D/OkHttp: Content-Length: 47
03-09 10:57:17.533 8128-17940/com.trend.driver D/OkHttp: Authorization: Ber z3rlF3cUYICZUm49HeCkpOU8TEjITCqq5tplXDZU4pxvRlzTScUo-0wZr52trM9kWinOnqzaJBwgMB9pp0tk4GTx7BGDoX-u5H9IfQWHlJ_iYpWOIkTiZOb4JuovPPPTfta4MJlRJO6IjasBKpNTvT7KRqp4gHrw3xs9JWa9RTCuY83JhaBf2weyQ8RwsT_SVTg
03-09 10:57:17.535 8128-17940/com.trend.driver D/OkHttp: {"accept":"1","driverid":"2112","orderid":"46"}
03-09 10:57:17.535 8128-17940/com.xxxx.driver D/OkHttp: --> END POST (47-byte body)
03-09 10:57:17.535 8128-8128/com.trend.driver I/Choreographer: Skipped 115 frames!  The application may be doing too much work on its main thread.
03-09 10:57:18.290 8128-17940/com.trend.driver D/OkHttp: <-- 404 Not Found http://site.example.com/api/drivers/driveracceptorder (754ms)
03-09 10:57:18.291 8128-17940/com.trend.driver D/OkHttp: Cache-Control: private
03-09 10:57:18.291 8128-17940/com.trend.driver D/OkHttp: Content-Length: 99
03-09 10:57:18.291 8128-17940/com.trend.driver D/OkHttp: Content-Type: application/json
03-09 10:57:18.291 8128-17940/com.trend.driver D/OkHttp: Server: Microsoft-IIS/8.5
03-09 10:57:18.291 8128-17940/com.trend.driver D/OkHttp: Set-Cookie: Nop.customer=9df71aba-df96-4aa4-a8f5-daab40d91d5e; expires=Sat, 09-Mar-2019     08:57:18 GMT; path=/; HttpOnly
03-09 10:57:18.291 8128-17940/com.trend.driver D/OkHttp: Date: Fri, 09 Mar 2018 08:57:18 GMT
03-09 10:57:18.294 8128-17940/com.trend.driver D/OkHttp: {
03-09 10:57:18.295 8128-17940/com.trend.driver D/OkHttp:   "errors": {
03-09 10:57:18.295 8128-17940/com.trend.driver D/OkHttp:     "driversapi": [
03-09 10:57:18.295 8128-17940/com.trend.driver D/OkHttp:       "order alredy assigned to other driver"
03-09 10:57:18.295 8128-17940/com.trend.driver D/OkHttp:     ]
03-09 10:57:18.295 8128-17940/com.trend.driver D/OkHttp:   }
03-09 10:57:18.295 8128-17940/com.trend.driver D/OkHttp: }
03-09 10:57:18.295 8128-17940/com.trend.driver D/OkHttp: <-- END HTTP (99-byte body)

【问题讨论】:

  • 与您的后端团队确认您是否正确传递了所需的参数。
  • 发布你的日志
  • 什么课程ResponseTest?看起来您应该使用 DriverResponse 作为 API 调用中的模型类。
  • @Fazal Hussain,我已经发布了 Logcat

标签: android gson retrofit retrofit2


【解决方案1】:

在 OnResponse 回调中,您应该检查响应是否成功。如果响应不成功,则响应正文将为空,但 errorBody 将有内容。这是一个例子:

Call<ArrayList<Town>> callGetTowns = apiCalls.getTownsInState(stateId);
callGetTowns.enqueue(new Callback<ArrayList<Town>>() {

    @Override
    public void onResponse(Call<ArrayList<Town>> call, Response<ArrayList<Town>> response) {
    if (response.isSuccessful()){
        //response is successful so response.body() won't be null
        ArrayList<Town> towns = response.body();

    }else{
        //response is not successful so response.body is null but response.errorBody is not null
        String message = "Server Error!";
        try {
            String errorBody = response.errorBody().string();

            //parse the errorBody string to json and retrieve whichever attribute you want
            JsonObject jsonObject = gson.fromJson(errorBody, JsonObject.class);
            if (jsonObject!=null && jsonObject.has("message") && !jsonObject.get("message").isJsonNull()) {
                message =  jsonObject.get("message").getAsString();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
       }
   }

   @Override
   public void onFailure(Call<ArrayList<Town>> call, Throwable t) {
        //request timedout
   }});

【讨论】:

  • ,我发现thers是error body,里面有我的json,现在该怎么办?
  • errorBody 是字符串,因此您需要检索它然后将其解析为 json。像这样检索它: String errorBody = response.errorBody().string();然后像这样将其解析为 JsonObject: JsonObject jsonObject = gson.fromJson(errorBody, JsonObject.class);现在你的 errorBody 为 json,你可以从 errorBody 中获取任何你想要的属性
  • 检查您的代码以确保您没有进行两次 api 调用。检查您没有多次调用 acceptOrder 方法
【解决方案2】:

你应该返回DriverResponse而不是ResponseTest,见下面的代码

 public void acceptOrder(String auth, AcceptOrderModel acceptOrderModel) {
    ApiInterface service = ApiClient.getClient().create(ApiInterface.class);
    Call<DriverResponse> connection = service.acceptOrder(auth, acceptOrderModel);
    if (connection != null) {
        connection.enqueue(new Callback<DriverResponse>() {
            @Override
            public void onResponse(Call<DriverResponse> call, Response<DriverResponse> response) {
                List<String>=response.getErrors().getDriversapi();
                apiResponse.onSuccess(response.body());
            }

            @Override
            public void onFailure(Call<DriverResponse> call, Throwable t) {

                Log.e("QR ", " " + t.getLocalizedMessage());
                apiResponse.onFailed(t.getLocalizedMessage());
            }
        });
    }
}


@Headers({"Content-Type: application/json"})
@POST("/api/drivers/driveracceptorder")
Call<DriverResponse> acceptOrder(@Header("Authorization") String Authorization, @Body AcceptOrderModel acceptOrderModel);

使用 getter 更新您的模型类,如下所示

     public class DriverResponse {

    @SerializedName("errors")
@Expose
private Errors errors;

public Errors getErrors() {
return errors;
}

public void setErrors(Errors errors) {
this.errors = errors;
}

    }

    public class Errors {

@SerializedName("driversapi")
@Expose
private List<String> driversapi = null;

public List<String> getDriversapi() {
return driversapi;
}

public void setDriversapi(List<String> driversapi) {
this.driversapi = driversapi;
}

}

现在在onResponse 中你可以得到一个字符串数组

List<String>=response.getErrors().getDriversapi();

【讨论】:

  • 对不起,这是错误的,我这样做只是为了测试,我已经用新代码编辑了我的帖子,问题仍然存在
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 2019-09-17
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多