3

jQueryを介してFacebookAPIAdmin.getMetricsメソッドにアクセスしようとしています。サーバー側でリクエストURLを正しく作成しています(アプリを秘密にするため)。次に、を使用してリクエストするためにURLをブラウザに送信しjQuery.getJSON()ます。

Facebookでは、信頼性を検証するために、アプリケーションシークレットでハッシュされたすべてのリクエストパラメーターのコピーをリクエストと一緒に送信する必要があります。問題は、jQueryが、データが返されるときに呼び出される匿名関数に付ける名前と一致させるために、コールバック関数自体の名前を生成したいということです。したがって、関数の名前はjQuery.getJSON()実行されるまで使用できず、Facebookは、署名が一致しないために私の要求が不正であると見なします(実行されるまで生成されなかったため、送信する署名には正しいコールバックパラメーターが含まれていませんjQuery.getJSON())。

この問題から私が考えることができる唯一の方法は、関数をjQuery.getJSON()匿名のままにするのではなく、何らかの方法で関数の名前を指定することです。しかし、jQueryAPでそうするためのオプションを見つけることができません。

4

4 に答える 4

3

私のために仕事をした唯一のことは、次の設定でした

jQuery.ajax({ url: fbookUrl, dataType: "jsonp", type: "GET", cache: true, jsonp: false, jsonpCallback: "MyFunctionName" //insert here your function name });

于 2011-05-18T12:30:13.487 に答える
2

の使用はjQuery.getScript、答えに近い (完全ではない) ことが判明しました。getScript を使用すると、動的に名前が付けられた無名関数をリクエスト パラメータに追加する jQuery の必要性がなくなります (ただし、上記のコードのように無名関数を渡した場合でも、それは実行されます)。ただし、jQuery.getScriptjQuery の Ajax ライブラリの他のすべての呼び出しと同様に、デフォルトでは、さらに追加の引数を追加します_=12344567(ここで、1234567 は実際にはタイム スタンプです)。jQuery は、ブラウザが応答をキャッシュしないようにするためにこれを行います。ただし、この追加は、自動名前付きコールバック関数と同様に、リクエストの署名を壊します。

#jquery の助けを借りて、jQuery がパラメーターをまったく混乱させないようにする唯一のjQuery.Ajax方法は、次の引数を指定して base メソッドを使用して要求を行うことであることがわかりました。

jQuery.ajax({
  url: fbookUrl,
  dataType: "script",
  type: "GET",
  cache: true,
  callback: null,
  data: null
});

(fbookUrl署名とcallback=myFunction. このdataType: "script"引数は、実行のために結果の JSONP をページのスクリプト タグに詰め込む必要があることを指定しcache: true、ブラウザが応答をキャッシュできるようにする、つまりタイム スタンプ パラメータの追加をスキップするように jQuery に指示します。

于 2008-10-15T16:12:22.370 に答える
1

JSONP オプションを $.ajaxSetup に渡すことができます。これにより、呼び出される関数名を修正できます。ドキュメントは次のように読み取られます。

jsonp 文字列
jsonp リクエストでコールバック関数名をオーバーライドします。この値は、「callback=?」で「callback」の代わりに使用されます。GET の URL または POST のデータのクエリ文字列の一部。したがって、 {jsonp:'onJsonPLoad'} は 'onJsonPLoad=?' になります。サーバーに渡されます。

詳細については、 http://docs.jquery.com/Ajax/jQuery.ajax#optionsを参照してください。

于 2008-10-14T23:47:08.087 に答える
0

これは、固定コールバックを使用したより優れたソリューションです。

window.fixed_callback = function(data){
    alert(data.title);
};

$(function() {
    $.getScript("http://api.flickr.com/services/feeds/photos_public.gne?tags=cats&tagmode=any&format=json&jsoncallback=fixed_callback", function(data) {
    alert('done'); } );
});

このコールバックの問題は、関数がグローバルに登録されているため、一度に 1 種類のリクエストしか処理できないことです。コールバック関数は、おそらく、取得して適切な関数を呼び出すことができるさまざまな種類のデータのディスパッチャーに変わる必要があります。

于 2008-10-15T15:26:28.440 に答える