1

Invalid input при запросе get_zone_data через RemoteHttpClient в Java

Topic: Invalid input при запросе get_zone_data через RemoteHttpClient в Java

Использую Java SDK для получения данных геозон. Так как работа с геозонами в SDK не поддерживается, я получаю экземпляр RemoteHttpClient и формирую запрос:

JsonObject params = new JsonObject();
params.add("itemId", new JsonPrimitive(resourceId));
JsonArray cols = new JsonArray();
geozoneIds.forEach(cols::add);
params.add("cols", cols);
params.add("flags", new JsonPrimitive(24L));

this.httpClient.remoteCall("resource/get_zone_data", params, new ResponseHandler(queryCallback) {
    @Override
     public void onSuccess(String response) {
         //парсим json и обрабатываем результат
     }
});

Здесь

  • resourceId получен из запроса searchItems для Item.ItemType.avl_resource,
  • geozoneIds получены запросом search_items для геозон,
  • flags = 24 взят из документации, нужно получить точки полигонов

На демо акканутах запрос работает, возвращаемый json соответсвует документации и разбирается, полигоны приходят.
На стенде заказчика на этот запрос мы получаем ошибку с кодом 4, что соответcвует тексту "Invalid input", подскажите, пожалуйста, что это может означать и как получить больше информации по проблеме.
Параметры которые отправляются в запрос, например, выглядят так: {"itemId":32,"cols":[1,66,2,3,4,5,70,6,135,7,136,8,9,10,11,12,13,14,79,15,16,17,18,83,86,89,94,30,33,35,100,39,104,112,118,63],"flags":24}, т.е. все поля заполены, отрицательных значений нет и т.п.

2

Invalid input при запросе get_zone_data через RemoteHttpClient в Java

(edited by kopa 28/12/2017 12:49:17)

Re: Invalid input при запросе get_zone_data через RemoteHttpClient в Java

Для разных аккаунтов resourceId и geozoneIds должны отличаться.
Чтобы получить возможность воспроизвести ситуацию поделитесь полным примером, или токеном и запросом данных о геозонах со всеми параметрами. Можно в лс или на kopa@gurtam.com

Mobile Development
Gurtam
3

Invalid input при запросе get_zone_data через RemoteHttpClient в Java

Re: Invalid input при запросе get_zone_data через RemoteHttpClient в Java

Добрый день! С прошедшими праздниками!
Спасибо за предложение, к сожалению хост и токен заказчика сообщить не могу, так как речь идёт о продакшене. Я сделал пример, который делает то, что я описал в первом посте: запрос ресурса, запрос id геозон и запрос подробной информации по полученным геозонам. Туда можно подставлять хост и токен. Если сделать это с демо аккаунтом и hst.wialon.com, то программа выводит json ответ с данными геозон включая полигоны. Если подставить данные заказчика, то выведет  4: Invalid input именно на последнем запросе. Возможно, я могу по вашим указаниям поделать какие-то ещё запросы, узнать версии и т.п.?

import com.google.gson.*;
import com.wialon.core.Errors;
import com.wialon.core.Session;
import com.wialon.extra.SearchSpec;
import com.wialon.item.Item;
import com.wialon.item.Resource;
import com.wialon.remote.RemoteHttpClient;
import com.wialon.remote.handlers.ResponseHandler;
import com.wialon.remote.handlers.SearchResponseHandler;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class GeozonePolygons implements Runnable {


    public static void main(String... args) {
        new Thread(new GeozonePolygons()).start();
    }

    @Override
    public void run() {
        Session session = Session.getInstance();
        session.initSession(API_URL);
        session.loginToken(API_TOKEN, new PrintErrorCallback() {
            @Override
            public void onSuccess(String response) {
                super.onSuccess(response);

                SearchSpec searchSpec = new SearchSpec();
                searchSpec.setItemsType(Item.ItemType.avl_resource);
                searchSpec.setPropName("sys_name");
                searchSpec.setPropValueMask("*");
                searchSpec.setSortType("sys_name");

                session.searchItems(searchSpec, 1, Item.dataFlag.base.getValue(),0, Integer.MAX_VALUE,
                        new SearchResponseHandler() {
                            @Override
                            public void onSuccessSearch(Item... items) {
                                super.onSuccessSearch(items);
                                final long resourceId = items[0].getId();

                                final RemoteHttpClient httpClient = getPrivateSessionField(session, RemoteHttpClient.class, "httpClient");
                                final Gson gson = getPrivateSessionField(session, Gson.class, "gson");
                                final JsonParser jsonParser = getPrivateSessionField(session, JsonParser.class, "jsonParser");

                                httpClient.remoteCall("core/search_items", "{\"spec\":" + gson.toJson(searchSpec)
                                        + ",\"force\":1,\"flags\":" + (Item.dataFlag.base.getValue() | Resource.dataFlag.zones.getValue())
                                        + ",\"from\":" + 0
                                        + ",\"to\":" + Integer.MAX_VALUE + "}", new ResponseHandler(new PrintErrorCallback()) {
                                    public void onSuccess(String response) {
                                        try {
                                            final List<Long> geozoneIds = parseGeozoneIds(jsonParser, response);
                                            JsonObject params = new JsonObject();
                                            params.add("itemId", new JsonPrimitive(resourceId));
                                            JsonArray cols = new JsonArray();
                                            geozoneIds.forEach(cols::add);
                                            params.add("cols", cols);
                                            params.add("flags", new JsonPrimitive(24L));

                                            httpClient.remoteCall("resource/get_zone_data", params, new ResponseHandler(new PrintErrorCallback()) {
                                                @Override
                                                public void onSuccess(String response) {
                                                    System.out.println(response);
                                                }
                                            });
                                        } catch (RuntimeException e) {
                                            this.onFailure(0, e);
                                        }
                                    }
                                });
                            }
                        }
                );
            }
        });
    }

    private List<Long> parseGeozoneIds(JsonParser jsonParser, String response) {
        JsonElement jsonElement = jsonParser.parse(response);
        if (!jsonElement.isJsonObject()) {
            throw new RuntimeException("JsonObject expected.");
        }
        JsonObject responseObject = jsonElement.getAsJsonObject();
        if (!responseObject.has("items")) {
            throw new RuntimeException("Property 'items' expected.");
        }
        JsonElement itemsElement = responseObject.get("items");
        if (!itemsElement.isJsonArray()) {
            throw new RuntimeException("JsonArray 'items' expected.");
        }
        JsonArray items = itemsElement.getAsJsonArray();
        if (items.size() == 0) {
            return Collections.emptyList();
        }
        List<Long> geozoneIds = new ArrayList<>();
        for (JsonElement itemElement : items) {
            if (!itemElement.isJsonObject()) {
                throw new RuntimeException("Array of objects expected.");
            }
            JsonObject item = itemElement.getAsJsonObject();
            if (!item.has("zl")) {
                throw new RuntimeException("Property 'zl' expected. Item: " + item.toString());
            }
            JsonElement zlElement = item.get("zl");
            if (!zlElement.isJsonObject()) {
                throw new RuntimeException("JsonObject 'zl' expected. Item: " + item.toString());
            }
            JsonObject zl = zlElement.getAsJsonObject();
            for (String key : zl.keySet()) {
                JsonElement zoneElement = zl.get(key);
                if (!zoneElement.isJsonObject()) {
                    continue;
                }
                geozoneIds.add(zoneElement.getAsJsonObject().get("id").getAsLong());
            }
        }
        return geozoneIds;
    }

    private <T> T getPrivateSessionField(Session session, Class<T> type, String name) {
        Field httpClientField = ReflectionUtils.findField(Session.class, name);
        ReflectionUtils.makeAccessible(httpClientField);
        return type.cast(ReflectionUtils.getField(httpClientField, session));
    }

    private class PrintErrorCallback extends ResponseHandler {
        @Override
        public void onFailure(int errorCode, Throwable throwableError) {
            super.onFailure(errorCode, throwableError);
            System.err.println(errorCode + ": " + Errors.getErrorText(errorCode));
        }
    }
}