2014-09-12 78 views
1

我试图访问API。我可以这样做从PHP为什么此CURL在PHP中工作,但不在shell中

<?php 

$url = 'http://apiurl/path'; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('API-KEY: myKey')); 
//curl_setopt($ch, CURLOPT_POST, 1); 

$output = curl_exec($ch); 
$curlInfo = curl_getinfo($ch); 
curl_close($ch); 
echo $output; /*success!*/ 

但是,从命令行执行此操作会触发403错误。

curl -i -v -H "API-KEY: myKey" http://apiurl/path 
/*failure!*/ 

什么是PHP做不同?或者我的命令行代码中有语法错误?

+0

从命令行删除它您是否在同一台服务器上运行这些? API服务器是否检查User-Agent头?您是否尝试过使用类似日志代理服务器的方式比较请求? (像[Charles](http://www.charlesproxy.com),或者[Burp](http://portswigger.net/burp/)?) – 2014-09-12 16:07:54

+0

据我所见,你在做正确的事情 - 但命令行Curl可能会发送用户代理,而我的PHP安装不。这是唯一的区别。尝试添加'-H“User-Agent:'来​​删除用户代理以查看它是否有所作为(可能在API键中可能有一些字符在命令行中的解释不同) – 2014-09-12 16:15:03

+0

@mattgibson是的, – 1252748 2014-09-12 16:17:23

回答

2

我能看到的唯一明显区别是命令行PHP在默认情况下添加了User-Agent头。可能您使用的API服务器拒绝来自Curl用户代理的请求?尝试通过添加参数-H "User-Agent:"

相关问题