2012-08-04 3 views
1

Ahoy!

저는 WCF 서비스를 사용하여 별도의 도메인 (따라서 JSONP 사용)의 웹 서버에서 아약스 호출을 처리하고 있습니다. 내가 서버에서 얻을

$.ajax({ 
    dataType: 'jsonp', 
    type: 'GET', 
    url: 'http://localhost/s.svc/login?callback=?&l=en&e=foo&p=bar', 
    success: function (serverData) { 
     // [...] 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     // [...] 
    } 
}); 

응답은 다음과 같습니다 : 내 호출은 다음과 같습니다

?({"DataIsValid":true,"ErrorOccurred":false,"EmailAddressValidationMessage":"","PasswordValidationMessage":""}); 

그리고 그것을 읽을 때 jQuery를이 연속적으로 parsererror가 발생합니다.

위의 응답은 유효한 JSON처럼 보입니다. 설명서마다 "? callback =?"이라고 생각합니다. JSONP를 사용하여 $ .ajax 호출에 적합합니다. 내가 분명히

답변

2

몇 가지 :-) 놓친 거지 무슨 지적에 미리

덕분에 내가 여기를 참조하십시오

  1. 는 URL에 콜백 매개 변수를 제거하십시오. jQuery JSONP 호출을 작성하면 자체 콜백이 추가되고 성공/오류 함수가 호출됩니다. 백엔드에서 요청에서 "콜백"매개 변수를 읽고 jsonp 응답을 래핑하는 데 사용하십시오 (이미 나타나고 있으므로 변경하지 마십시오).
  2. 성공 함수가되면 serverData은 문자열입니다. jQuery.parseJSON() 또는 JSON.parse()로 파싱 :

VAR 데이터 = jQuery.parseJSON (serverData 부르는); // 또는 JSON.parse (serverData);

그렇게해야합니다.

마지막으로 한 가지. 구문 분석에서 "예기치 않은 토큰 ..."오류가 발생하기 시작하면 JSON 문자열의 어딘가에 숨겨진 제어 문자가있을 것입니다. 나는이 문제가 있었고 개행 (​​"\ n")이었다. 교체 후 크롬의 개발 도구 콘솔과 같은에서 구문 분석 문자열을 얻어서 어떤 캐릭터 파악하고 : 내가 MVC 액션 메소드 응답에 아래의 실종

var data = jQuery.parseJSON(serverData.replace(/\n/g,"")); 
+0

내 응답에 콜백 매개 변수를 어떻게 래핑합니까? $ 콜백을하면됩니다. '({'. $ jsonResponse. '})'; ? – PinoyStackOverflower

+1

@PinoyStackOverflower - 돌아 오기까지 미안합니다. 콜백 매개 변수에는 프런트 엔드에있는 해당 콜백의 함수 이름이 포함되어 있습니다. jQuery는 jsonp 요청에서이를 포함합니다. 따라서 서버의 요청에서 'callback'매개 변수를 읽은 다음 클라이언트에 대한 응답으로'callbackParameterValue + '('+ JSON.stringify (serverData) + ')'와 같은 문자열을 반환합니다. 그런 다음 jQuery는 응답을 받아서 성공 함수에 전달합니다.이 함수는 위에서 언급 한 JSON으로 구문 분석해야합니다. – mpickell

+0

안녕하세요 @mpickell, 아담 코드를 수정하여 제안 사항을 포함하는 전체 코드를 게시 해주십시오. 그게 더 도움이 될거야. 고맙습니다! – Bhargav

0

(콜백 메소드의 리스폰스 포장).

response.Write(request.Params["callback"] +"(" +htmlContent +");"); 

jquery ajax 호출은 다음과 같아야합니다.

jQuery.ajax({ 
      url:"https://servername/virtualDirectory/ActionMethod,    
      crossDomain: true, 
      dataType: 'jsonp',     
      type: 'GET', 
      cache: false, 
      jsonp:"callback",    
      success: function (data) { 
       alert('success');     
       $fs("#fs_container").htm(data);     
      }, 
      error: function (data, status, req) {       
       alert(req.responseText + " " + status); 
      }     
});