#javascript #ajax #json #jquery
#javascript #ajax #json #jquery
Вопрос:
Я использую скрипт, который выглядит следующим образом:
$.ajax({
url: 'myservice',
type: 'POST',
contentType: 'application/json',
data: ["test"],
});
Однако это вызывает запрос на myservice/?undefined=undefined
, который, вероятно, указывает на то, что jQuery принимает данные за карту. Есть ли какой-либо способ обойти это? Есть ли способ сериализовать данные вручную (предпочтительно, не прибегая к каким-либо сторонним библиотекам)?
Я протестировал свой сервис вручную, и он корректно работает с такими данными, как ["test"]
.
РЕДАКТИРОВАТЬ: ошибка, касающаяся метода запроса.
РЕДАКТИРОВАТЬ (2): Интересно, теперь это вызывает 400 Bad request
. Однако, если я переключусь на '["test"]'
(строка), это сработает. Я использую jQuery 1.5.2.
Ответ №1:
измените method: 'POST'
на type: 'POST'
Редактировать: для data
вы должны использовать либо строку запроса example=testamp;examplex=test2
, либо объект javascript {example: "test", examplex: "test2"}
Комментарии:
1. Я изменил это, и теперь это вызывает НЕВЕРНЫЙ ЗАПРОС (см. Мою правку). Думаю, мне придется преобразовать его вручную. Примечание: служба поддерживает как GET, так и POST, поэтому проблемы не было.
Ответ №2:
$.ajax({
url: 'myservice',
method: 'POST',
contentType: 'application/json',
data: '["test"]',
});
Обратите внимание, что вам нужно передать json в виде строки.
Если ваш json сложный, вы всегда можете использовать stringify от Crockford.
Комментарии:
1. Если
data
это не строка, jQuery преобразует ее.2. Я не думаю, что это применимо к json, Адам. Пожалуйста, предоставьте мне пример / ссылку. Я только что попробовал это.
3. Интересно — я исходил из своего понимания этого. Из описания данных jQuery в api.jquery.com/jQuery.ajax — «Преобразуется в строку запроса, если она еще не является строкой». Если данные json представляют собой строку, наверняка jQuery потребуется преобразовать их в объект, чтобы затем преобразовать в строку запроса (или другого типа)?
4. Это работает с объектом, если вы хотите, чтобы данные отправлялись в виде обычных пар имя-значение.
Ответ №3:
данные должны быть объектом типа:
{var1: 'test', var2: 'test'}
Кроме того, я думаю, вы можете сделать свой ContentType просто: ‘json’
Если вам нужно сериализовать форму и отправить значения, в jQuery есть функция для этого:
$("formId").serialize();
смотрите Эту ссылку
Комментарии:
1. Ну, дело в том, что он не может быть такого формата, так как на стороне сервера требуется другой формат. Насколько я понимаю,
["test"]
это допустимый JSON, или я ошибаюсь?2. Данные предоставляются вручную, они не поступают из формы. Также
serialize()
выдаетapplication/x-www-form-urlencoded
3. Данные jQuery должны быть объектом (как говорит Эль Гуапо), но будут преобразованы в тип содержимого, указанный в
content
, который, как указано выше, должен быть ‘json’4. Да, это допустимая запись для массива со значением 1 («test»)… в любом случае … если вы не передадите истинную строку запроса, jQuery попытается создать ее для вас…
5. Указание
contentType: 'json'
причинUNSUPPORTED MEDIA TYPE
.