Передача списка упакованных примитивов в Google Cloud Endpoint

Я борюсь со списками в качестве параметров метода в конечных точках Google Cloud.

В документации сказано, что

Поддерживаются следующие типы параметров:

  • java.util.Collection типа параметра

Я пытался сделать это таким образом, но это просто не работает. Основной метод конечной точки:

@ApiMethod(name = "testMethod", httpMethod = HttpMethod.POST)
public void testMethod(@Named("longList") List<Long> longList) {
    for (Long aLong : longList) {
        if (aLong < 5) {
            throw new IllegalArgumentException("You can't do it");
        }
    }
}

Когда я выполняю этот метод с помощью API Explorer, сгенерированный URL-адрес:

POST http://localhost:8080/_ah/api/billEndpoint/v1/testMethod?longList=5&longList=6

И метод выполняется правильно.

Но когда используется библиотека Android, URL-адрес изменяется на:

http://APP_ENGINE_BACKEND:8080/_ah/api/billEndpoint/v1/testMethod/5,6

и конечная точка возвращает код 404.

Возможно ли иметь List в качестве параметра метода, и если это то, что я делаю неправильно?


person pawelbial    schedule 18.08.2014    source источник


Ответы (2)


Пожалуйста, добавьте аннотацию @Nullable к вашему методу, которая превратит ваш параметр типа коллекции из пути в параметр запроса.

https://developers.google.com/appengine/docs/java/endpoints/annotations#nullable

person bao    schedule 18.08.2014
comment
Ну... Это сработало, но это очень странный способ решить эту проблему. Действительно похоже, что это не баг, а фича. Тем более, что параметры у моих методов не могут быть нулевыми. - person pawelbial; 19.08.2014
comment
Это немного странно, потому что аннотация называется @Nullable, но более подходящим именем должно быть что-то вроде @QueryParameter, потому что использование этой аннотации изменяет обработку параметра в URL-адресе конечной точки с параметра пути на параметр запроса, поэтому формат URL изменяется с endpointurl/param на endpointurl?parameter=param - person Price; 13.10.2014
comment
Имейте в виду, что вам также нужно использовать методы set() для параметров вместо обычных параметров метода. Поэтому вместо api.testMethod(longList).execute(); Вы бы сделали api.testMethod().setLongList(longList).execute() - person aaronvargas; 06.08.2016

Более прямой способ — добавить свойство пути в аннотацию API_METHOD и не включать параметр List в путь. Как указано здесь: "Если путь указан, параметры можно запросить параметры, не включая их в путь"

В вашем случае это должно выглядеть так:

@ApiMethod(name = "testMethod", path="testMethod" httpMethod = HttpMethod.POST)

person Boaz    schedule 12.01.2015