programing

XMLHttpRequest에서 빈 응답 텍스트

golfzon 2023. 3. 15. 20:05
반응형

XMLHttpRequest에서 빈 응답 텍스트

정상적으로 실행되지만 빈 responseText를 반환하는 XMLHttpRequest를 작성했습니다.

Javascript는 다음과 같습니다.

  var anUrl = "http://api.xxx.com/rates/csv/rates.txt";
  var myRequest = new XMLHttpRequest();

  callAjax(anUrl);

  function callAjax(url) {
     myRequest.open("GET", url, true);
     myRequest.onreadystatechange = responseAjax;
                 myRequest.setRequestHeader("Cache-Control", "no-cache");
     myRequest.send(null);
  }

  function responseAjax() {
     if(myRequest.readyState == 4) {
        if(myRequest.status == 200) {
            result = myRequest.responseText;
            alert(result);
            alert("we made it");
        } else {
            alert( " An error has occurred: " + myRequest.statusText);
        }
     }
  }

코드는 정상적으로 동작합니다.지나가면 readyState == 4 및 상태 == 200이 표시되지만 responseText는 항상 비어 있습니다.

에러 디스패치: getProperties의 로그 오류(Safari 디버깅)가 표시되지만 참조할 수 없습니다.

Safari와 Firefox에서 로컬과 리모트서버 양쪽에서 코드를 실행하고 있습니다.

브라우저에 넣으면 URL에서 문자열이 반환되고 상태 코드가 200이 됩니다.

Mac Widget에서도 같은 URL로 같은 코드를 썼는데 브라우저에서도 같은 코드가 반환되지 않습니다.

http://api.xxx.com/당신의 영역의 일부입니까?그렇지 않으면 동일한 오리진 정책에 의해 차단됩니다.

다음의 스택 오버플로우 투고를 체크하고, 몇개의 회피책을 찾을 수 있습니다.

문제 해결 완료

저 같은 경우에는 ($.ajax, $.get 또는 $.getJ로) ajax 콜을 하는 것이 문제였습니다.jQuery)의 SON 메서드(url 파라미터에 풀패스 포함):

URL: "http://mydomain.com/site/cgi-bin/serverApp.php"

그러나 올바른 방법은 url 값을 다음과 같이 전달하는 것입니다.

url: "site/cgi-bin/serverApp.php"

일부 브라우저는 충돌하지 않고 텍스트 간에 구분이 되지 않지만, Mac OS용 Firefox 3.6에서는 이 전체 경로를 "사이트 간 스크립팅"으로 사용합니다. 같은 브라우저에서는 다음과 같은 차이가 있습니다.

http://mydomain.com/site/index.html

그리고...

http://www.mydomain.com/site/index.html

실제로는 올바른 포인트뷰이지만 대부분의 구현에서는 구별이 없기 때문에 AJAX 요구를 실행하는 메서드에서 스크립트에 대한경로를 지정하는 텍스트를 모두 삭제하는 것이 해결책입니다.index.html 파일에서 BASE 태그를 삭제합니다.

base href="http://mydomain.com/" <--- 삭제!

삭제하지 않으면 이 시스템용 브라우저의 이 버전은 사이트 간 요청처럼 사용자의 Ajax 요청을 받아들일 수 있습니다.

같은 문제가 발생하지만 Mac OS 머신에서만 발생합니다.문제는 Firefox가 Ajax 응답을 "cross site" 호출로 취급하며 다른 머신/브라우저에서는 정상적으로 동작한다는 것입니다.이에 대한 도움말을 찾지 못했습니다(이것은 Firefox 구현 문제인 것 같습니다). 그러나 서버 측에서 다음 코드를 증명합니다.

header('Content-type: application/json');

브라우저가 데이터를 "json data"로 가져올 수 있도록 합니다.

브라우저로 인해 사이트 간 스크립팅을 수행할 수 없습니다.

URL이 도메인 외부에 있는 경우 서버 측에서 이 작업을 수행하거나 해당 URL을 도메인으로 이동해야 합니다.

이게 최선의 방법이 아닐 수도 있어요.하지만 어떻게든 효과가 있었으니까, 난 그걸 가지고 달릴 거야.

데이터를 반환하는 my php 함수에서는 리턴 행보다 한 줄 앞에 echo 문을 추가하여 송신하고 싶은 데이터를 에코합니다.

왜 효과가 있었는지 알겠지만, 성공했어요.

당신과 비슷한 문제가 있었어요.다음 document.domain 솔루션을 사용해야 했습니다.

동일 발신기지 정책을 회피하는 방법

웹 서비스 측도 변경해야 했습니다.다음 위치에 있는 "Access-Control-Allow-Origin" 헤더를 사용:

https://developer.mozilla.org/En/HTTP_access_control

언급URL : https://stackoverflow.com/questions/1941340/empty-responsetext-from-xmlhttprequest

반응형