XMLHttpRequest 상태 0 (responseText가 비어 있음)


104

XMLHttpRequest로 데이터를 가져올 수 없습니다 (상태 0 및 responseText가 비어 있음) :

xmlhttp = new XMLHttpRequest ();
xmlhttp.open ( "GET", "http://www.w3schools.com/XML/cd_catalog.xml", true);
xmlhttp.onreadystatechange = function () 
{
  if (xmlhttp.readyState == 4)
    alert ( "상태"+ xmlhttp.status);
}
xmlhttp.send ();

"상태 0"을 경고합니다.

localhost 요청과 동일한 상황 (cd_catalog.xml이 로컬 파일로 저장 됨)

xmlhttp.open ( "GET", "http : //localhost/cd_catalog.xml", true);

그러나 localhost IP 요청으로

xmlhttp.open ( "GET", "http://127.0.0.1/cd_catalog.xml", true);

그리고 로컬 파일 요청으로

xmlhttp.open ( "GET", "cd_catalog.xml", true);

모든 것이 정상입니다 (상태 200).

온라인 요청에 문제 (상태 = 0)의 원인은 무엇입니까?

추신 : 라이브 HTTP 헤더는 4 가지 경우 모두 정상임을 보여줍니다.

  HTTP / 1.1 200 정상
  콘텐츠 길이 : 4742

PS2 : VMWare의 Apache 로컬 웹 서버 (호스트 OS Win7, 게스트 OS Ubuntu, 네트워크 어댑터 – NAT). 브라우저 – Firefox.


1
혹시 시험 페이지 http://127.0.0.1입니까? ;)
Roatin Marth

예. <code> 127.0.0.1/CDCatalogTest.html </ code>
arigasa

7
질문에 답하셨습니다. XMLHttpRequest도메인 간 요청을 할 수 없습니다. 그래도 몇 가지 해결 방법이 있습니다. 예를 들어 jquery를 살펴보십시오.
meze

php를 사용하여 파일을 가져옵니다. 약간의 해결 방법 : jquery-howto.blogspot.com/2009/04/…

2
@meze : 도메인 간 호출은 jQuery에서 작동합니다. 그러나 jQuery가 JavaScript로 구현되었으므로 일반 JavaScript에서는 어떻게 작동하지 않을 수 있습니까? 나에게는 말이되지 않습니다. jQuery가 일종의 불쾌한 해결 방법을 사용하고 있습니까?
Gruber

답변:


55

스크립트가 포함 된 html 파일이 파일 구성표를 통해 브라우저에서 열리면 상태가 0입니다. 서버 (apache 또는 tomcat 무엇이든)에 파일을 배치 한 다음 브라우저에서 http 프로토콜을 통해 엽니 다. (예 : http : //localhost/myfile.html ) 이것이 해결책입니다.


1
왜 이것이 비추천입니까? 사실입니다! file : // URL에서도 file : // URL의 XHR 요청은 실제로 성공시 상태 == 0입니다 (FF 24.0.5에서 테스트 됨).
Daniel Roethlisberger 2014

3
또한 Safari 버전 6.1.6에서 성공하면 상태 == 0이됩니다.
평면

내가 사용 상태 = 0 (단, 네트워크 상태 200) 데 로드 일시적으로 추가 기능을 파이어 폭스에
JobaDiniz

1
여전히 유효한 대답. HTTP 응답은 실제 원격 체계 (http 등)의 경우 200이고 로컬 파일 ( file://체계)의 경우 0입니다 . 분명히 CORS를 비활성화하여 먼저 로컬 파일로드를 허용해야합니다.
pid

31

문제의 원인은 도메인 간 호출을 시도했지만 실패했기 때문 입니다.

localhost 개발을하고 있다면 도메인 간 호출을 할 수 있습니다. 저는 항상 그렇게합니다.

Firefox의 경우 구성 설정에서 활성화해야합니다.

signed.applets.codebase_principal_support = true

그런 다음 XHR 오픈 코드에 다음과 같이 추가합니다.

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }

IE의 경우 내가 기억하는 것이 맞다면 "기타 → 도메인 간 데이터 소스 액세스"에서 브라우저의 보안 설정을 활성화하여 ActiveX XHR에서 작동하도록하는 것입니다.

IE8 이상에서는 네이티브 XmlHttpRequest 개체에 도메인 간 기능도 추가했지만 아직 이러한 기능을 사용하지는 않았습니다.


8
누구든지 필요로하는 경우 Chrome의 경우 새 인스턴스 (아직 열려 있지 않은 상태)를 시작하고 사용해야합니다.--allow-file-access-from-files
TheZ

@TheZ : 당신은 100 %입니까? --allow-file-access-from-files스위치를 사용 하여 Chrome의 새 인스턴스 만 실행 하면되지만 실행중인 다른 모든 인스턴스 닫을 필요는 없다고 들었 습니다. Chrome 시크릿 모드의 경우와 똑같이 실행중인 다른 인스턴스를 닫지 않고도 사용할 수 있습니다.
trejder

'UniversalBrowserRead'에 대한 지원이 중단 된 것으로 보이므로이 해결 방법은 옵션이 아닙니다.
perilandmishap

또한 브라우저 내 확장과 같은 https 페이지에서 http 페이지를 요청할 때 발생할 수 있습니다.
sibvic

html 페이지와 AJAX 스크립트가 동일한 도메인에 있음에도 불구 하고이 문제가 발생 합니다. 하지만 이상하게도 일부 스크립트, 특히 MongoDB 리소스에 액세스하는 모든 스크립트 에만 영향을줍니다 . 이것이 왜 그런지에 대한 단서가 있습니까?
David Edwards

26

실제로 버튼 유형이 제출되지 않은 버튼인지 확인하십시오. 이로 인해 최근에 만난 상태 충돌이 발생했습니다.


1
양식을 제출하면 이벤트를 처리하고 ajax를 직접 호출하는 경우 방지해야하는 몇 가지 기본 동작이 있기 때문에 충돌이 있습니다. 핸들러에서 이벤트를 e.preventDefault()
Jordan

20

서버가 OPTIONS 메소드에 응답하고 다음과 같은 헤더를 사용하여 GET 및 POST (사용중인 항목 중 하나)에 응답하는 경우 :

Access-Control-Allow-Origin: *

잘 작동 할 수 있습니다. FireFox 3.5 및 0.4.0에서 볼 수 있습니다. 분명히 그 헤더와 OPTIONS에 대한 초기 응답을 통해 서버는 브라우저에 "계속 진행하여이 도메인 간 요청을 통과 시키십시오"라고 말합니다.


3
이것이 정답입니다! 자세한 내용 은 en.wikipedia.org/wiki/Cross-origin_resource_sharing 을 참조하십시오. 이 헤더를 추가하면 'might work'가 아니라 'will work'입니다. NB 추가해야하는 것은 HTTP / response / 헤더입니다. 따라서 제어하는 ​​서버에서만이 작업을 수행 할 수 있습니다. w3schools.com/XML/cd_catalog.xml을 사용하여 XMLHttpRequest(즉, 원래 질문에 따라) 직접 가져올 수는 없습니다. 해당 리소스에는 해당 CORS 헤더가 포함되어 있지 않기 때문입니다 (적어도 2015 년 4 월 24 일 기준).
MikeBeaton 2015

13

요청 시간 제한 도 고려하십시오 .

최신 브라우저 는 서버 응답 전에 너무 많은 시간이 지나면 readyState = 4 및 s tatus = 0을 반환합니다.


3
@AndreaSavojardo :이 동작이 표준을 준수하는지에 대한 참조 (예 : MDN 게시물)가 있습니까?
Alexander Abakumov

@AndreaSavojardo 난 readyState = 4 및 status = 0이고 서버가 실행 중이 아니지만 오류 경고가 빠르게 표시됩니다 .... "요청 시간 초과"에 걸리는 시간은 얼마나됩니까?

7

setRequestHeader("Access-Control-Allow-Origin","*")서버 응답에 추가 하십시오.


3

비슷한 문제에 직면했습니다. 모든 것이 괜찮 았고 "준비 상태"는 4 였지만 "상태"는 0이었습니다. 아파치 PHP 포터블 서버를 사용하고 있었고 "XMLHttpRequest"객체를 사용한 파일이 html 파일 이었기 때문입니다. 파일 확장자를 php로 변경했는데 문제가 해결되었습니다.


3

자바 스크립트 콘솔을 엽니 다 . 거기에 오류 메시지가 표시됩니다. 제 경우에는 CORS였습니다.


2

http://127.0.0.1/cd_catalog.xml작동 http://localhost/cd_catalog.xml하지 않는 이유에 대한 질문에 답하려면 Firefox는 127.0.0.1과 localhost를 두 개의 다른 도메인으로 취급합니다.


2

문제가 무엇인지 확인하려면 암호 오류 0이 발생하면 ... | 더 많은 도구 | Chrome의 개발자 도구 (Ctrl + Shift + I) (오류가 발생한 페이지)

로그의 빨간색 텍스트를 읽고 실제 오류 메시지를 확인하십시오. 거기에 너무 많은 것이 있으면 마우스 오른쪽 버튼을 클릭하고 콘솔 지우기를 클릭 한 다음 마지막 요청을 다시 수행하십시오.

첫 번째 문제는 Authorization 헤더를 처음으로 브라우저 용 도메인 간 웹 서비스에 전달하는 것입니다.

나는 이미 가지고 있었다 :

Access-Control-Allow-Origin: *

하지만:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization

내 웹 서비스의 응답 헤더에 있습니다.

추가 한 후 내 웹 서버에서 내 오류 0이 사라졌고 웹 서버없이 index.html 파일을 로컬에서 실행할 때도 코드 펜에서 오류가 발생했습니다.

돌아 가기 ... | 더 많은 도구 | 코드 펜에서 오류가 발생하는 동안 개발자 도구가 명확하게 설명되어 있습니다. 코드 펜은 https를 사용하므로 보안이 낮기 때문에 http를 호출 할 수 없습니다.

따라서 https에서 웹 서비스를 호스팅해야합니다.

진정한 오류 메시지를 얻는 방법을 아는 것은 매우 귀중합니다!


나는이 접근 방식 (크롬의 f12)을 사용했고 유용한 것을 제공하지 않고 조용히 실패하는 https에서 http로 이동하려고한다는 것을 알았습니다. 오류 메시지 : VM1152 : 1 혼합 콘텐츠 :의 페이지 'https://mysiteoriginsite' 가 HTTPS를 통해로드되었지만 안전하지 않은 XMLHttpRequest 엔드 포인트를 요청했습니다 'http://MyDestinationSite/MyService.svc'. 이 요청은 차단되었습니다. 콘텐츠는 HTTPS를 통해 제공되어야합니다.
GrayDwarf

1

다음은 status === 0업로드와 관련된 또 다른 경우입니다 .

MDN 에서 제안한 대로 'load'이벤트 핸들러를에 연결하면 ( '모니터링 진행률'의 업로드 부분으로 스크롤 다운) XHR 개체가 포함 되고 다른 모든 속성은 빈 문자열이됩니다. 콘텐츠를 다운로드 할 때처럼 핸들러를 XHR 개체에 직접 연결하면 괜찮습니다 (localhost를 실행하지 않는 경우).XHR.uploadstatus=0'load'

당신이 당신의 좋은 데이터를 얻을하려는 경우, 'progress'이벤트 핸들러, 당신은에 핸들러를 연결해야 XHR.upload, 하지 XHR 객체 자체에 직접.

지금까지 Chrome OSX에서만 테스트했기 때문에 여기에있는 문제가 MDN의 문서이고 Chrome의 구현이 얼마나되는지 잘 모르겠습니다.


1

Alex Robinson은 이미 (그리고 먼저)이 문제에 대한 정답을 제공합니다. 하지만 좀 더 자세히 설명하면 ...

HTTP 응답 헤더를 추가해야합니다.

Access-Control-Allow-Origin: *

이렇게하면 결과는 '일할 수도있다'가 아니라 '일할 것'입니다.

NB 추가해야 할 것은 HTTP 응답 헤더입니다. 따라서 제어하는 ​​서버에서만이 작업을 수행 할 수 있습니다. (OP의 질문에 따라)를 사용하여 원래 URL에서 http://w3schools.com/XML/cd_catalog.xml 을 직접 가져올 XMLHttpRequest 는 없습니다. 해당 리소스는 그렇지 않기 때문입니다 (적어도 2015 년 4 월 24 일 현재는 아님). 이러한 CORS 헤더를 포함합니다.

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing 은 더 많은 정보를 제공합니다.


0

이와 유사한 내 문제는 내 html 코드를 확인하여 해결되었습니다. onclick양식 제출 단추에 메서드에 대한 처리기가 있습니다. 이렇게 : onclick="sendFalconRequestWithHeaders()". 이 방법은 차례로 당신과 마찬가지로 ajax를 호출하고 내가 원하는 것을 수행합니다. 그러나 예상대로 내 브라우저는 아무것도 반환하지 않았습니다.

누군가의 노고 에서 배운 나는이 핸들러에서 거짓을 반환하고 해결했습니다. 이 게시물에 도착하기 전에, 나는 3 일 주말과 반나절을 사무실 CORS filters에서 jetty config,, 기타 jersey and embedded jetty관련 사항을 구현하는 코드를 작성하는 데 보냈다고 언급하겠습니다 cross domain ajax requests. 자바 스크립트의 단순한 실수가 당신을 멍청하게 만드는 것은 어리석은 일이었습니다.

사실, 나는 시도 signed.applets.codebase_principal_support = true하고 썼습니다 isLocalHost() **if**. 이 방법은 우리가 구현해야 할 수도 있습니다. firefox는 그런 것이 없다고 말합니다. 이제 코드를 정리하여 git 패치를 깨끗하게 제출해야합니다. 그 사람 덕분입니다.


0

브라우저 요청 "127.0.0.1/somefile.html"은 변경없이 로컬 웹 서버에 도착하지만 "localhost / somefile.html"은 "0 : 0 : 0 : 0 : 0 : 0 : 0 : 1 / somefile.html"로 도착할 수 있습니다. "IPv6가 지원되는 경우. 따라서 후자는 도메인에서 다른 도메인으로 이동하는 것으로 처리 될 수 있습니다.


0

Alex Robinson과 bmju는 교차 출처 문제를 이해하는 데 유용한 정보를 제공했습니다. 원하는 GET / POST (예 : CORS OAuth 서비스 엔드 포인트에 대해)를 만들기 전에 클라이언트 코드에서 명시적인 OPTIONS 호출을해야 할 수도 있음을 추가하고 싶습니다. 브라우저 / 라이브러리가 OPTIONS 요청을 자동으로 처리하지 못할 수 있습니다. Gruber, 이것은 귀하의 질문에 대한 가능한 답변 중 하나입니다.


0

I 같은 문제가 있었다 (readyState가 4이고 상태 0) , 그 다음 I 다른 접근법이 가이드에 설명 하였다 : https://spring.io/guides/gs/consuming-rest-jquery/

그는 XMLHttpRequest 를 전혀 사용하지 않고 대신 jquery $ .ajax () 메서드를 사용했습니다.

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="hello.js"></script>
</head>

<body>
    <div>
        <p class="greeting-id">The ID is </p>
        <p class="greeting-content">The content is </p>
    </div>
</body>

public / hello.js 파일의 경우 (또는 동일한 HTML 코드에 직접 삽입 할 수 있음) :

$(document).ready(function() 
 {
    $.ajax({
        url: "http://rest-service.guides.spring.io/greeting"
   }).then(function(data) {
      $('.greeting-id').append(data.id);
      $('.greeting-content').append(data.content);
   });
 });

2
jQuery $.ajax()XMLHttpRequest내부에서 사용 한다는 것을 알고 있습니까?
Manngo


-1

0.0.0.0내 서버로 사용하고 로 변경 localhost하여 작동 하기 때문에 방금이 문제가 발생 했습니다.


-4

편집 : 이 답변의 지식이 오래되었으므로 아래 Malvolio의 의견을 읽으십시오.

도메인 간 XMLHttpRequests를 수행 할 수 없습니다.

127.0.0.1테스트 페이지가에 있기 때문에 호출이 작동 127.0.0.1하고 로컬 테스트도 작동하므로 로컬 테스트입니다.

다른 두 테스트는 JavaScript가 XMLHttpRequest를 통해 원격 서버와 통신 할 수 없기 때문에 실패합니다.

대신 다음 중 하나를 고려할 수 있습니다.

  • XMLHttp- 원격 XML 콘텐츠를 가져 오기 위해 자체 서버를 요청합니다 (예 : PHP 스크립트).
  • 완전한 JavaScript를 유지하려면 GoogleAppEngine과 같은 서비스를 사용하려고합니다.

도움이되는 희망


40
이것은 단지 잘못된 것입니다. 도메인 간 XMLHttpRequests를 수행 있습니다 .
Malvolio

1
"당신은 할 수 없습니다" "그것은 좋은 아이디어 적이 없기 때문에 당신은 그것을하지 말아야"에서와 같이
가브리엘 스프 렝거

24
-충분히 공평하지만 댓글이 이에 대한 최고의 포럼 인지 모르겠습니다 . 도메인 간 XMLHttpRequests에는 확실히 몇 가지 보안 문제가 있지만 이러한 문제를 처리하는 데 필요한 모든 도구를 제공합니다. 그 외에도 웹 사이트는 다른 웹 사이트에 서비스를 쉽게 제공하고 CDN을 사용하여 데이터를 전파하고 사용자 요청에 더 빠르게 응답 할 수 있습니다. 특정 질문이 있으면 저에게 메시지를 보내거나 여기에 질문을 게시하여 관심을 끌 수 있습니다.
Malvolio

2
@GabrielSprenger : Cross-domain XMLHttpRequest좋은 생각 일뿐만 아니라 요즘에는 너무 흔해서 (HelloWorlds를 넘어선) 최신 웹 앱에서하지 않는 것은 우스꽝스러운 일입니다. 앱에서 사용하는 모든 외부 REST 서비스에는 교차 도메인이 필요합니다 XMLHttpRequest. 이것이 바로 모든 CORS 항목이 추가 된 이유입니다.
Alexander Abakumov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.