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

48

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>

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

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

Ваш Ответ

2   ответа
-2

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

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

Например. если вы хотите отправить 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 } ... } }

Пользователь может видеть request.query в адресной строке своего браузера. Иногда мы хотим скрыть от пользователя те данные, которые мы транспортируем. Итак, мы по-прежнему предпочитаем POST-запросы
ОП проситrequest.bodyнеrequest.query, Вы упоминаетеPOST но вы все еще используетеrequest.get() в вашем примере кода.
О да, я понял. Но запрос и тело могут быть использованы как получить одинаковый результат. Я подумал, что ему было очень легко рассмотреть request.query в качестве альтернативы.
46

В целом, это не то, как системы используют 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'
Спасибо за дополнительное предложение добавить прокси, который преобразует POST в GET с телом. Я пытался реализовать это в .NET, но он выдает «ProtocolViolationException» исключение с ошибкой "Невозможно отправить тело содержимого с этим глаголом" ясно подчеркивая, что GET с телом просто не является случаем поддержки. Oliver Pearmain
Elasticsearch широко использует GET с телами
@EndangeredMassa, & quot; Если вы передаете данные вместе, это, вероятно, означает, что вы модифицируете некоторую модель или выполняете какое-то действие на сервере. Эти типы действий обычно выполняются с запросами POST. & Quot; не верно в общем случае. Запрос также может относиться к поисковому запросу, в котором модель не изменяется, и сервер выполняет поиск с аргументами, предоставленными в запросе. Эти запросы часто являются обычными запросами GET, например, вgoogle.com/search?q=REST,HTTP,GET,query .
Извините, я пропустил эту часть. Обновлен с некоторой дополнительной информацией, но это не обещает.
Хотя я ценю ваше мнение, оба предложения связаны с изменением услуги, которая, как я сказал, невозможна. Oliver Pearmain

Похожие вопросы