Получить ответ от API с Retrofit2 и Rx - PullRequest
0 голосов
/ 28 мая 2018

Я использовал Retrofit с Rx для отправки запроса и получения JSON из API.Все выглядит хорошо, но когда я хочу получить доступ к массиву JSON, он не может работать.

public class Device {
private boolean current;
private String uid;

public boolean isCurrent() {
    return current;
}

public void setCurrent(boolean current) {
    this.current = current;
}

public String getUid() {
    return uid;
}

public void setUid(String uid) {
    this.uid = uid;
}
}

public class DeviceResult {
private ArrayList<Device> devices;

public ArrayList<Device> getDevices() {
    return devices;
}

public void setDevices(ArrayList<Device> devices) {
this.devices = devices; } }

Вы можете видеть класс DeviceResult, что существует ArrayListс именем devices

public interface TokenApi {
    @GET("devices")
    Observable<Response<DeviceResult>> getDeviceId(@Header("Authorization") 
    String token);
    }

deviceResults.isSuccessful() является верным, и я видел мой ответ из журнала Okhttp, но deviceResults.body() не то, что я ожидаю.

 RetrofitHelper retrofitHelper = new RetrofitHelper("http://172.16.16.16");
    TokenApi tokenApi = retrofitHelper.getService(TokenApi.class);
    rx.Observable<Response<DeviceResult>> listObservable = tokenApi.getDeviceId("Bearer" + " " + getToken());
    listObservable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(deviceResults -> {
        if (deviceResults.isSuccessful()) {
// isSuccessful is true
// the problem is body tell me some dumy thing
            Log.i("Devices_body", deviceResults.body().toString());
            Log.i("Devices_message", deviceResults.message());
        }

    }, throwable -> Log.i("Error get devices", throwable.toString()));

мой массив JSON

{
"devices": [
    {
        "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36",
        "browser": "Chrome",
        "current": false,
        "deviceType": "Desktop",
        "id": 9848,
        "ip": "172.16.106.40",
        "lastAccessTime": 1527337813000,
        "os": "Win10",
        "osVersion": "10.0",
        "uid": "f3fcf0845df6e83cd150e86aadc37206"
    },
    {
        "agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0",
        "browser": "Firefox",
        "browserVersion": "59",
        "current": true,
        "deviceType": "Desktop",
        "id": 9828,
        "ip": "172.16.106.44",
        "lastAccessTime": 1527066972000,
        "os": "Win10",
        "osVersion": "10.0",
        "uid": "3d943476a879dcf609f79a5ec736bedc"
    },
}

Проблема заключается в том, что deviceResults.body().toString() не дает мне JSON, но я увидел в журнале Okhttp, что ответ на запрос работает нормально!

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы должны создать класс POJO для своего ответа, используя эту ссылку.После этого попробуйте применить GsonConvertorFactory

dependencies {  
// Retrofit & OkHttp
compile 'com.squareup.retrofit2:retrofit:2.3.0'

// JSON Converter
compile 'com.squareup.retrofit2:converter-gson:2.3.0'

}

Затем попробуйте преобразовать массив ответов или объект в JSON.

0 голосов
/ 28 мая 2018

Дело в том, что я только что увидел Отладчик и понял, что отклик (deviceResults.body()) дает мне ArrayList<Device>, и мне не нужно было анализировать его до JSONObject.

...