【问题标题】:Send HTTP Request and properly ignore the Response in Javascript发送 HTTP 请求并正确忽略 Javascript 中的响应
【发布时间】:2017-11-08 02:27:39
【问题描述】:

initiate a web (HTTP) request in Javascript 的方法示例比比皆是。但是,当我发起一个网络请求并且服务器返回一个空白响应时,Firefox 至少会抛出一个错误:

XML 解析错误:找不到根元素位置:http://example.com/service 第 1 行第 1 列:1 服务:1:1

我正在使用类似的功能:

function RequestGET(url) {
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.send();
}

在这种特殊情况下,服务器没有任何东西可以返回,我希望如此。那么,如何构建我的客户端脚本来处理这个响应而不抛出这个错误呢?或者,更一般地说,如何正确处理非 XML 响应?

【问题讨论】:

  • 我建议使用 this question 的 JavaScript 部分,它基本上归结为 if (typeof window.ActiveXObject != 'undefined')
  • 如果你想玩现代游戏,fetch 让原生 JS 中的 XHR 更容易

标签: javascript ajax firefox xmlhttprequest


【解决方案1】:
req.onreadystatechange=function() {
    if (req.readyState===4 && req.status===200) {
        var response=req.responseText;
    }
};

一旦请求完成,这会将响应捕获到“response”变量中

【讨论】:

  • 不幸的是,包含这部分仍然会引发“XML Parsing Error”。
  • 只有在服务器没有响应的情况下才这样吗?它扔在哪条线上?
【解决方案2】:

或者,更一般地说,如何正确处理非 XML 响应?

我会尝试Try...Catch

try {
  // parse response data
}
catch(error){
 // handle parsing exception
}
finally{
 // buy me a beer
}

也许这可行,但我将围绕哪个块包装异常处理?

function RequestGET(url) {
    var req = new XMLHttpRequest();

    // set callback for xhr state change events
    xhr.onreadystatechange  = function() {

        if (req.readyState === 4) {
            // request is completed

            if(req.status === 200) {
                // The request succeed!
                try {
                    // parse response data
                    var parser = new DOMParser();
                    var xmlDoc = parser.parseFromString(req.responseText,"text/xml");

                    // here your xml document object...
                    // > xmlDoc
                }
                catch(error){
                 // handle parsing exception
                }
                finally{
                 // buy me a beer
                }

            } else {
                // The request did not succeed!
            }
        }
    }

    req.open("GET", url, true);
    req.send();
}

【讨论】:

  • 也许这可行,但我将围绕哪个块包装异常处理?
  • 我为你扩展了我的答案。
【解决方案3】:

responseXML 可能 === null

XMLHttpRequest.responseXML 属性是一个只读值,它返回一个包含请求检索到的 HTML 或 XML 的文档,或 null 如果请求不成功、尚未发送,或者如果检索到的数据无法正确解析为 XML 或 HTML。

类似的东西将捕获并处理我们可以预期的许多可能的回报。

var xhr = new XMLHttpRequest(),
    handleResponses = function( x ) {
        var s = x.status;
        if ( s < 400 ) {
            if ( s === 200 ) {
                var rXML = x.responseXML;
                if ( rXML !== null ) {
                    console.log( rXML );
                } else {
                    console.error( "Not XML" );
                    console.log( x.response );
                }
            } else {
                console.warn(
                    { 204: "No Content",
                      304: "Not Modified" // etc.
                    }[ s ] || "Nothingness..."
                );
            }
        } else {
            console.error(
                { 400: "Bad Request",
                  404: "Not Found" // etc.
                }[ s ] || "Oh snap!"
            );
        }
    };
xhr.open( "GET", "https://example.com/service", true );
xhr.addEventListener( "error", function() {
    // If this happens, the request effectively failed.
    console.error( "The internet is empty" );
}, false );
xhr.addEventListener( "readystatechange", function() {
    // Even if the request fails, this will happen.
    if ( xhr.readyState === 4 ) {
        handleResponses( xhr );
    }
}, false );
xhr.send();

【讨论】:

  • 感谢您提供指向 responseXML 文档的链接,它帮助我找到了答案。
  • YW。文档岩石 \m/
【解决方案4】:

出于正当理由,Firefox 将默认 MIME 类型设置为 XML(不确定是 text/xml 还是 application/xml)。幸运的是,XMLHttpRequest 对象有一个overrideMimeType 方法,我可以使用它来将 MIME 类型设置为text/plain

以下函数用于忽略响应,无论是空白还是其他:

function RequestGET(url, callback) {
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    if (req.overrideMimeType)
        req.overrideMimeType("text/plain");
    req.send(null);
}

【讨论】:

猜你喜欢
  • 2020-07-29
  • 2012-05-13
  • 2013-09-29
  • 2020-09-30
  • 2011-12-21
  • 2012-04-14
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多