2011-08-18 44 views
42

Tôi đang cố thực hiện cuộc gọi ajax từ jquery sang dịch vụ còn lại. Dịch vụ còn lại được sử dụng ngay từ hướng dẫn của blog của mkyong, cái này: http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/Cuộc gọi jQuery ajax tới dịch vụ REST

Dịch vụ hoạt động, nhưng khi tôi thực hiện cuộc gọi từ jQuery, trong Firebug có mã trạng thái 200, nhưng trong phần phản hồi , không có gì.

Đây là trang html với các cuộc gọi ajax:

<html> 
<head> 
    <script type="text/javascript" src="jquery-1.6.2.min.js"></script> 
</head> 

<body> 

<button id="ajax">ajax call</button> 
<button id="json">json</button> 

<script type="text/javascript"> 
    $('#json').click(function(){ 
     alert('json'); 
     $.getJSON("http://localhost:8080/restws/json/product/get", 
     function(data) { 
      alert(data);   
      }); 
    }); 

    $('#ajax').click(function(){ 
     alert('ajax'); 
     $.ajax({ 
      type: "GET", 
      dataType: "json", 
      url: "http://localhost:8080/restws/json/product/get", 
      success: function(data){   
       alert(data); 
      } 
     }); 
    }); 

</script> 



</body> 

</html> 

Tôi không thể hình dung nó ra nơi tôi đã đi sai, bạn có thể vui lòng cho tôi biết những gì tôi đang làm sai?

Cảm ơn!

+1

Trang web của bạn chạy trên 'http: // localhost: 8080' không? Nếu không ('http: // localhost /' là [* not * giống nhau] (http://en.wikipedia.org/wiki/Same_origin_policy)), bạn sẽ phải tạo đầu ra API của mình [JSONP] (http://en.wikipedia.org/wiki/JSONP). –

+0

không, nó chỉ là một html đơn giản, nó đang chạy trên nhấp đúp: D – DaJackal

+0

Ý tôi là, URL trỏ đến trang này là gì? –

Trả lời

76

Bạn đang chạy HTML của mình từ một máy chủ khác với máy chủ mà bạn đang yêu cầu. Bởi vì điều này, bạn đang bị chặn bởi same origin policy.

Một cách xung quanh việc này là sử dụng JSONP. Điều này cho phép yêu cầu qua nhiều trang web.

Trong JSON, bạn được trả về:

{a: 5, b: 6} 

Trong JSONP, JSON được gói trong một cuộc gọi chức năng, vì vậy nó trở thành một kịch bản, và không phải là một đối tượng.

callback({a: 5, b: 6}) 

Bạn cần phải chỉnh sửa dịch vụ REST của bạn để chấp nhận một tham số gọi callback, và sau đó sử dụng các giá trị của tham số đó là tên hàm. Bạn cũng nên thay đổi content-type thành application/javascript.

Ví dụ: http://localhost:8080/restws/json/product/get?callback=process nên đầu ra:

process({a: 5, b: 6}) 

Trong JavaScript, bạn sẽ cần phải nói với jQuery để sử dụng JSONP. Để thực hiện việc này, bạn cần phải thêm ?callback=? vào URL.

$.getJSON("http://localhost:8080/restws/json/product/get?callback=?", 
    function(data) { 
    alert(data);   
    }); 

Nếu bạn sử dụng $.ajax, nó sẽ tự động thêm các ?callback=? nếu bạn nói với nó để sử dụng jsonp.

$.ajax({ 
    type: "GET", 
    dataType: "jsonp", 
    url: "http://localhost:8080/restws/json/product/get", 
    success: function(data){   
    alert(data); 
    } 
}); 
+1

nó hoàn hảo bây giờ làm việc, và tôi nghĩ rằng tôi hiểu. cảm ơn – DaJackal

+0

Bạn được chào đón. JSONP là loại 'hack' để lấy dữ liệu từ các URL khác, nó khá tuyệt. –

+0

tôi nhận được phản hồi ngay bây giờ trong firebug, nhưng nó không nhập vào chức năng (dữ liệu). bạn có biết tại sao? – DaJackal

1

Từ việc sử dụng 8080 Tôi giả sử bạn đang sử dụng thùng chứa servlet tomcat để phục vụ phần còn lại của bạn. Nếu đây là trường hợp bạn cũng có thể xem xét để có máy chủ web proxy của bạn các yêu cầu vào thùng chứa servlet.

Với apache, bạn thường sử dụng mod_jk (mặc dù có các lựa chọn thay thế khác) để phục vụ api máng máy chủ web phía sau cổng 80 thay vì 8080 sẽ giải quyết vấn đề miền chéo.

Đây là thực tiễn phổ biến, có nội dung 'tĩnh' trong máy chủ web và nội dung động trong vùng chứa, nhưng cả hai được phân phát từ phía sau cùng một miền.

Url cho api phần còn lại sẽ là http://localhost/restws/json/product/get

Dưới đây là một mô tả về cách sử dụng mod_jk để kết nối apache tomcat: http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

-2

Tôi nghĩ không cần phải xác định

'http://localhost:8080`" 

trong phần URI .. bởi vì. nếu bạn chỉ định nó, bạn sẽ phải thay đổi nó theo cách thủ công cho mọi môi trường.

Chỉ

"/restws/json/product/get" also works 
+0

Vì vậy, không liên quan, phải không? – OverCoder

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