发送HTTP请求并正确忽略Javascript中的响应

时间:2017-06-06 22:31:14

标签: javascript ajax firefox xmlhttprequest

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

  

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

我使用的功能类似于:

Win32

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

4 个答案:

答案 0 :(得分:2)

由于可能是一个可辩护的原因,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);
}

答案 1 :(得分:1)

responseXML可能=== null

  

XMLHttpRequest.responseXML属性是一个只读值,它返回包含请求检索的HTML或XML的Document,如果请求不成功,尚未发送,则返回或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();
&#13;
&#13;
&#13;

答案 2 :(得分:0)

req.onreadystatechange=function() {
    if (req.readyState===4 && req.status===200) {
        var response=req.responseText;
    }
};

这会将响应捕获到&#34;响应&#34;请求完成后变量

答案 3 :(得分:0)

  

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

我会给尝试......抓住一个去。

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();
}