[英]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 filters
、 jetty 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 與遠程服務器通信。
你可以考慮:
希望有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.