Как отправить данные в теле запроса с помощью GET при использовании jQuery $ .ajax ()

API сервиса, который я использую, имеет определенный метод GET, который требует, чтобы данные отправлялись в теле запроса.

Данные, требуемые в теле, представляют собой список идентификаторов, разделенных символом hypen, и они могут быть очень большими, и поэтому они должны быть отправлены в теле, иначе они, вероятно, будут где-то в цепочке браузеров / прокси / веб-серверов и т. Д. Примечание. У меня нет контроля над службой или API, поэтому не вносите предложения по ее изменению.

Я использую следующий код jQuery, однако, наблюдая запрос / ответ в Fiddler, я вижу, что «данные» Я отправляю, ВСЕГДА конвертируется и добавляется в строку запроса, несмотря на то, что я установил & quot; processData & quot; вариант ложного ...

<code>$.ajax({
   url: "htttp://api.com/entity/list($body)",
   type: "GET",
   data: "id1-id2-id3",
   contentType: "text/plain",
   dataType: "json",
   processData: false, // avoid the data being parsed to query string params
   success: onSuccess,
   error: onError
});
</code>

Кто-нибудь знает, как я могу форсировать «данные» значение для отправки в теле запроса? Любая помощь приветствуется, спасибо заранее.

 Oliver Pearmain25 июн. 2012 г., 13:24
По сути, это просто невозможно, поскольку, как говорили люди, это не является частью спецификации HTTP. В конце концов нам пришлось поместить идентификаторы в строку запроса и пролистать результаты, чтобы они не стали слишком длинными. Я приму ответ, который был дан, спасибо EndangerredMassa.
 sandstrom10 апр. 2014 г., 20:02
Хотя это и не стандартно, бывают случаи, когда это полезно. При отправке в кодировке тела GET utf-8 или для передачи больших тел JSON. Elastic Search широко использует этот стиль.
 Brad Christie24 апр. 2012 г., 15:31
"в теле"? Единственное, что я могу вспомнить об этом событииremotely близко к тому, что вы просите, это POST-запрос ... (POST /path HTTP/1.0\r\n<headers>\r\n\r\n<post_vars>)
 Nikhil24 апр. 2012 г., 15:46
Если API является общим и соответствует спецификациям HTTP, я не думаю, что он примет параметры, отправленные в теле запроса GET, даже если вам удастся это сделать. Вы уверены, что? Полезный постstackoverflow.com/questions/978061/http-get-with-request-body

Ответы на вопрос(2)

Решение Вопроса

В целом, это не то, как системы используют GET-запросы. Таким образом, вам будет сложно заставить ваши библиотеки подыгрывать. На самом деле,спекуляция говорит, что "если метод запроса является регистрозависимым совпадением для GET или HEAD, действуйте так, как если бы данные были нулевыми." Поэтому я думаю, что вам не повезло, если браузер, который вы используете, не соблюдает эту часть спецификации.

Вероятно, вы можете настроить конечную точку на своем сервере для ajax-запроса POST, а затем перенаправить ее в коде вашего сервера на GET-запрос с телом.

Если вы абсолютно не привязаны к запросам GET, а тело является данными, у вас есть два варианта.

POST with data: Это, вероятно, то, что вы хотите. Если вы передаете данные вместе, это, вероятно, означает, что вы модифицируете некоторую модель или выполняете какое-то действие на сервере. Эти типы действий обычно выполняются с запросами POST.

GET with query string data: Вы можете преобразовать свои данные в параметры строки запроса и таким образом передать их на сервер.

url: 'somesite.com/models/thing?ids=1,2,3'
 21 апр. 2016 г., 15:11
Elasticsearch широко использует GET с телами
 25 апр. 2012 г., 16:48
Извините, я пропустил эту часть. Обновлен с некоторой дополнительной информацией, но это не обещает.
 Oliver Pearmain25 апр. 2012 г., 10:49
Хотя я ценю ваше мнение, оба предложения связаны с изменением услуги, которая, как я сказал, невозможна.
 Oliver Pearmain11 мая 2012 г., 14:57
Спасибо за дополнительное предложение добавить прокси, который преобразует POST в GET с телом. Я пытался реализовать это в .NET, но он выдает «ProtocolViolationException» исключение с ошибкой "Невозможно отправить тело содержимого с этим глаголом" ясно подчеркивая, что GET с телом просто не является случаем поддержки.
 10 нояб. 2017 г., 16:56
@EndangeredMassa, & quot; Если вы передаете данные вместе, это, вероятно, означает, что вы модифицируете некоторую модель или выполняете какое-то действие на сервере. Эти типы действий обычно выполняются с запросами POST. & Quot; не верно в общем случае. Запрос также может относиться к поисковому запросу, в котором модель не изменяется, и сервер выполняет поиск с аргументами, предоставленными в запросе. Эти запросы часто являются обычными запросами GET, например, вgoogle.com/search?q=REST,HTTP,GET,query .

На всякий случай, если кто-то все еще задается этим вопросом:

В любом запросе есть объект запроса тела. Вам не нужно разбирать его самостоятельно.

Например. если вы хотите отправить accessToken от клиента с помощью GET, вы можете сделать это следующим образом:

const request = require('superagent');

request.get(`http://localhost:3000/download?accessToken=${accessToken}`).end((err, res) => {
  if (err) throw new Error(err);
  console.log(res);
});

Объект запроса к серверу выглядит следующим образом{request: { ... query: { accessToken: abcfed } ... } }

 15 июн. 2018 г., 01:49
Пользователь может видеть request.query в адресной строке своего браузера. Иногда мы хотим скрыть от пользователя те данные, которые мы транспортируем. Итак, мы по-прежнему предпочитаем POST-запросы
 19 дек. 2017 г., 23:20
ОП проситrequest.bodyнеrequest.query, Вы упоминаетеPOST но вы все еще используетеrequest.get() в вашем примере кода.
 22 янв. 2018 г., 15:40
О да, я понял. Но запрос и тело могут быть использованы как получить одинаковый результат. Я подумал, что ему было очень легко рассмотреть request.query в качестве альтернативы.

Ваш ответ на вопрос