Передать данные POST в формате JSON для запуска вычислительной задачи 2.7

#json #rest #jetty #ignite

#json #rest #причал #ignite

Вопрос:

У меня сложный запрос API, который должен передавать данные JSON в Ignite ComputeTask, но, похоже, я могу передавать данные только через строку запроса URL, что кажется неудобным и потенциально ограничивающим. У меня есть два вопроса:

  1. Имеет ли Ignite REST API максимальный предел запроса GET, и если да, есть ли способ увеличить его?

  2. Есть ли какой-либо способ передать данные JSON через POST-запрос? Я экспериментировал с ConnectorMessageInterceptor , но args параметром является просто значение p1 из строки запроса.

Ответ №1:

  1. Если вы согласны с передачей данных JSON в качестве параметра GET, вы можете установить максимальный размер GET в вашей конфигурации jetty в конфигурации вашего соединителя с помощью <Set name="requestHeaderSize">BYTES</Set> , хотя это явно не оптимальное решение.

  2. Короткий ответ — нет, во встроенном REST API Ignite нет встроенного способа перехватывать данные тела JSON POST. Хотя документация Ignite предполагает, что вы настраиваете обработчики Jetty, реализация Jetty в Ignite 2.7 (см. GridJettyRestProtocol ) фактически переопределяет настроенный обработчик своим собственным GridJettyRestHandler , который принимает запросы только в форме /ignite?cmd=cmdNameamp;p1=paramsamp;name=TaskName. Чтобы обойти это, вы можете удалить библиотеку ignite-rest-http и внедрить собственную реализацию jetty. Если это кажется слишком трудоемким и вы не возражаете против несколько хакерского решения, вы можете использовать необязательную структуру библиотеки ignite и скопировать только файл org.apache.ignite.internal.processors.rest.protocols.http.jetty.GridJettyRestProtocol из библиотеки ignite-rest-http, которую Ignite автоматически обнаружит при запуске. GridJettyRestProtocol Замените GridJettyRestHandler на свой собственный, AbstractHandler который принимает данные POST. Не забудьте импортировать jetty как зависимость проекта.

Ответ №2:

  1. Вы можете предоставить свою собственную конфигурацию Jetty, которая, вероятно, позволит вам настроить ограничение на получение запроса.
  2. Вы действительно пытались выполнить POST с application/x-www-form-urlencoded помощью inside?

Комментарии:

1. Я пробовал запрос с Content-Type: application/json и данными json в теле сообщения.

2. Re 1 — это тоже действительно не отвечает на мой вопрос — пожалуйста, укажите соответствующий параметр конфигурации.

3. Content-Type: application/json определенно не сработает, и это не то, что я предлагал.