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

时间:2012-09-08 13:40:12

标签: php http curl oauth

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

在这里,他们已经指定我需要将其作为HTTP REQUEST发送:

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 的技巧为我做了。 :) :) :)谢谢!!

3 个答案:

答案 0 :(得分:35)

你有大部分代码......

curl_setopt()

CURLOPT_HTTPHEADER采用一个数组,每个标头都作为一个元素。你有一个元素有多个标题。

您还需要将授权标头添加到$header阵列。

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

答案 1 :(得分:17)

@ 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);

答案 2 :(得分:0)

使用“内容类型:application / x-www-form-urlencoded”,而不是“ application / json”