无法完成Retrofit请求?

时间:2015-09-17 02:38:03

标签: android json retrofit

我必须通过JSON发送Post作为Retrofit请求。为此,我创建了一个Json对象:

 private JSONObject yourJSON(){

    JSONObject jsonRoot = new JSONObject();
    JSONObject jsonObject1 = new JSONObject();
    JSONArray  jsonArray = new JSONArray();
    JSONObject jsonObject2 = new JSONObject();
    try{
        jsonArray.put(jsonObject2);
        jsonObject2.put("duration", "12");
        jsonObject1.put("region", "NYC");
        jsonObject1.put("or", jsonArray);
        jsonRoot.put("q", jsonObject1);
        jsonRoot.put("sort", "recent");
    }catch (JSONException e){

        e.printStackTrace();
    }
    return jsonRoot;
}

然后我使用此JSON通过以下代码发送数据

 RestApiAdapter restAdapter = new RestApiAdapter();
 RoomListingAPI apiservice = restAdapter.providesRestAdapter().create(RoomListingAPI.class);
 JSONObject response = apiservice.getRoomListing("qwerty","application/json", yourJSON());

API方法

public interface RoomListingAPI {
@POST("/api/listings/search")
JSONObject getRoomListing(@Header("x-parse-session-token") String token, @Header("Content-Type") String type, @Body JSONObject json);
}

我的目标是发送JSON并收到JSON,但它不起作用。我在这做错了什么。我也发送了正确的JSON。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您应该在后台任务上调用您的网络操作。否则,将抛出NetworkOnMainThreadException

现在改造有两种模式。同步或异步。

您正在使用同步模式,可能是在主线程中调用的。

您现在可以做的是更改为异步模式(使用改装回调)。

即改变自:

public interface RoomListingAPI {
    @POST("/api/listings/search")
    JSONObject getRoomListing(@Header("x-parse-session-token") String token, @Header("Content-Type") String type, @Body JSONObject json);
}

要:

public interface RoomListingAPI {
    @POST("/api/listings/search")
    void getRoomListing(@Header("x-parse-session-token") String token, @Header("Content-Type") String type, @Body JSONObject json,  Callback<JsonObject> responseCallback);
}

获取JsonObject返回响应:

apiservice.getRoomListing("qwerty","application/json", yourJSON(),
     new Callback<JsonObject>() {
         @Override
         public void success(JsonObject jsonObject, Response response) {
              // jsonObject is what you're looking for
         }

         @Override
         public void failure(RetrofitError error) {
              // do something with the error 
         }
});

此外,使用gson库更好。因此使用JsonObject而不是JSONObject。不同的字母大小写,不同的图书馆,更好的表现。