无法完成 Retrofit 请求?
Not able to complete the Retrofit request?
我必须通过 Retrofit
将 JSON
作为 Post
请求发送。为此,我创建了一个 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
。我在这里做错了什么?
您应该改为在后台任务上调用您的网络操作。否则,将抛出 NetworkOnMainThreadException
。
现在retrofit有两种模式。同步或异步。
您正在使用同步模式,大概是在您的主线程中调用的。
你现在能做的就是改成异步模式(使用retrofit回调)。
即从:
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 return 响应:
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。不同的字母大小写,不同的库,更好的性能。
我必须通过 Retrofit
将 JSON
作为 Post
请求发送。为此,我创建了一个 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
。我在这里做错了什么?
您应该改为在后台任务上调用您的网络操作。否则,将抛出 NetworkOnMainThreadException
。
现在retrofit有两种模式。同步或异步。
您正在使用同步模式,大概是在您的主线程中调用的。
你现在能做的就是改成异步模式(使用retrofit回调)。
即从:
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 return 响应:
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。不同的字母大小写,不同的库,更好的性能。