【问题标题】:http-Get request with empty response带有空响应的 http-Get 请求
【发布时间】:2013-01-19 02:11:18
【问题描述】:

我想用 JavaScript 处理一个 http-request 的响应。你可以在这里找到一个简单的例子。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1">
  <title>JavaScript Test</title>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
  <script type="text/javascript">
    function serviceCall() {
      $.ajax({
        type: "GET",
        url: 'http://localhost:8181/geoserver/wfs?Service=WFS&Request=GetFeature&Version=1.0.0&typename=topp:tasmania_water_bodies&SRS=EPSG:4326',
//        url: 'http://demo.opengeo.org/geoserver/ows?Service=WFS&Request=GetFeature&Version=1.0.0&typename=topp:tasmania_water_bodies&SRS=EPSG:4326',
        complete: function(xml, status){
          alert(xml.responseText);
        }
      });
    }
  </script>
</head>
<body>
  <center><button onclick="serviceCall()">Start...</button></center>
</body>
</html>

请求直接在浏览器中运行。通过 Ajax 和 JavaScript,响应为空。 Firebug 在第 1 行第 1 列报告 xml 解析错误。我尝试将请求发送到 localhost 和远程服务器,但响应始终为空。如有任何建议,我将不胜感激。

【问题讨论】:

  • 您对响应内容的期望是什么?
  • 为什么你处理的是完成而不是ajax的成功事件?
  • 如果不仅仅是一些无效的 XML,它可能是一个跨域 ajax 问题
  • 同意@ryadavilli——可能您的请求失败(可能是由于相同的来源策略)并且您的jqXHR 对象没有任何responseText。但是,您看不到这一点,因为您没有 successerror 处理程序(并且无论成功或失败,complete 处理程序都会触发)。

标签: javascript jquery ajax


【解决方案1】:

为什么不使用success 而不是complete?因为complete 总是被触发,即使它失败了,success 只有在它成功的时候才会触发。比你不需要xml, status

示例(自 CORS 后不工作):

$.ajax({
    type: "GET",
    url: 'http://localhost:8181/geoserver/wfs?Service=WFS&Request=GetFeature&Version=1.0.0&typename=topp:tasmania_water_bodies&SRS=EPSG:4326',
    success: function(response){
      alert(response);
    }
  });

此外,如果您不想访问其他域。如果您拥有其他域,则可以使用 JSONP。否则是不可能的。

尝试在 URL 中添加以下部分:&amp;outputFormat=json&amp;format_options=callback:processJSON

不工作的 jQuery 示例(此处为现场示例:http://jsfiddle.net/QWgJa/

function loadJSON(url)
{
    var headID = document.getElementsByTagName("head")[0]; 
    var newScript = document.createElement("script");
    newScript.type = 'text/javascript';
    newScript.src = url;
    headID.appendChild(newScript);  
}
function processJSON(jsonData)
{
    alert(jsonData); 
}

loadJSON("http://demo.opengeo.org/geoserver/ows?Service=WFS&Request=GetFeature&Version=1.0.0&typename=topp:tasmania_water_bodies&SRS=EPSG:4326&outputFormat=json&format_options=callback:processJSON");

信息网址

【讨论】:

  • 一般正确;但是,cross-origin resource sharing (CORS) 是服务器允许浏览器完成跨域 Ajax 请求的一种方式。这是一个比 JSONP 更简洁的解决方案(尽管在旧浏览器中支持 JSONP)。
  • 仍然 JSONP 是 CORS 的唯一解决方案。
  • 恐怕不明白你的评论。 CORSJSONP 是两种完全不同的方法,可以避免同源策略的限制。 CORS 使用特殊的服务器标头,例如 Access-Control-Allow-Origin,如果请求来自特定来源,它会通知浏览器忽略同源策略。正如我所说,CORS 排除了一些较旧的浏览器,因为它需要一个支持 CORS 的浏览器。因此,JSON 具有最广泛的支持,但它不是唯一的解决方案。
  • 更新了我的帖子,可以通过JSONP检索数据。我在帖子中发布了一个 URL 示例。