Страницы

Поиск по вопросам

Показаны сообщения с ярлыком retrofit2. Показать все сообщения
Показаны сообщения с ярлыком retrofit2. Показать все сообщения

пятница, 24 января 2020 г.

Динамическое изменение аргумента интерфэйса Retrofit2

#java #android #retrofit2


Есть метод для изменения услуги:

    @Multipart
    @PUT("/api/edit/service/{service_id}/{master_id}")
    Observable editService(@Path("service_id") String serviceId,
                                     @Path("master_id") String userId,
                                     @Part MultipartBody.Part avatar,
                                     @Part("title") RequestBody title,
                                     @Part("price") RequestBody price,
                                     @Part("description") RequestBody description,
                                     @Part("period") RequestBody periodInMinutes,
                                     @Part("service_category") RequestBody serviceCategory) 


в котором я должен отправлять то поле которое изменилось, либо все поля, включая
изменившееся поле. То есть в выше написанном методе я отправляю все поля.

Но я хочу отправлять только то поле, которое изменилось, типа так:

Observable editService(@Path("service_id") String serviceId,
                                     @Path("master_id") String userId,
                                     @Part("title") RequestBody title)


Только в данном случае я отправляю я отправляю измененный заголовок, так как в аннотации
@Part прописал ключ заголовка - @Part("title"). 
Таким образом мне придется для каждого поля создать отдельный метод. Мне кажется
это не правильно.

Так вот, возможно ли отправлять все измененные поля с ключами, а в методе editService()
прописать типа:

Observable editService(@Path("service_id") String serviceId,
                                     @Path("master_id") String userId,
                                     @Part RequestBody service)


Может есть решение как скомпоновать поля в один?
    


Ответы

Ответ 1



Решил задачу с помощью @PartMap В RetrofitServiceApi: @Multipart @PUT("/api/edit/service/{service_id}/{master_id}") Observable editService(@Path("service_id") String serviceId, @Path("master_id") String userId, @PartMap Map params); И отправляю: String image = serviceModel.getImage(); String title = serviceModel.getTitle(); String description = serviceModel.getDescription(); String period = serviceModel.getPeriod(); int price = serviceModel.getPrice(); if (!tmpServiceClick.getImage().equals(image)) { parameters.putAll(RetrofitRequestUtil.fileToRequestBodyMap(file, "avatar")); } if (!tmpServiceClick.getTitle().equals(title)) { parameters.put("title", RetrofitRequestUtil.toRequestBody(title)); } if (!tmpServiceClick.getDescription().equals(description)) { parameters.put("description", RetrofitRequestUtil.toRequestBody(description)); } if (!tmpServiceClick.getPeriod().equals(period)) { parameters.put("period", RetrofitRequestUtil.toRequestBody(period)); } if (tmpServiceClick.getPrice() != price) { parameters.put("price", RetrofitRequestUtil.toRequestBody(String.valueOf(price))); } retrofitInterface.editService(masterId, serviceModel.getPublicId(), parameters)) Класс RetrofitRequestUtil: public static RequestBody toRequestBody(String value) { return RequestBody.create(MediaType.parse("text/plain"), value); }

суббота, 11 января 2020 г.

Как выполнить более 3 параллельных http запросов с помощью RxJava (+retrofit2) в Android

#android #kotlin #rxjava #retrofit2


Пытаюсь освоить работу с RxJava + retrofit2 + kotlin.

Как в этом участвует Observable в общем разобрался, даже научился объединять результаты
2-3 параллельных запросов по итогу выполнения всех с помощью Observable.zip, НО как
похожим образом выполнить более 3 параллельных запросов не могу понять.

В исходном коде класса Observable есть метод 

static  Observable zip(), 


но он не работает как 

static  Observable zip() 


в случае с тремя Observable на вход и Function3<*,*,*,*>. 

Старался уже сделать первые три запроса с помощью zip, потом flatMap и тд, но всё
не выходит. Чтение документации и примеров не помогают повернуть к нужному направлению.
Смотрел в сторону Observable.combineLatest, но пришел к выводу (может ошибочному),
что метод вернет результат первого выполнившегося Observable.

Если в целом, что я хочу: 

У меня есть 4 метода, которые возвращают Observable:


this.orderRepository.getStatuses():Observable
this.orderRepository.getOrders():Observable
this.userRepository.getUsers():Observable
this.orderRepository.getTypes():Observable


Подскажите, пожалуйста, как я должен скомпоновать эти методы, чтобы они выполнились
параллельно, и в конце получить результат выполнения всех 4 методов в одном месте? 

Мои стыдливые попытки ниже. Это уже что-то испорченное, но я вообще не понимаю, что
я должен сделать с 4 Observables, чтобы их всех в одном месте и вернуть в UI. + уже
запутался с flatMap, map и так далее...

override fun buildUseCaseObservable(params: Params): Observable {

return Observable.zip(
                this.userRepository.getUsers(100, 1, ApiUserFilter(isManager = true)),
                this.orderRepository.getOrderStatuses(),
                this.orderRepository.getOrderTypes(),
                Function3
{ t1, t2, t3 ->
                    Zip(t1,t2,t3)
                }).map {
                    this.orderRepository.getOrders(params.limit, params.page, params.filter).flatMap {
                        it
                    }
                }

 }



    


Ответы

Ответ 1



Zip для четырех observable можно написать так: Observable.zip( getStatuses(), getOrders(), getUsers(), getTypes(), Function4 { status, order, user, type -> ... } )

пятница, 27 декабря 2019 г.

как распарсить json

#java #android #json #retrofit2


Работаю с wiki api, моя задача получить url страницы по id. 
Использую retrofit2.
Вот запрос с которым я работаю [https://ru.wikipedia.org/w/api.php?&action=query&list=&prop=info&inprop=url&format=json&pageids=2549076|744563|4409887]
моя проблема в том, что мне приходит json 
и я не могу его сериализовать, так как мне POJO конвертирует имена классов в виде
цифр из id 

    {
"batchcomplete": "",
"query": {
    "pages": {
        "744563": {
            "pageid": 744563,
            "ns": 0,
            "title": "Львовский оперный театр",
            "contentmodel": "wikitext",
            "pagelanguage": "ru",
            "pagelanguagehtmlcode": "ru",
            "pagelanguagedir": "ltr",
            "touched": "2017-09-16T20:57:05Z",
            "lastrevid": 87226524,
            "length": 14547,
            "fullurl": "https://ru.wikipedia.org/wiki/%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%B0%D1%82%D1%80",
            "editurl": "https://ru.wikipedia.org/w/index.php?title=%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%B0%D1%82%D1%80&action=edit",
            "canonicalurl": "https://ru.wikipedia.org/wiki/%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%B0%D1%82%D1%80"
        },
        "2549076": {
            "pageid": 2549076,
            "ns": 0,
            "title": "Крепость Святой Елисаветы",
            "contentmodel": "wikitext",
            "pagelanguage": "ru",
            "pagelanguagehtmlcode": "ru",
            "pagelanguagedir": "ltr",
            "touched": "2017-09-15T05:33:34Z",
            "lastrevid": 87632281,
            "length": 5055,
            "fullurl": "https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B5%D0%BF%D0%BE%D1%81%D1%82%D1%8C_%D0%A1%D0%B2%D1%8F%D1%82%D0%BE%D0%B9_%D0%95%D0%BB%D0%B8%D1%81%D0%B0%D0%B2%D0%B5%D1%82%D1%8B",
            "editurl": "https://ru.wikipedia.org/w/index.php?title=%D0%9A%D1%80%D0%B5%D0%BF%D0%BE%D1%81%D1%82%D1%8C_%D0%A1%D0%B2%D1%8F%D1%82%D0%BE%D0%B9_%D0%95%D0%BB%D0%B8%D1%81%D0%B0%D0%B2%D0%B5%D1%82%D1%8B&action=edit",
            "canonicalurl": "https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B5%D0%BF%D0%BE%D1%81%D1%82%D1%8C_%D0%A1%D0%B2%D1%8F%D1%82%D0%BE%D0%B9_%D0%95%D0%BB%D0%B8%D1%81%D0%B0%D0%B2%D0%B5%D1%82%D1%8B"
        },
        "4409887": {
            "pageid": 4409887,
            "ns": 0,
            "title": "Памятник Ленину (Львов)",
            "contentmodel": "wikitext",
            "pagelanguage": "ru",
            "pagelanguagehtmlcode": "ru",
            "pagelanguagedir": "ltr",
            "touched": "2017-09-16T16:12:47Z",
            "lastrevid": 83520554,
            "length": 6170,
            "fullurl": "https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83_(%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2)",
            "editurl": "https://ru.wikipedia.org/w/index.php?title=%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83_(%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2)&action=edit",
            "canonicalurl": "https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83_(%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2)"
        }
    }
}


и я не могу его сериализовать, так как мне POJO конвертирует имена классов в виде
цифр из id

public class _4409887 implements Serializable
{
@SerializedName("pageid")
@Expose
private Integer pageid;
@SerializedName("ns")
@Expose
private Integer ns;
@SerializedName("title")
@Expose
private String title;
@SerializedName("contentmodel")


Такие запросы посылаются каждые 5 секунд и количество id динамическое от 0 до 5.
Моя задача распарсить json и получить из него значение "fullurl"
Вот мой код

   synchronized public List getPagesId() {

    WikiApi service = getRetrofit().create(WikiApi.class);
    Call responseBodyCall =
            service.getArticleId(Constants.WIKI_ACTION,
                    Constants.WIKI_LIST,
                    Constants.TEMP_COORD,
                    Constants.RADIUS_SEARCH_WIKI,
                    Constants.LIMIT_ARTICLE_WIKI,
                    Constants.JSON);
    responseBodyCall.enqueue(new Callback() {

        @Override
        public void onResponse(Call call, Response
response) {
            Log.d("+++", "response ok id");
            if (response.isSuccessful() && response.body().getQuery().getGeosearch().size()
> 0) {
                geoSearch = response.body().getQuery().getGeosearch();
                Log.d("+++", "geoSearch " + geoSearch.size());
                getWikiUrl(geoSearch);
            }
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            Log.d("+++", "onFailure result NO");
            Log.d("+++", String.valueOf(t));
        }
    });
    return geoSearch;
}
private Retrofit getRetrofit() {
    Gson gson = new GsonBuilder().create();
    return new Retrofit.Builder()
            .baseUrl(Constants.WIKI_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();
}
private void checkStartNewUpdate() {
    cycleRunnable();
}

synchronized public void getWikiUrl(List geoSearch) {

    String [] tmpPagesId = new String[geoSearch.size()];
    for (int i = 0; i < geoSearch.size(); i++) {
        if(i < geoSearch.size() - 1)
            tmpPagesId[i] = (String.valueOf(geoSearch.get(i).getPageid()) + "|");
        else tmpPagesId[i] = (String.valueOf(geoSearch.get(i).getPageid()));

        Log.d("+++", "pagesId " + tmpPagesId[i]);
    }


    WikiApi service = getRetrofit().create(WikiApi.class);

    Call responseBodyCall =
            service.getArticle(Constants.WIKI_ACTION,
                    Constants.WIKI_INFO,
                    Constants.WIKI_URL,
                    Constants.JSON,
                    tmpPagesId);
    responseBodyCall.enqueue(new Callback() {

    @Override
    public void onResponse(Call call, Response response) {
        Log.d("+++", "response url id ");
        if(response.isSuccessful()) {
            try {
                Log.d("+++", response.body().string());
                checkStartNewUpdate();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onFailure(Call call, Throwable t) {
        Log.d("+++", "onFailure result NO");
        Log.d("+++", String.valueOf(t));
        checkStartNewUpdate();
    }
});


Вот мой интерфейс

    @GET("/w/api.php?")
Call getArticle(
        @Query("action") String action,
        @Query("prop") String INFO,
        @Query("inprop") String URL,
        @Query("format") String JSON,
        @Query("pageids") String... list);

    


Ответы

Ответ 1



Судя по всему внутри pages у вас ключи объектов являются ID-шниками какими-то и их имена заранее не известны. В этом случае вам надо указать в модели чтобы они представлялись в виде Map - тогда их названия могут быть любыми и обращаться к ним можно будет в коде как к ключам-значениям. Т.е. модель для всего JSON должна как-то так выглядеть: public class JsonModel { public Map query; } public class InnerModel { public Integer pageid; public Integer ns; public String title; public String fullUrl; } И потом обращаться к нужному элементу можно как-то так: for(InnerModel innerModel: response.query.values()){ System.out.println(innerModel.fullUrl); }

воскресенье, 22 декабря 2019 г.

Обработка динамического JSON в Retrofit2

#java #android #retrofit2


Имеется метод в сервисе:

@DELETE("api/rest/dir/{dir_path}/")
Call delete(@Path("dir_path") String dirPath);


В виде ответа могут придти разные JSON.

{
"dir": { "status": "success" }
}


или

{
"dir": {
"error_code": "{error number}",
"error_message": "{description or error}"
}
}


Соответственно имеются классы:

public class BaseResponse {
}



public class Error extends BaseResponse {
@SerializedName("error_code")
private int errorCode;

@SerializedName("error_message")
private String errorMessage;




public class Status extends BaseResponse {
@SerializedName("status")
private String status;


Как правильно обрабатывать ответы? А то всегда в response находится BaseResponse
и не приводится ни к одному из двух наследующих его типов.
    


Ответы

Ответ 1



Классы менять не нужно, класс остаётся один и тот же, только в случае успешного ответа в status возвращается success, а ваши error будут null, и наоборот в случае ответа с ошибкой - status == null, а в error будут данные: public class AwesomeResponse extends ErrorResponse { @Nullable @SerializedName("status") public String status; // сколько угодно полей } public class ErrorResponse { @Nullable @SerializedName("error_code") public Integer errorCode; @Nullable @SerializedName("error_message") public String errorMessage; }

пятница, 1 марта 2019 г.

Как выполнить более 3 параллельных http запросов с помощью RxJava (+retrofit2) в Android

Пытаюсь освоить работу с RxJava + retrofit2 + kotlin.
Как в этом участвует Observable в общем разобрался, даже научился объединять результаты 2-3 параллельных запросов по итогу выполнения всех с помощью Observable.zip, НО как похожим образом выполнить более 3 параллельных запросов не могу понять.
В исходном коде класса Observable есть метод
static Observable zip(),
но он не работает как
static Observable zip()
в случае с тремя Observable на вход и Function3<*,*,*,*>.
Старался уже сделать первые три запроса с помощью zip, потом flatMap и тд, но всё не выходит. Чтение документации и примеров не помогают повернуть к нужному направлению. Смотрел в сторону Observable.combineLatest, но пришел к выводу (может ошибочному), что метод вернет результат первого выполнившегося Observable.
Если в целом, что я хочу:
У меня есть 4 метода, которые возвращают Observable:
this.orderRepository.getStatuses():Observable this.orderRepository.getOrders():Observable this.userRepository.getUsers():Observable this.orderRepository.getTypes():Observable
Подскажите, пожалуйста, как я должен скомпоновать эти методы, чтобы они выполнились параллельно, и в конце получить результат выполнения всех 4 методов в одном месте?
Мои стыдливые попытки ниже. Это уже что-то испорченное, но я вообще не понимаю, что я должен сделать с 4 Observables, чтобы их всех в одном месте и вернуть в UI. + уже запутался с flatMap, map и так далее...
override fun buildUseCaseObservable(params: Params): Observable {
return Observable.zip( this.userRepository.getUsers(100, 1, ApiUserFilter(isManager = true)), this.orderRepository.getOrderStatuses(), this.orderRepository.getOrderTypes(), Function3 { t1, t2, t3 -> Zip(t1,t2,t3) }).map { this.orderRepository.getOrders(params.limit, params.page, params.filter).flatMap { it } }
}


Ответ

Zip для четырех observable можно написать так:
Observable.zip( getStatuses(), getOrders(), getUsers(), getTypes(), Function4 { status, order, user, type -> ... } )

среда, 16 января 2019 г.

Обработка динамического JSON в Retrofit2

Имеется метод в сервисе:
@DELETE("api/rest/dir/{dir_path}/") Call delete(@Path("dir_path") String dirPath);
В виде ответа могут придти разные JSON.
{ "dir": { "status": "success" } }
или
{ "dir": { "error_code": "{error number}", "error_message": "{description or error}" } }
Соответственно имеются классы:
public class BaseResponse { }

public class Error extends BaseResponse { @SerializedName("error_code") private int errorCode;
@SerializedName("error_message") private String errorMessage;

public class Status extends BaseResponse { @SerializedName("status") private String status;
Как правильно обрабатывать ответы? А то всегда в response находится BaseResponse и не приводится ни к одному из двух наследующих его типов.


Ответ

Классы менять не нужно, класс остаётся один и тот же, только в случае успешного ответа в status возвращается success, а ваши error будут null, и наоборот в случае ответа с ошибкой - status == null, а в error будут данные:
public class AwesomeResponse extends ErrorResponse {
@Nullable @SerializedName("status") public String status;
// сколько угодно полей
}
public class ErrorResponse {
@Nullable @SerializedName("error_code") public Integer errorCode;
@Nullable @SerializedName("error_message") public String errorMessage;
}

понедельник, 3 декабря 2018 г.

как распарсить json

Работаю с wiki api, моя задача получить url страницы по id. Использую retrofit2. Вот запрос с которым я работаю [https://ru.wikipedia.org/w/api.php?&action=query&list=&prop=info&inprop=url&format=json&pageids=2549076|744563|4409887] моя проблема в том, что мне приходит json и я не могу его сериализовать, так как мне POJO конвертирует имена классов в виде цифр из id
{ "batchcomplete": "", "query": { "pages": { "744563": { "pageid": 744563, "ns": 0, "title": "Львовский оперный театр", "contentmodel": "wikitext", "pagelanguage": "ru", "pagelanguagehtmlcode": "ru", "pagelanguagedir": "ltr", "touched": "2017-09-16T20:57:05Z", "lastrevid": 87226524, "length": 14547, "fullurl": "https://ru.wikipedia.org/wiki/%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%B0%D1%82%D1%80", "editurl": "https://ru.wikipedia.org/w/index.php?title=%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%B0%D1%82%D1%80&action=edit", "canonicalurl": "https://ru.wikipedia.org/wiki/%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%BE%D0%BF%D0%B5%D1%80%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%B0%D1%82%D1%80" }, "2549076": { "pageid": 2549076, "ns": 0, "title": "Крепость Святой Елисаветы", "contentmodel": "wikitext", "pagelanguage": "ru", "pagelanguagehtmlcode": "ru", "pagelanguagedir": "ltr", "touched": "2017-09-15T05:33:34Z", "lastrevid": 87632281, "length": 5055, "fullurl": "https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B5%D0%BF%D0%BE%D1%81%D1%82%D1%8C_%D0%A1%D0%B2%D1%8F%D1%82%D0%BE%D0%B9_%D0%95%D0%BB%D0%B8%D1%81%D0%B0%D0%B2%D0%B5%D1%82%D1%8B", "editurl": "https://ru.wikipedia.org/w/index.php?title=%D0%9A%D1%80%D0%B5%D0%BF%D0%BE%D1%81%D1%82%D1%8C_%D0%A1%D0%B2%D1%8F%D1%82%D0%BE%D0%B9_%D0%95%D0%BB%D0%B8%D1%81%D0%B0%D0%B2%D0%B5%D1%82%D1%8B&action=edit", "canonicalurl": "https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B5%D0%BF%D0%BE%D1%81%D1%82%D1%8C_%D0%A1%D0%B2%D1%8F%D1%82%D0%BE%D0%B9_%D0%95%D0%BB%D0%B8%D1%81%D0%B0%D0%B2%D0%B5%D1%82%D1%8B" }, "4409887": { "pageid": 4409887, "ns": 0, "title": "Памятник Ленину (Львов)", "contentmodel": "wikitext", "pagelanguage": "ru", "pagelanguagehtmlcode": "ru", "pagelanguagedir": "ltr", "touched": "2017-09-16T16:12:47Z", "lastrevid": 83520554, "length": 6170, "fullurl": "https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83_(%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2)", "editurl": "https://ru.wikipedia.org/w/index.php?title=%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83_(%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2)&action=edit", "canonicalurl": "https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BC%D1%8F%D1%82%D0%BD%D0%B8%D0%BA_%D0%9B%D0%B5%D0%BD%D0%B8%D0%BD%D1%83_(%D0%9B%D1%8C%D0%B2%D0%BE%D0%B2)" } } }
и я не могу его сериализовать, так как мне POJO конвертирует имена классов в виде цифр из id
public class _4409887 implements Serializable { @SerializedName("pageid") @Expose private Integer pageid; @SerializedName("ns") @Expose private Integer ns; @SerializedName("title") @Expose private String title; @SerializedName("contentmodel")
Такие запросы посылаются каждые 5 секунд и количество id динамическое от 0 до 5. Моя задача распарсить json и получить из него значение "fullurl" Вот мой код
synchronized public List getPagesId() {
WikiApi service = getRetrofit().create(WikiApi.class); Call responseBodyCall = service.getArticleId(Constants.WIKI_ACTION, Constants.WIKI_LIST, Constants.TEMP_COORD, Constants.RADIUS_SEARCH_WIKI, Constants.LIMIT_ARTICLE_WIKI, Constants.JSON); responseBodyCall.enqueue(new Callback() {
@Override public void onResponse(Call call, Response response) { Log.d("+++", "response ok id"); if (response.isSuccessful() && response.body().getQuery().getGeosearch().size() > 0) { geoSearch = response.body().getQuery().getGeosearch(); Log.d("+++", "geoSearch " + geoSearch.size()); getWikiUrl(geoSearch); } }
@Override public void onFailure(Call call, Throwable t) { Log.d("+++", "onFailure result NO"); Log.d("+++", String.valueOf(t)); } }); return geoSearch; } private Retrofit getRetrofit() { Gson gson = new GsonBuilder().create(); return new Retrofit.Builder() .baseUrl(Constants.WIKI_BASE_URL) .addConverterFactory(GsonConverterFactory.create(gson)) .build(); } private void checkStartNewUpdate() { cycleRunnable(); }
synchronized public void getWikiUrl(List geoSearch) {
String [] tmpPagesId = new String[geoSearch.size()]; for (int i = 0; i < geoSearch.size(); i++) { if(i < geoSearch.size() - 1) tmpPagesId[i] = (String.valueOf(geoSearch.get(i).getPageid()) + "|"); else tmpPagesId[i] = (String.valueOf(geoSearch.get(i).getPageid()));
Log.d("+++", "pagesId " + tmpPagesId[i]); }
WikiApi service = getRetrofit().create(WikiApi.class);
Call responseBodyCall = service.getArticle(Constants.WIKI_ACTION, Constants.WIKI_INFO, Constants.WIKI_URL, Constants.JSON, tmpPagesId); responseBodyCall.enqueue(new Callback() {
@Override public void onResponse(Call call, Response response) { Log.d("+++", "response url id "); if(response.isSuccessful()) { try { Log.d("+++", response.body().string()); checkStartNewUpdate(); } catch (IOException e) { e.printStackTrace(); } } }
@Override public void onFailure(Call call, Throwable t) { Log.d("+++", "onFailure result NO"); Log.d("+++", String.valueOf(t)); checkStartNewUpdate(); } });
Вот мой интерфейс
@GET("/w/api.php?") Call getArticle( @Query("action") String action, @Query("prop") String INFO, @Query("inprop") String URL, @Query("format") String JSON, @Query("pageids") String... list);


Ответ

Судя по всему внутри pages у вас ключи объектов являются ID-шниками какими-то и их имена заранее не известны. В этом случае вам надо указать в модели чтобы они представлялись в виде Map - тогда их названия могут быть любыми и обращаться к ним можно будет в коде как к ключам-значениям. Т.е. модель для всего JSON должна как-то так выглядеть:
public class JsonModel { public Map query; }
public class InnerModel { public Integer pageid; public Integer ns; public String title; public String fullUrl; }
И потом обращаться к нужному элементу можно как-то так:
for(InnerModel innerModel: response.query.values()){ System.out.println(innerModel.fullUrl); }