2012-01-06 2 views
5

RESTful 백엔드가있는 webapp의 경우 jquery의 $post을 사용하여 json을 서버에 게시하고 있습니다. 놀랍게도 json은 요청 본문 대신 요청의 양식 데이터에 대한 매개 변수 키에 채워집니다. 나는 약간의 other ways to do it을 생각할 수있다. 그러나 질문은 그것이 내가 예상했던대로 작동하지 않는 이유 다. 내가 scalatra를 사용하고 일부 요청 정보 인쇄 서버에서 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} 
============== 

을 그래서 캐릭터 라인 JSON 문자열 내가 단일 매개 변수 키에 박제 모든 것을 얻을 콜백으로 $ 포스트를 사용하는 경우. 이것이 정상적인 경우, 이유를 알고 싶습니다. 어떻게 서버에서이를 명확하게 풀어야하는지 알고 싶습니다. 정상적이지 않은 경우 $ post를 사용하여 응답 본문에서 가져 오기 위해해야 ​​할 일이 무엇인지 알고 싶습니다.

UPDATE하십시오 feature request for jquery to support contentType on $.post

답변

8

지금이 당신이 $.ajax

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

processData에 드롭 다운 경우이 작업을 수행 할 수 있다고 생각은 jQuery를 알 수없는 데이터와 주변의 혼란과 contentType을 설정하는 것이 있는지 확인해야합니다에 백엔드는 일반 URL 인코딩 형식이므로 json을 구문 분석하지 않습니다.

4

$ .post() 메서드가 application/x-www-form-urlencoded로 설정하는 콘텐츠 유형을 설정하지 않았습니다.

$ .ajax()를 사용하고 content-type을 application/json으로 명시 적으로 설정하십시오.

감사합니다. Vincent.