0

我的 restler 3 api 在本地测试服务器上运行良好,如果从同一台服务器调用,则在生产服务器上运行良好,但如果我远程进行调用,那么它会失败。

将相同的 rest 客户端与 luracast 在线示例一起使用,它可以在远程调用中正常工作,因此必须是我的配置中的某些内容(我的 api 或我的生产服务器)。

我发现提到需要发送标头,因此尝试将这些标头添加到 index.php 文件中:

header('Access-Control-Allow-Origin:  *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: *');

但这没有帮助。在 Firefox 中使用 RESTClient 插件,我可以看到这些标头已发送,无论我是否使用这些标头命令,浏览器都会在本地和远程显示数据。

这是一个示例调用: https ://api.masterpiecesolutions.org/v1/artists/?key=A4oxMOYEUSF9lwyeFuleug==

我的那个调用的 index.php 使用这个,第二个参数映射到根级别

$r->addAPIClass('Artists', '');

不知道这是否相关。

另外,生产服务器是 Amazon EC2,所以可能与安全策略有关?

或者,也许是其他一些标题问题?在 google chrome 中,使用 Advanced Rest Client 扩展,它给出了状态403 ForbiddenContent-Typetext/plain(无论是使用本地服务器还是远程服务器),所以它根本不起作用,不像 firefox 插件。

我还看到了$_SERVER['HTTP_ORIGIN']在 Restler.php 中的使用,这似乎不是到处都支持吗?

4

2 回答 2

1

至少对我来说,问题在于使用 SSL,而 restclient 类不适应这种情况。

所以我添加了(从 phpclasses.org 到我的 RestClient.class.php) curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, false); // 对于 SSL,现在它可以工作了。

还需要设置 public static $crossOriginResourceSharing = true; 在 Restler 3 的 Defaults.php 中。

于 2013-03-13T16:39:58.350 回答
1

*Access-Control-Allow-Headers不是响应标头的有效值。您需要列出每个非简单请求标头。例如:

header('Access-Control-Allow-Headers: Content-Type');

还可以考虑放置一个原始值或仅*用于Access-Control-Allow-Origin标题。我刚刚访问了您的示例网址,并且该标头中有多个值。虽然这应该根据 CORS 规范工作,但它还没有被广泛采用。

最后我注意到服务器正在设置Access-Control-Allow-Credentials: true. 如果您将其设置为true,那么您还需要做另外两件事:

  1. 标头的值Access-Control-Allow-Origin必须是 Origin 的值(例如http://localhost,不能是*)。
  2. 您需要xhr.withCredentials = true;在 JavaScript 客户端代码中进行设置。

如果你只是在测试,你应该尝试在不设置Access-Control-Allow-Credentials标题的情况下让事情正常工作。这将使事情更容易调试。

于 2013-03-10T11:51:45.373 回答