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

我试图通过 Gmail 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: (/strong > NomikOS’s trick did it for me. :) :)谢谢! !

223398 次浏览

你有大部分密码。

CURLOPT_HTTPHEADER for curl_setopt()采用一个数组,每个标头作为一个元素。

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

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

@ 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

要进行调试,可以将 CURLOPT_HEADER设置为 true,以检查使用 Firebug: : net或类似设置的 HTTP 响应。

curl_setopt($crl, CURLOPT_HEADER, true);

编辑2

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

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

使用“ Content-type: application/x-www-form-urlencode”代替“ application/json”