使用 Curl 调用 Slim CORS Web 服务

Posted

技术标签:

【中文标题】使用 Curl 调用 Slim CORS Web 服务【英文标题】:Calling a Slim CORS Web Service using Curl 【发布时间】:2018-11-13 19:46:56 【问题描述】:

我在使用 Curl 让 Slim CORS Web 服务工作时遇到问题

从基于浏览器的 Ajax 服务调用时它工作正常,但从服务器上的脚本调用时我无法让它工作。 CORS 已设置为允许从“*”访问

$url = "https://server.local/api/v1.0/issueJWTToken";

$ch1 = curl_init();

$headers = [
    "Origin: https://server.local",
    "Content-Type: text/plain",
    "Access-Control-Request-Headers: Content-Type, Origin"
];

curl_setopt_array($ch1, array(
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => 'OPTIONS',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_NOBODY => true,
    CURLOPT_SSL_VERIFYHOST => 0,
    CURLOPT_SSL_VERIFYPEER => false
));

$data = curl_exec($ch1);

curl_close($ch1);

这将返回以下内容:

HTTP/1.1 200 OK 
Date: Mon, 04 Jun 2018 12:33:51 GMT 
Server: Apache/2.4.10 (Debian) 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Accept, 
Origin, Authorization 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
Content-Length: 0 
Content-Type: text/html; 
charset=UTF-8

然后我按照以下方式进行 POST 事务:

$post_fields = "id=1" ;

$headers = [
    "Origin: https://server.local",
    "Content-Type: text/plain"
];

$ch = curl_init();

curl_setopt_array($ch,[
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => $url,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_HEADER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS=> $post_fields,
    CURLOPT_SSL_VERIFYHOST => 0,
    CURLOPT_SSL_VERIFYPEER => false
]);

$data = curl_exec($ch);

但我得到以下内容

HTTP/1.1 405 Method Not Allowed 
Date: Mon, 04 Jun 2018 12:38:02 GMT Server: Apache/2.4.10 (Debian) 
Allow: OPTIONS 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Accept, Origin, Authorization 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
Content-Length: 559 
Content-Type: text/html;charset=UTF-8 
<html> 
    <head> 
        <title>Method not allowed</title>
    </head>
    <body>
        <h1>Method not allowed</h1> 
        <p>Method  not allowed. Must be one of: <strong>OPTIONS</strong></p> 
    </body> 
</html>

我做错了吗? OPTIONS 调用似乎工作正常,但我无法让 POST 成功。

我应该在 POST 中传递回 OPTIONS 响应中返回的内容吗?

非常感谢任何帮助

尼尔

更新:CORS 设置如下所示

$app->options('/routes:.+', function ($request, $response, $args) 
    return $response;
);

$app->add(function ($req, $res, $next) 
    $response = $next($req, $res);
    return $response
    ->withHeader('Access-Control-Allow-Origin', '*')
    ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')
    ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
);

【问题讨论】:

我不知道答案,但我可以告诉你的是 OPTIONS 是一个飞行前请求,它基本上询问服务器“我的请求有效吗?”你可以阅读它here。这通常是由浏览器发出的。不过我找到了this SO answer,这可能会对您有所帮助。 “我应该在 POST 中传递回 OPTIONS 响应返回的内容吗?” ——通常不会。您正在与之交谈的 API 可能有奇怪的要求。 API 是我的,使用 Slim 实现。我已经设置了如上所述的 CORS 详细信息。当使用 javascript 作为浏览器的 Ajax 服务调用时,它适用于所有事务类型。当使用 Curl 从同一服务器上的 php 脚本调用时,我无法让它工作 【参考方案1】:

原来是我是个白痴。我的 API 的 URL 路径错误。哦! .感谢那些回复的人。尼尔

【讨论】:

以上是关于使用 Curl 调用 Slim CORS Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

PHP Slim 框架 CORS

Slim 框架上 CORS 期间的预检授权标头

被 CORS 策略 Angular 和 Slim 阻止

使用 CURLOPT_HTTPHEADER 设置 CURL 标头会产生 CORS 问题

使用 CORS 到 API 网关的 AJAX POST 不起作用,但可以使用 CURL 进行 POST

Node.js 中的 cURL 等效项?