2016-03-14 2 views
3

Я использую модификацию для получения данных с http-адреса. Мой интерфейс Класс:Получение пустого тела в модификации Response

public interface SlotsAPI { 

    /*Retrofit get annotation with our URL 
     And our method that will return a Json Object 
    */ 
    @GET(url) 
    retrofit.Call<JSONObject> getSlots(); 
} 

Мой метод запроса.

public void getResponse(){ 

    Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(URL) 
        .addConverterFactory(GsonConverterFactory.create()) 
        .build(); 

    //Creating an object of our api interface 
    SlotsAPI api = retrofit.create(SlotsAPI.class); 
    retrofit.Call<JSONObject> callback = api.getSlots(); 
    callback.enqueue(new Callback<JSONObject>() { 
    @Override 
    public void onResponse(Response<JSONObject> response) { 
     if (response != null) { 
      Log.d("OnResponse", response.body().toString()); 
     } 
    } 

    @Override 
    public void onFailure(Throwable t) { 
     t.printStackTrace(); 
    } 
    }); 
} 

В ответе я получаю пустое тело. И сервер отвечает 200 OK.

D/OnResponse: {} 

Но когда я открываю URL-адрес в браузере, я получаю JSONObject на экране.

+0

Можете ли вы предоставить URL-адрес? –

+0

Извините, я не могу.Но это обычная ссылка http. – Viking93

+0

Я предлагаю вам использовать такой инструмент, как Fiddler или Charles, и прокси-сервер, проходящий через них. Затем вы можете сравнить различия в запросах и получить представление. Возможно, это из-за строки UserAgent. –

ответ

6

вы должны попробовать, как этот путь ....

public interface SlotsAPI { 

/*Retrofit get annotation with our URL 
    And our method that will return a Json Object 
*/ 
@GET(url) 
Call<JsonElement> getSlots(); 
} 

в методе запроса

retrofit.Call<JsonElement> callback = api.getSlots(); 
callback.enqueue(new Callback<JsonElement>() { 
@Override 
public void onResponse(Response<JsonElement> response) { 
    if (response != null) { 
     Log.d("OnResponse", response.body().toString()); 
    } 
} 
0

Я думаю, что вы не понимаете модифицированную философию. Правильный интерфейс должен быть:

public interface SlotsAPI { 

    /*Retrofit get annotation with our URL 
     And our method that will return a Json Object 
    */ 
    @GET(url) 
    JSONObject getSlots(); 
} 

При вызове метода getSlots, дооборудование будет автоматически делать запрос HTTP и вернуть JSONObject. Вам нужно будет сделать это из основного потока.

+0

Я думаю, что вызов не будет асинхронным. Но в моем случае мне нужно вызвать сервер асинхронно. Поэтому я использую методы обратного вызова. Спасибо. – Viking93

0

Убедитесь, что URL-адрес из @Get является относительный путь

  • @BASE URL: всегда заканчивается/

  • @url: НЕ начинать с/

Пример:

String URL = http://api.co/base/ ; 

И

@GET("webservice/syncdown") 
    JSONObject getSlots(); 

Вы можете получить список слотов. преобразователь Gson будет обрабатывать его, если вы посылая массив JSON

@GET(url) 
retrofit.Call<List<Slot>> getSlots(); 
+0

Я попробую это и дам вам знать, если это сработает. Спасибо. – Viking93

+0

Нет, он все еще дает то же пустое тело. – Viking93

+0

У меня есть вопрос, вы уверены, что из типа объекта, который вы извлекаете, вы устанавливаете фабрику преобразователей GsonConverterFactory, а тело ответа также является JSONObject? См. Мое обновление, чтобы понять мой вопрос –

0

Вы используете модифицировать 2 или 1? Версия 2 все еще находится в бета-версии. Если вы используете версии 1. Используйте это:

public interface SlotsAPI { 

    /*Retrofit get annotation with our URL 
     And our method that will return a Json Object 
    */ 
    @GET(url) 
    void getSlots(Callback<JsonElement> callback); 
} 

С этого вызова будет асинхронным.

+0

Я использую Retrofit 2.I знаю, что 2 находится в бета-версии. Так вы уверены, что это что-то не так с 2.0, или я что-то не так? – Viking93

0

Такая же проблема здесь, и answer from curiousMind спас мой день.
Еще на ту же тему: если вам нужно, чтобы получить значение от использования пары:

String value = response.body().getAsJsonObject().get("pair_name").getAsString(); 
4

Пожалуйста, проверьте JSONObject. Если вы хотите получить ответ в json, вы должны определить тип ответа JsonObject, а не JSONObject, другой мудрый указать класс pojo в вашем интерфейсе.

+0

Их орфография близка к 'JsonObject' и' JSONObject'. Следует отметить, что один из них - 'com.google.gson.JsonObject', который используется фабрикой преобразователей' gson', а другой - 'org.json.JSONObject', который мы должны использовать первым, то есть' com.google.gson.JsonObject' , – VSB

Смежные вопросы