2012-02-11 3 views
5

간단한 질문 : jsonp 요청을 서버에 보내고 요청을 캡처하지만 자바 스크립트로 파싱하지는 않습니까? jQuery 1.5에서 dataType : "jsonp text"를 사용하고 있지만 작동하지 않습니다.jsonp로 요청을 보내고 응답을 텍스트로 해석, jQuery를 사용하여 1.5

jsonp를 사용하여 AJAX를 통해 크로스 도메인 URL에 액세스하려고합니다. 문제는 다른 도메인 (내 대학의 디렉토리 목록)이 매우 오래된 것이고 서버가 jsonp를 지원하는지 의심 스럽습니다.

  • Firefox에서 "XML 태그 이름 불일치 (예상 META)"오류가 발생합니다. 크롬에서 "Uncaught SyntaxError Unexpected token <"이 내 AJAX 요청에 해당하는 파일을 가리키고 있습니다. 오류 콜백의 오류 문자열은 "parsererror"입니다.
  • 정상적인 AJAX 호출을 수행 할 수 없습니다. 데이터 유형을 "텍스트"로 변경하거나 모두 제거하면 다른 도메인에서 사용자가 인증되지 않았고 로그인 페이지로 리디렉션된다는 불만을 토로합니다. 브라우저 사이드에 이미 로그인했습니다. dataType이 jsonp 일 때 이것은 발생하지 않습니다.
  • 서버가 JSONP를 지원해야한다는 것을 알고 있습니다. 그렇다고 생각하지 않습니다.하지만 JSONP로 dataType을 변경하면 Chrome과 Firefox에서 응답 페이지 리소스가 표시되는 것을 볼 수 있습니다. 서버가 실제로 전송합니다. 브라우저 (정적 HTML 웹 페이지 + 일부 Java 스크립트)에 대한 응답 - 가져 오려는 데이터가 들어 있습니다.
  • 문제는 jQuery가 응답을 javascript로 구문 분석하려고 시도하고 (자바 스크립트가 아니기 때문에) 실패합니다. 따라서 데이터는 브라우저에서 끝납니다. 단지 액세스해야합니다!
  • dataType 사용 : jsonp 요청을 보내고 응답을 텍스트로 해석하는 것으로 간주되는 "jsonp text"는 아무런 차이가 없으며 여전히 구문 분석 오류입니다.

내가 원하는 것은 jsonp 요청의 응답을 일반 텍스트로 액세스하는 방법입니다. 또는 실패한 jsonp 요청에서 원시 응답에 액세스 할 수 있다면 그렇게 할 수 있습니다.

미리 감사드립니다.

코드 :

당신이 작동하지 않습니다 달성하기 위해 노력하고
ajax_url = 'https://somesite/?searchTerm='+query+'&searchType=lastname'; 
var jqxhr = $.ajax({type:"GET", 
url: ajax_url, 
dataType:"jsonp text", 
callback: "whatever", 
success:function(responseData) { 
    $('div#content').text(responseData.slice(0, 100)); 
    dbg(responseData.slice(0,100)); 
}}) 
.success(function() { alert("success"); }) 
.error(function(obj, errStr) { alert("error"); dbg("error: " + errStr + "test: " + test.responseText + this.responseTxt);}) 
.complete(function() { alert("complete"); }); 
+0

js 변수에 액세스 한 데이터를 넣은 다음 js 태그로 묶었습니까? 그것이 js로 구문 분석하려고하는 경우 이해가 될 것 같습니다. –

답변

8

: 서버가 제대로 자바 스크립트 함수 호출에 응답을 포함 할 경우시 JSONP 만 사용할 수 있습니다.

서버가 브라우저로 파일을 보내더라도 보안 제한으로 인해 파일에 액세스 할 수 없습니다. 스크립트 데이터 (스크립트 태그 사용)로 해당 데이터를 실행하거나 사용하면됩니다 (링크 태그를 사용하여) 스타일 시트로 사용하지만 다른 도메인의 텍스트 인 경우 원시 텍스트로 응답을 검사 할 수는 없습니다.

데이터를 xml로 직접 가져 오려고 시도했는데 실패했다는 가정하에 사이트에서 CORS을 지원하지 않습니다. 당신이 코드를 서버 측을 변경할 수없는 경우에, 당신은 두 대안이 :

  1. 자신의 서버에 프록시를 생성하는 터널 응답 (서버 측 스크립트가 실제 요청을하고 브라우저로 전송 것) : 클라이언트의 관점에서 동일한 도메인이 적용되고 데이터를 XML로 요청할 수 있습니다.
  2. 플래시를 사용하여 브라우저의 보안을 우회합니다 (flXHR을 사용할 수 있지만 지금은 조금 날짜가 된 것 같습니다) .
+0

감사합니다. 슬프 도다, 이것은 내가 의심했던 것이다. 나는 CORS (서버가 확실히 지원하지 않는다)와 같은 기원 정책에 대해 읽었고, 서버가 jsonp에게 응답을 보내더라도 그것을 조사 할 수는 없다는 것을 되돌아 본다. 나는 옵션 1 (내 서버를 통해 프록 싱)을 수행하는 것을 고려했지만 불행히도 클라이언트를 인증해야합니다. 나는 flXHR에게 기회를 줄 것이다. 다시 한번 감사드립니다. –

+0

클라이언트 인증 브라우저/플래시와 관련하여 다음과 같은 관심있는 질문을 찾을 수 있습니다. http://stackoverflow.com/questions/2161401/does-flash-player-transmit-session-cookies-automatically –

관련 문제