【问题标题】:RESTful API returns data when request originates from browser or PHP, but not from JavaScript. Why?当请求来自浏览器或 PHP,而不是来自 JavaScript 时,RESTful API 返回数据。为什么?
【发布时间】:2011-05-02 04:48:17
【问题描述】:

我正在尝试使用 $jQuery.get() 通过 GET 请求调用(私有)RESTful Web 服务。但是当我这样做时,我没有收到任何响应数据(尽管我确实收到了 200 OK 响应代码!)。

当我从 PHP (file_get_contents()) 进行完全相同的调用或只是将 GET URL 粘贴到我的浏览器窗口时,我会收到 (JSON) 响应。

使用 Firebug,我可以看到从 jQuery 发出请求时发送的请求标头与将 URL 粘贴到浏览器时完全没有区别。唯一的区别是 jQuery 添加了“Referer”和“Origin”标头 - 然而,我使用 Firefox 的 ModifyHeaders 扩展将这两个标头强制添加到我的直接浏览器请求中,我仍然可以取回数据,所以服务不能基于Referer/Origin进行过滤。

所以基本上我想知道如果我可以发出两个看似相同的请求但通过 jQuery 却没有收到响应,那到底发生了什么。是否有一些我看不到的“隐藏”标头或参数,服务器可以使用它们来确定请求是通过 JavaScript 发送的?

我的代码就像$.get("http://example.com/json.php?q=sometext", function(response) { alert(response); });一样简单

谢谢。

【问题讨论】:

  • get()调用中的链接中删除域

标签: php jquery ajax json


【解决方案1】:

您是否有可能通过尝试发送跨域 AJAX 请求而违反 same origin policy?如果不确保服务器将正确的 Content-Type 标头设置为 application/json 以便 jQuery 在成功回调中自动为您提供准备好使用的解析对象。还可以尝试将相对 url 传递给 $.get 函数:

$.get("/json.php?q=sometext", function(response) { 
    alert(response); 
});

【讨论】:

  • 啊,对不起,忘了说这是一个远程服务。但是我使用过其他远程服务,直接从页面上的 jQuery 调用它们(例如 YouTube、Flickr API)并且它们工作得很好。有任何想法吗?谢谢。
  • @BigJeffrey,如果他们使用 JSONP,那么这是可能的。使用纯 JSON,则不是。
【解决方案2】:

试试这个:

$.get("http://example.com/json.php?q=sometext", 
      function(response) { alert(response); },
      "json");

注意最后一个参数。

【讨论】:

  • 谢谢,但这没有帮助。我也尝试过使用 $.getJSON()。 Firebug 报告“200 OK”,但整行为红色,旁边有一个红十字图标 - 但没有任何错误或任何内容的注释(只是一个空白的响应正文)。
猜你喜欢
  • 1970-01-01
  • 2013-06-14
  • 2017-04-04
  • 2015-10-07
  • 1970-01-01
  • 2017-05-07
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多