2011-06-13 5 views
5

jsonp 및 ajax를 사용하여 다른 서버의 java로 작성된 웹 서비스를 쿼리하고 있습니다. 다음 jquery 명령을 사용하고 있습니다 :jQuery, ajax 및 jsonp에 문제가있는 경우

$.ajax({ 
    type: "GET", 
    url: wsUrl, 
    data: {}, 
    dataType: "jsonp", 
    complete: sites_return, 
    crossDomain: true, 
    jsonpCallback: "sites_return" 
}); 


function jsonp_callback(data) { 
    console.log(data); 
} 

function sites_return(data) { 
    console.log(data); 
} 

내 문제는 쿼리가 끝난 후 jsonp_callback이라는 함수가 호출된다는 것입니다. 나는 명확하게 JSON 형식의 문자열을 볼 수있는 곳 :

Object { readyState=4, status=200, statusText="parsererror"} 

또한 참조를 위해 jsonp_callback 기능은 다음과 같습니다

{"listEntries":["ELEM1", "ELEM2", "ELEM3", etc...]} 

그러나 함수 sites_return를 호출 한 후

는 전체 이벤트가 발생, 나는이 다음에 도착하면 sites_return 함수 전에 호출됩니다. 또한 jsonp_callback 함수를 코드 밖으로 가져온다면 함수가 구현되지 않았다는 불만을.니다.

내 질문 세배 : 1) 내가 jquery 측에서 잘못하고 있습니까? 2) jsonp는 jsonp_callback에서 올바르게 구문 분석되지만 sites_return에서는 올바르게 구문 분석되지 않는 이유는 무엇입니까? 3) 이러한 문제를 해결하려면 어떻게해야합니까?

일부 새로운 개발 EDIT. 의견에 따라 몇 가지 추가 정보가 있습니다.

다음은 내가이 호출되는 이유 jsonp_callback 가정 HTTP 응답

jsonp_callback({"listEntries":["ELEM1", "ELEM2", "ELEM3"]}) 

에서 나오는 것입니다. 나는 내 질문에 지금,이 방법을 제어 할 수있는 방법이 될 것 같아요 (백엔드 웹 서비스에 대한 액세스 권한이 없다고 가정).

+0

나는 우리가 필요 해요 생각을 모든 JSON을 확인하십시오. 구문 분석 오류의 원인이 될 수있는 잘못된 것이 있기 때문입니다. – Pointy

+0

또한 "jsonp_callback"함수가 왜 호출되는지는 명확하지 않습니다. – Pointy

+0

그것이 모두 json입니다. 실제 요소를 더미 이름으로 바꿨지 만 형식은 정확히 동일합니다 (물론 등등 ...). 다음은 HTTP 헤더의 응답으로 되돌아 오는 것입니다. jsonp_callback ({ "listEntries": [ "ELEM1", "ELEM2", "ELEM3"]}). 그것을 보면, http 헤더에 형식이 지정되어 있기 때문에 함수가 호출되고 있다고 가정합니다. – sumone4life

답변

1

sites_return 함수의 첫 번째 인수는 jqXHR 개체라고 생각합니다. complete 대신 success을 사용해보세요.

그러나 구문 분석 오류 (oncomplete에서 호출 된 sites_return 함수의 반환 값에서 언급 한 것)가있는 것처럼 보이기 때문에 여전히 작동하지 않을 수 있습니다. 따라서 먼저 json 문자열을 검사해야합니다.

은 내가 문제가 서버가 jQuery를가가 기대하는 방식으로 작동하지 않는 것을 것을 생각 http://jsonlint.com/

+0

아마도 문제는 jsonp_callback (...)인데 아마 백엔드에서 포맷 된 것 같습니다. 그 문제를 다루는 창의적인 방법을 찾아야 할 것 같습니다. – sumone4life

1

을 사용할 수 있습니다, JSON의 유효성을 검사합니다. JSONP "프로토콜"은 그다지 안정적이지는 않지만 일반적으로 사이트는 "콜백"매개 변수를 찾아서 JSONP 응답을 빌드 할 때 함수 이름으로 사용해야합니다. 서버가 항상 "jsonp_callback"함수 이름을 사용하는 것처럼 보입니다.

그것은 당신의 콜백 직접 "jsonp_callback"되는 jQuery를 알려 작동 할 수 있습니다 : 그러나

$.ajax({ 
    type: "GET", 
    url: wsUrl, 
    data: {}, 
    dataType: "jsonp", 
    complete: sites_return, 
    crossDomain: true, 
    jsonpCallback: "jsonp_callback" 
}); 

100 % 확인합니다.

0

원격 서버가 반환하는 JSONP 함수 래퍼를 변경할 수없는 경우 여기에서 jQuery의 $.ajax()이 과도 할 수 있습니다.궁극적으로 여러분이하고있는 일은 wsUrl에 대한 스크립트 참조를 주입하는 것입니다. jsonp_callback을 입력 매개 변수로 JavaScript 객체 리터럴과 함께 호출합니다.

당신은 쉽게 이런 일을하고 콜백 이름/구문 주위에 혼란을 피할 수 :이 도움이

$.getScript(wsUrl); 

function jsonp_callback(response) { 
    // Access the array here via response.listEntries 
} 
2

희망 ~

var url = "http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false"; 
var address = "1600+Amphitheatre+Parkway"; 
var apiKey = "+Mountain+View,+CA"; 

$.getJSON("http://maps.google.com/maps/geo?q="+ address+"&key="+apiKey+"&sensor=false&output=json&callback=?", 
    function(data, textStatus){ 
    console.log(data); 
    });