jQuery не удается отправить массивы как тип содержимого JSON

#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 .