Свойството string има стойност, която е твърде дълга. Не може да надвишава 500 знака

Току-що се опитах да изпратя дълъг параметър String към метода на крайната точка. Един от параметрите е List<String>, който съдържа голям брой стойности, които изглеждат така:

105969550886996847196,109334384788152421649,109172191656045871108,... and more

Самият метод е много прост:

@ApiMethod(name = "getFullObjects")
public MyObject getFullObjects(List<String> ids) {
    //body not relevant
}

Извежда това:

Error Code: 400
Reason: badRequest
Message: java.lang.IllegalArgumentException: The string property ids has a value that is too long. It cannot exceed 500 characters.

Наистина ли не мога да предам повече от 500 знака в един параметър? Би било ужасно... :/

Има ли начин да надхвърлите това ограничение или да предадете тези данни по друг начин?

ЗАБЕЛЕЖКА:

Този метод на крайна точка си сътрудничи с приложението за Android!

БЕЛЕЖКА 2:

Ако наистина, наистина има ограничение от 500 знака за параметъра на крайната точка, което не мога да намеря в никаква документация за GAE, просто се чудя как има списък с допустими обекти... някои от тях със сигурност ще отнемат повече от 500 знака след сериализиране в низ.


person Jacek Kwiecień    schedule 29.05.2014    source източник


Отговори (2)


@Xylian, за да заобиколите ограничението, можете или да разбиете своя низ на множество параметри, или да играете с @ApiTransformer, за да заобиколите ограничението.

Други опции, които имате:

  • Ограничете броя на знаците, които изпращате във всеки един от низа. Вместо да изпращате низове с дължина 21 знака, можете да изпратите само числа (1, 2, 10...), за да представите тези идентификатори (или каквито и да са те), след което да имате таблица за съпоставяне на сървъра, за да "преобразувате" тези кратки идентификатори към дългия ID.

  • Групирайте няколко извиквания към API, за да избегнете превишаване на квотата само с едно извикване.

person svpino    schedule 29.05.2014
comment
Не мисля, че мога да го разделя на множество параметри, защото размерът на списъка е динамичен, никога няма да разбера колко параметри са ми необходими. - person Jacek Kwiecień; 30.05.2014
comment
Е, тогава ще трябва да направите няколко извиквания към API или да намалите размера на низовете. За съжаление няма друг начин за заобикаляне на ограничението. - person svpino; 30.05.2014
comment
Това би било много тъжно... все пак този отговор е най-близък до правилния (все пак не е много полезен :/). Чудно кой го е минусовал... - person Jacek Kwiecień; 30.05.2014
comment
Или... вижте отговора ми ;) - person Jacek Kwiecień; 30.05.2014
comment
Ограничението може да е само до едно поле, но не и общия размер на обекта (A String[] може да се третира като едно поле). Не съм сигурен обаче, тъй като не успях да намеря никаква документация, свързана с това. - person svpino; 30.05.2014

Мисля, че намерих възможно най-доброто решение.

Но първо...

Тъй като групата за разработчици на Google App Engine беше изоставена от служители на Google и преместена тук, официално я публикувам като грешка. Това е нелепо ограничение, което дразни само сериозните разработчици и просто трябваше да го заобиколя. Моля, премахнете недокументираното ограничение от 500 символа в параметъра на метода на крайната точка!

Тогава към решението...

Реших да дефинирам нов сървлет, който да обработва това вместо метод на крайна точка. Ето го:

public class LongParamTestServlet extends HttpServlet {


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String paramsString = req.getParameter("params");
        resp.getWriter().write("string length: " + paramsString.length());
    }
}

След това направих заявка към този сървлет с някакъв много дълъг параметър...

А сега отговорът...

string length: 1664

Виола! Току-що предадено на моя бекенд параметър на Google App Engine с дължина 1664. Просто ще го сериализирам като json и също ще върна json в отговор. Не е толкова удобен като метод на крайна точка, но работи.

person Jacek Kwiecień    schedule 29.05.2014