如何发出 PHP CORS 请求?

Posted

技术标签:

【中文标题】如何发出 PHP CORS 请求?【英文标题】:How do I make a PHP CORS request? 【发布时间】:2017-03-02 04:43:00 【问题描述】:

我正在尝试使用 php Curl 向我们的 API 站点发出请求。目前,我正在尝试提出一个简单的请求

API 站点有一个返回 JSON 格式数据的目录。脚本如下所示:\

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');

$arr['id'] = '001';
$arr['desc'] = 'Simple JSON output';

$json = json_encode($arr);

echo $json;
?>

如果我从浏览器访问 API 站点 (api/test_json),我会看到 json 数据:

我在另一个域上有一个 PHP 脚本试图获取 JSON 数据:

<?php
$url = "http://ourapi.com/test_json/";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSLVERSION, 3);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
$str = curl_exec($curl);
curl_close($curl);

var_dump($str);
?>

但是当我运行时,我得到了 bool(false) 的返回值。我是否遗漏了代码中的任何内容?

【问题讨论】:

为什么在 url 不使用 ssl 的情况下设置 ssl 选项?顺便说一句,如果您从 php 调用 api,则不需要 CORS 标头,如果您想直接从 javascript 调用 api,则只需要它。 我可以删除 SSL。不幸的是,JavaScript 不是一个选项。 【参考方案1】:

服务器端调用不受跨域请求政策的约束。问题在于 API 的可用性。是否需要任何身份验证?可能当您从浏览器请求它时,您有一个会话 cookie。

简化您的代码,只需 file_get_contents("http://ourapi.com/test_json/"); 启用所有错误显示,看看它是否给出任何错误。

【讨论】:

我明白了,问题是我调用 API 的网络主机不允许调用 file_get_contents()。希望我仍然可以发出服务器端 CORS 请求。 如果带有 URL 的 file_get_contents() 受到限制,那么 CURL 是否也被禁用?您是否在 Google AppEngine 之类的工具上运行此代码? 一些网络主机限制使用 file_get_contents(),但允许 CURL。代码在我们的虚拟主机上运行

以上是关于如何发出 PHP CORS 请求?的主要内容,如果未能解决你的问题,请参考以下文章

发出 POST 请求时如何防止触发 CORS? [复制]

从 Blazor 发出 CORS 请求时如何包含凭据?

CORS 谷歌浏览器扩展有啥替代品吗?如何在不使用 CORS 的情况下成功发出 ajax 请求?

如何在 Bluemix 中向节点应用程序发出 cors 请求

如何在 Angular 2 中发出启用 CORS 的 HTTP 请求?

从 Swagger Editor 发出请求时,如何避免 CORS 错误(“无法获取”或“未找到服务器或发生错误”)?