2010-10-05 38 views
34

Tôi cần thực hiện yêu cầu POST jsonp với loại nội dung 'application/json'. Tôi có thể lấy yêu cầu POST đến server như thế này:Làm thế nào để thực hiện một yêu cầu POST jsonp chỉ định contentType với jQuery?

 jQuery.ajax({ 
     type: 'POST', 
     url: url, 
     data: data, 
     success: success, 
     error: error, 
     async: true, 
     complete: complete, 
     timeout: TIMEOUT, 
     scriptCharset: 'UTF-8', 
     dataType: 'jsonp', 
     jsonp: '_jsonp', 
     }); 

Nhưng ngay sau khi tôi thêm dòng: contentType: "application/json" nó bắt đầu gửi nó như một OPTIONS yêu cầu chứ không phải là POST.

Tôi làm cách nào để chỉ định loại nội dung và vẫn gửi yêu cầu làm POST?

+0

URL có trong miền của bạn không? Quay trở lại định dạng nào? – SLaks

Trả lời

51

Không thể thực hiện yêu cầu POST JSONP.

JSONP hoạt động bằng cách tạo thẻ <script> thực thi Javascript từ một tên miền khác; không thể gửi yêu cầu POST bằng cách sử dụng thẻ <script>.

+0

Nếu tôi bỏ qua contentType, yêu cầu được thực hiện và máy chủ sẽ nhận được yêu cầu đó dưới dạng POST. – Marcus

+6

Vâng, jQuery quay trở lại XMLHttpRequest vì bạn không thể POST thông qua '

0

Có giải pháp (hack) tôi đã thực hiện nhiều lần, bạn sẽ có thể Đăng với JsonP. (Bạn sẽ có thể Đăng Mẫu, lớn hơn 2000 char hơn bạn có thể sử dụng bằng cách GET)

ứng dụng Client Javascript

$.ajax({ 
    type: "POST", // you request will be a post request 
    data: postData, // javascript object with all my params 
    url: COMAPIURL, // my backoffice comunication api url 
    dataType: "jsonp", // datatype can be json or jsonp 
    success: function(result){ 
    console.dir(result); 
    } 
}); 

JAVA:

response.addHeader("Access-Control-Allow-Origin", "*"); // open your api to any client 
response.addHeader("Access-Control-Allow-Methods", "POST"); // a allow post 
response.addHeader("Access-Control-Max-Age", "1000"); // time from request to response before timeout 

PHP:

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST'); 
header('Access-Control-Max-Age: 1000'); 

Làm như thế này, bạn đang mở máy chủ của mình cho bất kỳ yêu cầu đăng bài nào, bạn nên đảm bảo lại điều này bằng cách cung cấp mã nhận diện hoặc thông tin khác.

Với phương pháp này, bạn cũng có thể thay đổi kiểu yêu cầu từ jsonp để json, cả hai công việc, chỉ cần đặt các câu trả lời đúng nội dung loại

jsonp

response.setContentType("text/javascript; charset=utf-8"); 

json

response.setContentType("application/json; charset=utf-8"); 

Xin lưu ý rằng bạn không phải là máy chủ sẽ không tôn trọng SOP (cùng một orig) trong chính sách), nhưng ai quan tâm?

+3

Tôi nghĩ rằng những gì bạn đang nói về thực sự là sử dụng CORS. Bằng cách thiết lập các tiêu đề bạn đang kích hoạt máy khách để khởi tạo một yêu cầu CORS. Tôi sẽ không nhất thiết phải mô tả rằng như là một "hack"; đó là cách nó nên được thực hiện. Hơn nữa, tôi sẽ không khuyên bạn nên sử dụng "*" nhưng thay vào đó lặp lại nguồn gốc của khách hàng và thực hiện kiểm tra danh sách trắng trên máy chủ. Xem tại đây để biết thêm chi tiết: http://enable-cors.org/server.html – occasl

5

Sử dụng json trong dataType và gửi như thế này:

 $.ajax({ 
      url: "your url which return json", 
      type: "POST", 
      crossDomain: true, 
      data: data, 
      dataType: "json", 
      success:function(result){ 
       alert(JSON.stringify(result)); 
      }, 
      error:function(xhr,status,error){ 
       alert(status); 
      } 
     }); 

và đưa dòng này trong tập tin của bạn phía máy chủ:

nếu PHP:

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST'); 
header('Access-Control-Max-Age: 1000'); 

nếu java:

response.addHeader("Access-Control-Allow-Origin", "*"); 
response.addHeader("Access-Control-Allow-Methods", "POST"); 
response.addHeader("Access-Control-Max-Age", "1000"); 
+0

Có vấn đề an toàn nào liên quan đến vấn đề này không? – Notflip

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