Почему jquery публикует json как имя параметра, а не как тело запроса? - PullRequest
6 голосов
/ 06 января 2012

Для веб-приложения с бэкэндом RESTful я отправляю некоторые json на сервер, используя $ post jquery.Теперь, к моему удивлению, json вставляется в ключ параметра для данных формы запроса, а не в тело запроса.Я могу подумать о некоторых других способах сделать это , но вопрос в том, почему это не работает так, как я ожидаю.

На сервере я использую скалатру и печатаю некоторую информацию запроса:

println("Request received:")
println(fromInputStream(request.getInputStream).getLines().mkString)
println("--------------")
println(request.getParameterMap.toString)
println("==============")

Теперь простой локон, который делает то, что я считаю правильным:

curl -X POST http://localhost:8080/x -H "Content-Type: application/json" -d '{"a":"b"}'

Производит:

Request received:
{"a":"b"}
-------------
{}
==============

И немного html + js, чтобы проиллюстрироватьПроблема:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<body>
  <button type="button" onclick="doPost()">
    POST
  </button>
  <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
  <script type="text/javascript">
function doPost() {
    $.post("http://localhost:8080/x",     
           JSON.stringify({"a":"b"} ), 
           function(data) {});
}
  </script>
</body>
</html>

Производит:

Request received:

--------------
{{"a":"b"}=[Ljava.lang.String;@7a2897ac}
============== 

Так что, если я использую $ post со строковой строкой json и обратным вызовом, я получаю все содержимое в одном ключе параметра.Если это нормально, я хотел бы знать, почему и как я должен распутать это на сервере.Если это не нормально, я хотел бы знать, что мне нужно сделать, чтобы получить его в теле ответа с помощью $ post.

ОБНОВЛЕНИЕ: теперь есть запрос для jquery для поддержки contentTypeна $ .пост

Ответы [ 3 ]

10 голосов
/ 06 января 2012

Я думаю, вы можете сделать это, если опуститесь до $. Ajax

$.ajax(
  {
     url: "http://localhost:8080/x",
     data: JSON.stringify({a: 'b'}),
     processData: false,
     type: 'POST',
     contentType: 'application/json'
  }
);

processData говорит jquery не связываться с вашими данными, а установка contentType должна гарантировать, что ваш бэкэнд не будет пытаться проанализировать json как обычную форму в кодировке URL.

4 голосов
/ 06 января 2012

Вы не устанавливаете тип содержимого, из-за которого метод $ .post () устанавливает его в application / x-www-form-urlencoded.

Используйте $ .ajax () и установитеContent-Type для приложения / JSON явно.

С уважением, Винсент.

0 голосов
/ 06 января 2012

Винсент Партингтон прав, по умолчанию для contentType задано application / x-www-form-urlencoded

Вместо этого используйте непосредственно функцию jQuery.ajax или создайте собственную сокращенную запись.

Вытакже можно изменить сторону сервера, см., например, Spring 3 MVC - Advanced Binding Data - запрос формы со списком простых объектов .Но я бы просто использовал полную функцию AJAX.

...