JQuery, отправьте объект JSON с использованием метода GET
Я пытаюсь отправить объект json с использованием метода GET. Мой код:
$.ajax({
url: "/api/endpoint",
type: "GET",
data: {"sort":"date"},
contentType: "application/json",
dataType: "json",
...
Однако полученные заголовки имеют значение "Content-Length" равным нулю, поэтому мой json-парсер на сервере не читает содержимое.
Я уже пробовал устанавливать заголовок длины содержимого, но он все равно приходит на сервер как ноль:
$.ajax({
url: "/api/endpoint",
headers: {"CONTENT_LENGTH",JSON.stringify({"sort":"date"}).length},
type: "GET",
data: {"sort":"date"},
contentType: "application/json",
dataType: "json",
...
Любая идея, как это сделать? Он должен быть запросом GET.
Ответы
Ответ 1
Запросы GET (как минимум обычно) не имеют тела сообщения. Как упоминалось в docs, jQuery добавляет data
запросов GET к параметрам url. Вы должны быть в состоянии прочитать свой параметр sort
там с вашим серверным приложением.
BTW, ни один пользовательский агент не позволит вам установить заголовок Content-Length
- он будет (и должен) выполняться автоматически в зависимости от отправленных данных.
Ответ 2
Есть несколько мест, где вы немного ошибались.
- Это не
CONTENT_LENGTH
, его Content-Length
.
- Не устанавливайте заголовок
Content-Length
, браузер сделает это за вас.
- Получить запрос имеет длину содержимого = 0.
Что-то вроде ниже должно работать для вас:
$.ajax({
url: "/api/endpoint?parameters="+encodeURIComponent(JSON.stringify({"sort":"date"})),
type: "GET",
...
});
Ответ 3
Я думаю, вы должны использовать JSON.stringify для параметров GET в URL-адресе следующим образом:
$.ajax({
url: "/api/endpoint?parameters="+JSON.stringify({"sort":"date"}),
type: "GET",
contentType: "application/json",
dataType: "json",
...
Ответ 4
Как упоминалось Bergi, данные преобразуются jQuery.ajax()
для запроса параметров.
Из jQuery 1.7.2:
// Determine if request has content
s.hasContent = !rnoContent.test( s.type ); --> false when s.type == "GET'
...
if ( !s.hasContent ) {
// If data is available, append data to url
if ( s.data ) {
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
// #9682: remove data so that it not used in an eventual retry
delete s.data;
}