簡體   English   中英

XMLHttpRequest 狀態 0(響應文本為空)

[英]XMLHttpRequest status 0 (responseText is empty)

無法使用 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("status " + xmlhttp.status);
}
xmlhttp.send();

它提醒“狀態 0”。

與localhost請求相同的情況(cd_catalog.xml保存為本地文件)

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

但是使用本地主機 IP 請求

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

並使用本地文件請求

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

一切正常(狀態 200)

什么會導致在線請求出現問題(狀態=0)?

PS:Live HTTP Headers 顯示在所有 4 種情況下一切正常:

HTTP/1.1 200 OK
  Content-Length: 4742

PS2:VMWare 上的 Apache 本地 Web 服務器(主機操作系統 Win7、來賓操作系統 Ubuntu、網絡適配器 – NAT)。 瀏覽器 - 火狐。

當包含腳本的 html 文件通過文件方案在瀏覽器中打開時,狀態為 0。 確保將文件放在您的服務器(apache 或 tomcat 等)中,然后在瀏覽器中通過 http 協議打開它。 (即http://localhost/myfile.html )這是解決方案。

您的問題的原因是您正在嘗試進行跨域調用並且失敗了

如果您正在進行本地主機開發,您可以進行跨域調用 - 我一直都在這樣做。

對於 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 對象添加了跨域功能,但我還沒有玩過這些功能。

實際上確保您的按鈕類型是按鈕不是提交,這導致了我最近遇到的狀態沖突。

如果服務器響應 OPTIONS 方法以及 GET 和 POST(無論您使用的是哪個),並帶有如下標題:

Access-Control-Allow-Origin: *

它可能工作正常。 似乎在 FireFox 3.5 和 rekonq 0.4.0 中。 顯然,使用該標頭和對 OPTIONS 的初始響應,服務器對瀏覽器說:“繼續,讓這個跨域請求通過。”

還要考慮請求超時

如果在服務器響應之前經過了太多時間,現代瀏覽器將返回readyState=4和 s tatus=0

setRequestHeader("Access-Control-Allow-Origin","*")到您的服務器響應中。

打開javascript 控制台 您會在那里看到一條錯誤消息。 就我而言,它是 CORS。

我遇到過類似的問題。 一切正常,“就緒狀態”為 4,但“狀態”為 0。這是因為我使用的是 Apache PHP 便攜式服務器,而我使用“XMLHttpRequest”對象的文件是一個 html 文件。 我把文件擴展名改成php,問題就解決了。

要回答為什么http://127.0.0.1/cd_catalog.xml有效而http://localhost/cd_catalog.xml無效的問題:Firefox 將 127.0.0.1 和 localhost 視為兩個不同的域。

要查看問題是什么,當您收到神秘錯誤 0 時,請轉到 ... | 更多工具 | Chrome 中的開發人員工具 (Ctrl+Shift+I)(在給出錯誤的頁面上)

閱讀日志中的紅色文本以獲取真正的錯誤消息。 如果那里有太多,請右鍵單擊並清除控制台,然后再次執行上次請求。

我的第一個問題是,我第一次將 Authorization 標頭傳遞給我自己的瀏覽器跨域 Web 服務。

我已經有了:

Access-Control-Allow-Origin: *

但不是:

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

在我的 Web 服務的響應標頭中。

添加后,我自己的 Web 服務器以及在沒有 Web 服務器的情況下在本地運行 index.html 文件時,我的錯誤零消失了,但仍然在代碼筆中出現錯誤。

回到... | 更多工具 | 開發者工具同時在codepen中得到錯誤,並且有明確的解釋:codepen使用https,所以我無法調用http,因為安全性較低。

因此,我需要在 https 上托管我的 Web 服務。

知道如何獲得真正的錯誤信息 - 無價!

這是status === 0的另一種情況,特定於上傳:

如果按照MDN 的建議(向下滾動到“監控進度”的上傳部分)將'load'事件處理程序附加到XHR.upload ,則 XHR 對象將具有status=0並且所有其他屬性將為空字符串。 如果您將'load'處理程序直接附加到 XHR 對象,就像下載內容時一樣,您應該沒問題(假設您沒有運行本地主機)。

但是,如果您想在'progress'事件處理程序中獲得好的數據,您需要將處理程序附加到XHR.upload而不是直接附加到 XHR 對象本身。

到目前為止我只在 Chrome OSX 上測試過這個,所以我不確定這里有多少問題是 MDN 的文檔以及 Chrome 的實現有多少......

Alex Robinson 已經(並且首先)給出了這個問題的正確答案。 但要詳細說明一下......

您必須添加 HTTP 響應標頭:

Access-Control-Allow-Origin: *

如果你這樣做,結果不僅僅是“可能有效”,而是“會有效”。

注意您需要添加的是 HTTP響應標頭 - 因此您只能在您控制的服務器上執行此操作。 永遠不可能使用XMLHttpRequest (根據 OP 的問題)從其原始 URL 直接獲取http://w3schools.com/XML/cd_catalog.xml ,因為該資源沒有(至少,截至 2015 年 4 月 24 日) ) 包括任何此類 CORS 標頭。

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing提供了更多信息。

我的類似問題是通過檢查我的 html 代碼解決的。 我的表單提交按鈕中有一個onclick處理程序到一個方法。 像這樣: onclick="sendFalconRequestWithHeaders()" 這個方法反過來像你一樣調用ajax,並且做我想要的。 但不像預期的那樣,我的瀏覽器沒有返回任何內容。

某人的努力中學到,我在這個處理程序中返回了 false,並解決了。 讓我提一下,在到達這篇文章之前,我花了整整 3 天半的周末時間在辦公室編寫代碼,實現CORS filtersjetty config 、其他jersey and embedded jetty相關的東西——只是為了解決這個問題。,旋轉所有我對cross domain ajax requests和標准的理解。 javascript 中的簡單錯誤讓你變得愚蠢,這太荒謬了。

確實,我已經嘗試過signed.applets.codebase_principal_support = true並編寫了isLocalHost() **if** 可能是這個方法需要我們自己實現,firefox說沒有這個現在我要清理我的代碼才能干凈地提交git補丁。 感謝那個人。

瀏覽器請求“127.0.0.1/somefile.html”未更改地到達本地網絡服務器,而“localhost/somefile.html”可能以“0:0:0:0:0:0:0:1/somefile.html”的形式到達" 如果支持 IPv6。 所以后者可以被處理為從一個域到另一個域。

Alex Robinson 和 bmju 提供了寶貴的信息來理解跨域問題。 我想補充一點,在進行所需的 GET/POST(例如針對 CORS OAuth 服務端點)之前,您可能需要在客戶端代碼中進行顯式 OPTIONS 調用。 您的瀏覽器/庫可能不會自動處理 OPTIONS 請求。 Gruber,這是您問題的可能答案之一。

我遇到了同樣的問題(readyState 為 4,狀態為 0) ,然后我采用了本教程中解釋的不同方法: https : //spring.io/guides/gs/sumption-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);
   });
 });

我不得不將我當前的 IP 地址(再次)添加到Atlas MongoDB 白名單,因此擺脫了 XMLHttpRequest status 0 錯誤

python中的瓶子應用程序:

@route('/mazer2/get', method='POST')
def GetMaze2():
    if MazeCore == None: abort(666, "MazeCore поломался :///")
    Check()
    Comm = request.body.read().decode("utf-8")
    Map = MazeCore.GetMaze2(Comm, TestToken2())
    response.headers["Access-Control-Allow-Origin"] = "*" #Here ;'-} It helped me
    return Map

當我嘗試使用 XMLHttpRequest 在燒瓶環境中使用 python 創建的一些 Web 方法時,我遇到了同樣的問題。 在檢查 firefox 控制台后,我意識到問題的原因是同源策略,它阻止調用不同ORIGIN 的Web 方法(一個 Origin 由 3 部分元組組成,包括:協議、域和端口號)。 對我來說,解決方案是使用CORS ,幸運的是我使用了一個名為flask-cors的 python 包,一切正常。

我剛剛遇到這個問題,因為我使用0.0.0.0作為我的服務器,將其更改為localhost並且它可以工作。

setRequestHeader("Access-Control-Allow-Origin","*") 在您的清單中

編輯:請閱讀下面 Malvolio 的評論,因為此答案的知識已過時。

您不能執行跨域 XMLHttpRequests。

127.0.0.1的調用有效,因為您的測試頁面位於127.0.0.1 ,並且本地測試也有效,因為……這是本地測試。

其他兩個測試失敗是因為 JavaScript 無法通過 XMLHttpRequest 與遠程服務器通信。

你可以考慮:

  • XMLHttp-請求您自己的服務器為您獲取遠程 XML 內容(例如 php 腳本)
  • 如果您想保持完整的 JavaScript,請嘗試使用像 GoogleAppEngine 這樣的服務。

希望有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM