2008-10-14 3 views
3

jQuery를 통해 Facebook API Admin.getMetrics 메소드에 액세스하려고합니다. 나는 정확하게 서버 측에서 요청 URL을 작성하고있다 (내 앱의 비밀을 비밀로 유지하기 위해). 그런 다음 jQuery.getJSON()을 사용하여 요청할 브라우저로 URL을 보냅니다.

페이스 북은 내 인증을 확인하기 위해 요청과 함께 내 신청 비밀로 해시 된 모든 요청 매개 변수의 사본을 보내야합니다. 문제는 jQuery가 콜백 함수 자체의 이름을 생성하여 데이터가 반환 될 때 호출되도록 전달 된 익명 함수에 제공하는 이름을 일치 시키려고한다는 것입니다. 따라서 jQuery.getJSON()이 실행될 때까지는 함수의 이름을 사용할 수 없으며 Facebook은 일치하지 않는 서명으로 인해 내 요청이 본인이 아닌 것으로 간주합니다. (정확한 기호는 jQuery.getJSON()까지 생성되었으므로 정확한 콜백 매개 변수를 포함하지 않습니다.

이 문제를 해결할 수있는 유일한 방법은 내 기능의 이름을 익명으로 유지하는 대신 jQuery.getJSON()으로 지정하는 것입니다. 하지만 jQuery AP에서 그렇게 할 수있는 옵션을 찾을 수 없습니다.

답변

2

jQuery.getScript의 사용은 거의 답이 아니라는 것을 알게되었습니다. getScript를 사용하면 동적으로 명명 된 익명 함수를 요청 params에 추가해야하는 jQuery의 필요성이 제거됩니다 (앞의 코드에서와 같이 익명의 함수를 전달하면 계속 수행됩니다). 그러나 jQuery.getScript의 기본값은 jQuery의 Ajax 라이브러리에있는 다른 모든 호출과 마찬가지로 추가 인수 _=12344567 (1234567은 실제로 타임 스탬프 임)을 추가하는 것입니다. jQuery는 브라우저가 응답을 캐싱하지 못하도록하기 위해이 작업을 수행합니다. 그러나이 추가 기능은 자동 이름 붙은 콜백 함수와 마찬가지로 요청에 서명하는 것을 중단시킵니다. #jquery에 약간의 도움으로

, 나는 유일한 방법은 엉망에 전혀 PARAMS와 jQuery를 얻을 수있는 다음과 같은 인수와 함께 기본 jQuery.Ajax 방법을 사용하여 요청을하는 것입니다 배운 :

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

(fbookUrl은 Facebook API URL이며 서명과 callback=myFunction을 포함한 전체 매개 변수를 요청하려고합니다.) dataType: "script" arg는 결과 JSONP가 페이지의 스크립트 태그에 삽입되어 실행되도록 지정합니다. cache: true은 브라우저가 응답을 캐시 할 수 있도록 jQuery에 지시합니다.타임 스탬프 매개 변수의 추가를 건너 뜁니다.

+0

$ .ajaxSetup 추가 ({cache : true}); getScript를 호출하기 전에 _ = 12344567 매개 변수도 제거됩니다. – Duncan

+0

참. 이 방법은 한 번에 두 가지 작업을 모두 수행하며 동일한 페이지에서 수행 할 수있는 다른 jQuery Ajax 요청에 대해서는 우물을 독살하지 않는다. –

1

당신은 호출되는 함수 이름을 해결 할 수 $ .ajaxSetup에 JSONP 옵션을 전달할 수, 읽은 문서는 다음과 같이

JSONP 문자열
무시 A의 콜백 함수 이름을 jsonp 요청. 이 값은 '콜백 ='에서 '콜백'대신 사용됩니다. GET URL의 쿼리 문자열 일부 또는 POST 데이터입니다. 그래서 {jsonp : 'onJsonPLoad'}는 'onJsonPLoad =?' 서버로 전달됩니다.

은 자세한 내용

+0

이었다 그 물음표의 다른 쪽과 따라서 서명 된 요청과 일치하지 않는 매개 변수 때문에 내 서명 된 요청이 실패합니다. –

+0

JSONP가 jQuery에서 작동하도록 설계된 방식은 동적 함수를 생성해야하며 이후 코드는 동적 이름을 가진 함수를 생성 한 후 스크립트로 처리합니다. 아래 게시물을 참조하십시오. – Duncan

0

이 고정 콜백 더 나은 솔루션 여기 http://docs.jquery.com/Ajax/jQuery.ajax#options 참조 :

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'); }); 
}); 

이 콜백의 문제는 단지 같은 시간에 요청의 종류를 처리 할 수있다 기능이 세계적으로 등록되어 있습니다. 콜백 함수는 검색하고 적절한 함수를 호출 할 수있는 여러 종류의 데이터에 대한 디스패처로 전환해야 할 것입니다.

3

나를 위해 일했다있는 유일한 방법은 jQuery를가에 사는 익명 함수에 대한 임의의 이름을 생성 상태 것이다 생각하기 때문에 실제로 문제가 해결되지 않으면 다음과 같은 설정

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