2010-11-19 19 views
4

jsonpリクエストのサーバー側とクライアント側の両方を作成しようとしていますが、動作させられないようです。私は数多くのガイドやブログの投稿などを見てきましたが、かなり多くの人がクライアント側だけを表示しています。JSONP - Access-Control-Allow-OriginとMIMEタイプのエラー

ここに私のクライアントコード

$.ajax({ 
    dataType: 'application/json', 
    data: params, 
    jsonp: 'jsonpCallback', 
    url: settings.domain + '/httpext.dll?json_cc', 
    success: function (data) { 
     //determine the return status 
    }, 
    error: function (response, status, error) { 
     //error handling 
    } 
}); //end ajax 

だ今、サーバはこの

jsonpCallback({"username":"meltingice","posts"1234}); 

のようなハードコーディングされた値を返している私の問題は、私が一緒に仕事する要求と応答を得ることができないということです。現在のところ、応答はapplication/jsonを返していますので、私がリクエストを変更した場合は、エラーがjsonpにあります。

リソースはスクリプトとして解釈されますが、MIMEタイプapplication/jsonで転送されます。 未知のReferenceError:jsonpCallbackが定義されていません

まず、jsonpCallbackが定義されています。

私はアプリケーション/ JSONにデータ型を変更した場合さて、その後、私はこのエラーを取得する

XMLHttpRequest cannot load http://myserver/httpext.dll?json_cc&sid=adsfhasjdkfhajksdghjk%3Basdhg&action=SALE&ccCard=&ccNum=&ccExMM=0&ccExYYYY=0&ccCVV2=&holdersName=&totalDue=0&dueDate=11%2F19%2F2010. Origin http://localhost:59905 is not allowed by Access-Control-Allow-Origin. 

あなたが見ることができるように、それはURLへcallback=?を入れていません。むしろイライラします。

jsonpを使用してサーバー側を設定するにはどうすればよいですか。応答タイプには何が必要ですか?私のクライアント側のコードがデータを引き戻すために返されるデータをどのようにフォーマットするのですか?

答えて

5

これは機能しない理由は、サーバーが常にハードコードされたメソッド名を返していて、クライアントが匿名のsuccessハンドラーを使用しているためです。これは動作しません。引数として渡されたメソッド名を使用するようにサーバーを構成する必要があります。そうしないと、クライアントでsuccessコールバックが呼び出されません。

$.getJSON(settings.domain + '/httpext.dll?json_cc&jsoncallback=?', params, function(result) { 
    alert('success'); 
}); 

今、サーバは次のようになります要求を受信します:

http://foo.com/httpext.dll?json_cc&jsoncallback=jsonp1290183992345 

、それあなたのアカウントにjsoncallbackクエリパラメータを取るようにサーバーを設定したら、あなたはこのようにそれをテストすることができ同様に、明らかに適切Content-Type

jsonp1290183992345({"username":"meltingice","posts"1234}); 

application/json):次のように応答する必要があります。

+0

デフォルトのコールバック名を取得するようにコードを変更しましたが、まだ他のエラーが発生しています。スクリプトとして解釈されるが、MIMEタイプapplication/jsonで転送されるリソース。 – Josh

1

また、私はASP.NET MVCでjsoncallbackを処理するために使用したこのスニペットを提供したかったのです。

private static ActionResult GetContent(object data, string callback) 
    { 
     if (!string.IsNullOrEmpty(callback)) 
     { 
      ContentResult result = new ContentResult(); 
      result.ContentType = "application/json"; 

      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      string json = serializer.Serialize(data); 
      result.Content = string.Format("{0}({1})", callback, json); 
      return result; 
     } 
     else 
     { 
      JsonResult result = new JsonResult(); 
      result.Data = data; 
      result.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
      return result; 
     } 
    } 
関連する問題