如何在PHP的cURL POST HTTP请求中包含授权标头?

2022-08-30 08:36:25

我正在尝试通过Gmails OAuth 2.0访问用户的邮件,并且我正在通过Google的OAuth 2.0 Playground来解决这个问题。

在这里,他们指定我需要将其作为HTTP请求发送:

POST /mail/feed/atom/ HTTP/1.1
Host: mail.google.com
Content-length: 0
Content-type: application/json
Authorization: OAuth SomeHugeOAuthaccess_tokenThatIReceivedAsAString

我尝试编写一个代码来发送此请求,如下所示:

$crl = curl_init();
$header[] = 'Content-length: 0 
Content-type: application/json';

curl_setopt($crl, CURLOPT_HTTPHEADER, $header);
curl_setopt($crl, CURLOPT_POST,       true);
curl_setopt($crl, CURLOPT_POSTFIELDS, urlencode($accesstoken));

$rest = curl_exec($crl);

print_r($rest);

不工作,请帮忙。:)

更新:我接受了Jason McCreary的建议,现在我的代码看起来像这样:

$crl = curl_init();

$headr = array();
$headr[] = 'Content-length: 0';
$headr[] = 'Content-type: application/json';
$headr[] = 'Authorization: OAuth '.$accesstoken;

curl_setopt($crl, CURLOPT_HTTPHEADER,$headr);
curl_setopt($crl, CURLOPT_POST,true);
$rest = curl_exec($crl);

curl_close($crl);

print_r($rest);

但是我没有从中得到任何输出。我认为cURL在某个地方默默地失败了。请帮忙。:)

更新2:NomikOS的技巧为我做到了。:) :) :)谢谢!!


答案 1

您拥有大部分代码...

CURLOPT_HTTPHEADERfor curl_setopt() 采用一个数组,每个标头作为元素。您有一个元素具有多个标头。

您还需要将授权标头添加到数组中。$header

$header = array();
$header[] = 'Content-length: 0';
$header[] = 'Content-type: application/json';
$header[] = 'Authorization: OAuth SomeHugeOAuthaccess_tokenThatIReceivedAsAString';

答案 2

@jason-mccreary是完全正确的。此外,我建议您使用此代码以在发生故障时获取更多信息:

$rest = curl_exec($crl);

if ($rest === false)
{
    // throw new Exception('Curl error: ' . curl_error($crl));
    print_r('Curl error: ' . curl_error($crl));
}

curl_close($crl);
print_r($rest);

编辑 1

要进行调试,您可以设置为 true 以使用 firebug::net 或类似方法检查 HTTP 响应。CURLOPT_HEADER

curl_setopt($crl, CURLOPT_HEADER, true);

编辑 2

关于尝试添加此标头(只是为了调试,在生产环境中,您应该保留这些选项):Curl error: SSL certificate problem, verify that the CA cert is OKtrue

curl_setopt($crl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false);

推荐