2012-01-06 47 views
5

Đối với một webapp với một phụ trợ RESTful tôi đang gửi một số json đến máy chủ bằng cách sử dụng jquery's $post. Bây giờ ngạc nhiên của tôi, json được nhồi trong một khóa thông số cho dữ liệu biểu mẫu của yêu cầu, thay vì trong phần thân yêu cầu. Tôi có thể nghĩ về một số other ways to do it, nhưng câu hỏi là tại sao nó không hoạt động như tôi mong đợi.Tại sao jquery post json như một tên tham số thay vì là phần thân yêu cầu?

Trên máy chủ tôi sử dụng scalatra và in một số thông tin yêu cầu:

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

Bây giờ một curl đơn giản mà làm những gì tôi nghĩ là đúng:

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

Tạo:

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

Và bit html + js để minh họa sự cố:

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

Tạo:

Request received: 

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

Vì vậy, nếu tôi sử dụng $ bài với một chuỗi json chuyển đổi thành chuỗi và gọi lại tôi nhận được tất cả mọi thứ nhồi trong một chìa khóa thông số duy nhất. Nếu điều này là bình thường, tôi muốn biết tại sao, và làm thế nào tôi phải làm sáng tỏ điều này một cách rõ ràng trên máy chủ. Nếu nó không phải là bình thường, tôi muốn biết những gì tôi nên làm gì để có được nó trong cơ thể phản ứng bằng cách sử dụng $ post.

UPDATE: Hiện nay, một feature request for jquery to support contentType on $.post

Trả lời

8

Tôi nghĩ bạn có thể làm điều này nếu bạn thả xuống $.ajax

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

processData nói với jquery không mess xung quanh với dữ liệu của bạn và thiết lập contentType nên đảm bảo rằng chương trình phụ trợ của bạn không thử và phân tích cú pháp json vì đó là biểu mẫu được mã hóa url thông thường.

4

Bạn không đặt loại nội dung đang gây ra phương thức $ .post() để đặt thành ứng dụng/x-www-form-urlencoded.

Sử dụng $ .ajax() và đặt loại nội dung thành ứng dụng/json một cách rõ ràng.

Kính trọng, Vincent.

0

Vincent Partington là đúng, contentType mặc định được thiết lập để application/x-www-form-urlencoded

Sử dụng chức năng jQuery.ajax trực tiếp thay vì hoặc tạo viết tắt của riêng bạn.

Bạn cũng có thể thay đổi phía máy chủ, xem Spring 3 MVC - Advanced Data Binding - Form Request with List of Simple Objects chẳng hạn. Nhưng tôi sẽ chỉ sử dụng chức năng ajax đầy đủ.

Các vấn đề liên quan