2011-08-18 12 views
42

jqueryからrestサービスへのajaxコールを作成しようとしています。 http://www.mkyong.com/webservices/jax-rs/integrate-jackson-with-resteasy/jQuery ajaxのRESTサービスへの呼び出し

サービスは機能しますが、jQueryから電話をかけようとすると、Firebugには200個のステータスコードがありますが、レスポンスセクションには次のようなものがあります。 、何もない。ここで

は、AJAX呼び出しとhtmlページです:

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

は私が間違っていたところ、私はそれを把握することはできません、あなたは私が間違っているのを教えてくださいだろうか?

ありがとうございます!

+1

は、あなたのサイトは、http '上で実行されている:// localhostを:8080'にも?そうでない場合(http:// localhost /は[* not * same](http://en.wikipedia.org/wiki/Same_origin_policy))、API出力[JSONP]を作成する必要がありますhttp://en.wikipedia.org/wiki/JSONP)。 –

+0

いいえ、単なるHTMLですが、ダブルクリックで実行しています:D – DaJackal

+0

このページを指しているURLは何ですか? –

答えて

76

要求しているホストとは異なるホストからHTMLを実行しています。このため、same origin policyによってブロックされています。

これを回避する方法の1つはJSONPです。これにより、サイト間の要求が可能になります。 JSONで

は、あなたが返されますJSONPで

{a: 5, b: 6} 

は、JSONは、関数呼び出しに包まれているので、スクリプトではなく、対象となります。

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

あなたはcallbackと呼ばれるパラメータを受け入れるようにして、関数名として、そのパラメータの値を使用するようにRESTサービスを編集する必要があります。 content-typeapplication/javascriptに変更する必要があります。例えば

http://localhost:8080/restws/json/product/get?callback=processは出力する必要があります

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

あなたのJavaScriptでは、あなたはJSONPを使用するようにjQueryを指示する必要があります。これを行うには、URLに?callback=?を追加する必要があります。

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

あなたが$.ajaxを使用している場合は、jsonpを使用するように指示した場合、それは自動?callback=?を追加します。

+1

これは完璧な作業で、私は理解していると思います。ありがとうございます。 – DaJackal

+0

JSONPは他のURLからデータを取得するための「ハック」のようなものですが、かなりクールです。 –

+0

私は今すぐfirebugで応答を得るが、それはfunction(data)には入力しない。なぜなのかご存知ですか? – DaJackal

1

8080の使用から、私はtomcatサーブレットコンテナを使用して残りのAPIを提供していると仮定しています。この場合、サーブレットコンテナにWebサーバープロキシを要求することも考えられます。

Apacheの場合、クロスドメインの問題を解決する8080の代わりにポート80の背後にあるWebサーバーにapiトラフを提供するためにmod_jkを使用します(他の方法もあります)。

これは一般的なことですが、Webサーバーには「静的」コンテンツがあり、コンテナ内には動的コンテンツがありますが、どちらも同じドメインの背後から配信されます。

のREST APIのURLはここhttp://localhost/restws/json/product/get

TomcatにApacheを接続するためにmod_jkの使用方法についての説明を次のようになります。 http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

-2

私は

'http://localhost:8080`" 
を指定する必要はありませんだと思います

のURI部分にあるためです。指定した場合は、すべての環境で手動で変更する必要があります。

のみ

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

無関係なので、いいですか? – OverCoder

関連する問題