CURL呼叫在终端中工作,但它赢得了';t


CURL call works in terminal, but it won't in PHP

我一直在广泛搜索,但找不到任何与我的问题真正相关的主题,所以我决定问一个新问题。。。

我正在尝试使用CURL向Facebook Graph API发出批量请求,这在终端中很好,但在PHP中根本不会。。。

复制步骤:

1.)从Graph API资源管理器获取自己的访问令牌(不需要权限,只需一个有效令牌)链接:http://developers.facebook.com/tools/explorer

2.)将其粘贴到以下终端命令中:(请小心,您需要将其粘贴在总共4个占位符中才能正确工作!)

curl '
-F 'access_token=PASTE_ACCESS_TOKEN_HERE' '
-F 'batch=[{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"}]' '
https://graph.facebook.com

3.)在终端中执行它,它应该返回很多头,并在主体部分中返回您的名字4次(JSON编码)。

4.)到目前为止,一切都应该正常。糟糕的是,将您的令牌再次粘贴到以下PHP脚本中的4个占位符中:

<?php
$url = 'https://graph.facebook.com';
$fields = array(
                        'access_token' => 'PASTE_ACCESS_TOKEN_HERE',
                        'batch' =>
'[{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"}]'
);
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
$fields_string = rtrim($fields_string, '&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
print_r($result);
?>

6.)运行代码,您应该(至少我…)从Facebook获得以下错误消息:"{"error":{"message":"格式错误的访问令牌access_token_HERE…''"}]","type":"OAuthException","code":190}}1'

我猜Facebook认为JSON大括号是访问令牌的一部分,因此它将返回此错误。我试图从$fields['batch']的末尾删除转义的双引号和大括号,但随后它抛出了另一个错误,指出批处理参数必须是JSON字符串(显然…)

我是错过了什么,还是这是Facebook的错(如果是,我不明白为什么终端解决方案有效…)?

以下是Facebook官方文档BTW:http://developers.facebook.com/docs/reference/api/batch

提前感谢!

编辑:我找到了一个(临时)解决方法,这将起作用(当然,因为它使用了shell脚本):

<?php
$result = shell_exec('curl '
-F ''access_token=PASTE_ACCESS_TOKEN_HERE'' '
-F ''batch=[{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"},{"method":"GET","relative_url":"fql?q=SELECT+name+FROM+user+WHERE+uid%3Dme%28%29&access_token=PASTE_ACCESS_TOKEN_HERE"}]'' '
https://graph.facebook.com');
print_r(json_decode($result),true);
?>

有人知道为什么这是一个比使用PHP cURL更糟糕的解决方案吗?我在某个地方读到你不应该在PHP中使用shell脚本,但我不知道为什么。。。

谢谢!

在启动任何curl命令之前,我运行了代码的前半部分,只是为了查看$fields_string的内容。出于某种原因,rtrim没有为我删除字符串中的最后一个和号。也许可以用它来删除最后一个字符:

$fields_string = substr($fields_string, 0, -1);