【问题标题】:Ajax call only works from inside a php file and not with an url directlyAjax 调用仅适用于 php 文件内部,不能直接使用 url
【发布时间】:2017-11-30 15:09:16
【问题描述】:

我的网页在从 REST 服务器数据中绘制图表时遇到问题。 如果我使用 php 文件中的 url 执行简单的 file_get_contents 进行 ajax 调用,我的代码就可以工作。 但是,如果我想直接使用 url,则对其余服务器的调用有效,但 ajax 返回 Object 对象。

这是有效的:

jsonData=$.ajax({
      url: "getData.php",
      dataType: "json",
      data: text,
      async: false
      }).responseText;
document.getElementById("demo2").innerHTML =jsonData;

这不行

    jsonData=$.ajax({
      url: ""+text+"",
      dataType: "json",
      async: false
      }).responseText;
document.getElementById("demo2").innerHTML =jsonData;

这是我的 getData.php :

$string = file_get_contents("http://localhost:5000/'Pi%202'/5/temperature/11.27.2017%2010:00/11.28.2017%2023:00");

回声 $string;

文本包含正确的 url,因为对其余服务器的获取查询是成功的。 两者都在其余服务器上进行获取,但在第二个 jsonData 中是 Object 对象。如果我删除 responseText 我得到一个未定义而不是 Object 对象。 我已经尝试过针对这个问题提出的多种解决方案,我已经尝试了成功功能的东西,但根本没有给我任何答案。 我已经被这个问题困扰了超过 2 天,这是我整个项目工作的最后一部分,我正在认真考虑放弃它或扔掉我的电脑。 提前感谢您的帮助。

【问题讨论】:

  • 一些事情...首先,不要使用async: false。保持你的异步代码异步。通过正确使用这些工具,您遇到问题的可能性就会降低。第二,""+text+""实际上变成了什么?您还从第二个示例中省略了data,这是故意的吗?第三,定义“不工作”。这以什么具体方式失败?是否发出了 AJAX 请求?服务器的响应究竟是什么?使用浏览器的调试工具。
  • ""+text+"" 包含了其余服务器查询数据的url。我使用 jsonData 用 chart.js 绘制图形,在第一种情况下,我取回数据并且图形工作,在第二种情况下,我的数据返回 Object 对象。两个调用都从其他服务器得到完全相同的答案,所以它必须是 javascript 做一些废话。我使用 async false 是因为它不能以任何其他方式工作,....
  • 在您浏览器的调试工具中(查看网络选项卡),这两个示例的请求和响应有什么区别吗?请求的 URL 是否更改?包含的数据有变化吗?标题会改变吗?响应内容是否改变?响应头会改变吗?
  • 数据字段试图将我的 url 传递给完全失败的 php 文件。在这种情况下,它的存在没有任何区别。
  • 嗯,第一个建议是首先消除错误使用 AJAX 的变量。移除async: false 并在success 处理程序或.done() 处理程序中执行后续操作。除此之外,也许我们需要更好地理解您在这里尝试完成的目标。如果第一个代码示例有效,您为什么要更改它?

标签: javascript php ajax url


【解决方案1】:

在评论线程中对该问题进行了大量讨论后,我们似乎已经确定了该问题。为了向未来的读者澄清,问题中的两个 AJAX 请求是一回事。他们向截然不同的 URL 发出请求。

  • 一个是向托管的 PHP 应用程序发出请求,该应用程序在内部向另一个站点发出自己的 HTTP 请求并返回响应。
  • 另一个试图直接向该其他站点发出跨域 AJAX 请求。这当然是标准 CORS 错误。

专门解决评论线程中遇到的问题...

为什么我不需要在 php 文件中使用它

因为 PHP 没有在 Web 浏览器中运行。它是在服务器上运行的应用程序代码。这使得它在架构上与网络浏览器本身没有什么不同,当然,它应该能够发出 HTTP 请求。没有理由在那里施加跨域限制。

是我的浏览器不允许我访问

正确。这是一种防止站点利用跨域请求的安全措施。 (例如,想象一个嵌入了 JavaScript 的网站,该网站向所有主要银行网站发出 AJAX 请求,希望您当前已登录。)

有没有办法完全禁用这个检查?

通过编写您自己的网络浏览器。试图说服您的用户下载并运行您的网络浏览器而不是行业标准的浏览器将会遇到困难。如果您的网络浏览器的主要引人注目的功能是用户可能会受到潜在的跨域请求攻击,那么这将是一个特别困难的销售。


基本上,您在 Web 应用程序开发中遇到了一件非常常见的事情。好消息是你已经有了你正在尝试做的工作版本。你的第一个版本。您可以随意向自己的服务器端应用程序发出 AJAX 请求,而该服务器端应用程序又可以向您喜欢的外部服务发出任何请求。

【讨论】:

  • php 文件和 ajax 正在调用相同的 REST 服务器,该服务器也在本地端口 5000 上运行。浏览器可能认为它来自其他地方,但实际上它们进行了完全相同的调用并得到来自其余服务器的相同答案。服务器以 200 回答,这不会导致 cors 出现问题,除非我有东西在路上剥离了标题。遗憾的是,第一个版本不是一个选项,因为我无法选择要显示的数据。将 url 发布到 php 也不起作用。我唯一看到的是在第二个解决方案上使用了 cors 代理,但它很乱,....
  • @Ashuiegi:如果从 URL 中剥离协议和主机,AJAX 请求是否成功完成?如果您对值进行 URL 编码怎么办? (/%27Pi%201%27/14/temperature/2017.11.28%201‌​7%3A41%3A07/2017.11.28%2019%3A00%3A07) 如果主机实际上是相同的,那么 URL 可能处于被误解的状态(例如整个 URL 中那些额外的 : 字符)。但是,如果主机(甚至技术上)不同,那么这是一个简单的 CORS 问题。请注意,只要这个 PHP 站点托管在除 localhost 之外的任何地方,这个问题就会变得毫无意义。
  • @Ashuiegi: “第一个版本不是一个选项,因为我无法选择要显示的数据” - 这听起来不太可能,但不管逻辑你在这个问题的范围之外定义的是,好吧,在范围之外并且在这里完全未知。 “将 url 发布到 php 也无法正常工作” - 同样不太可能的断言。您可能需要重新考虑如何处理设计,但这并不意味着您想要的是不可能。只是到目前为止你所做的假设并没有让你到达那里。
  • 发送到其他服务器的 url 正确且相同,我可以在我的服务器上看到,这是肯定被阻止的答案。其余服务器是一个烧瓶 python 应用程序,一切都在同一台机器上运行。我知道必须可以将数据发布到 php ,我已经看到了示例,但是只要我在我的 php 文件中添加任何行,一切都会停止工作,并且我没有得到任何调试错误或任何可以帮助我的东西。
  • @Ashuiegi:坚持它必须是正确的实际上并不是正确问题。是的,一切都在同一台机器上运行。但从浏览器的角度来看,这并不能使它成为相同的 host“只要我的 php 文件有任何一行,一切都会停止工作” - 听起来你在代码中犯了错误。它发生了,没关系。但是放弃并尝试做其他按设计显然不会起作用的事情不是答案。我可以理解您的沮丧,但此时您只是在与您的网络浏览器争论。网络浏览器不会改变主意。
【解决方案2】:

在 REST 服务器的情况下,解决方案非常简单。

只需将 cors 支持添加到 python flask rest 应用程序即可。

只需将这些行添加到其余服务器:

from flask_cors import CORS
CORS(app)

当我认为我的代码或我使用的方法足够好时,问题来自于我对 cors 一无所知并且我的 rest 服务器在本地运行时需要它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2016-04-20
    相关资源
    最近更新 更多