PHP与Curl命令行中的卷曲

时间:2016-03-22 05:14:54

标签: php rest curl

所以,我已经有了这个用curl调用REST API的PHP脚本。 URL基本上如下所示:

https://firewall1/api/?type=config&action=set&xpath=/config/devices/entry[@name='localhost.localdomain']/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='RULENAME']&element=<disabled>no</disabled>&key=APIKEY

响应成功回归,但实际上并未在防火墙中进行更改,这看起来很奇怪。如果我使用命令行curl运行和运行相同的URL,它将按预期工作。

curl -v -k -g "https://firewall1/api/?type=config&action=set&xpath=/config/devices/entry[@name='localhost.localdomain']/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='RuleName']&element=<disabled>no</disabled>&key=APIKEY"

我的卷曲设置如下所示:

$failover1 = curl_init($enableFailover1);
$failback1 = curl_init($disableFailover1);
$commit1 = curl_init($commitFW1);

//set curl options
curl_setopt_array($failover1, array(
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_POST => TRUE,
        CURLOPT_RETURNTRANSFER => TRUE
));

$responseFail1 = curl_exec($failover1);
$responseBack1 = curl_exec($failback1);
$responseCommit1 = curl_exec($commit1);

//failover and take approprate action for errors
if($responseFail1 === FALSE) {
        die(curl_error($failover1));
} else {
      //do some stuff
}

运行PHP脚本会返回与curl命令行相同的响应,但结果不一样。是否有一些标题我没有通过或者我应该做些什么才能让它正常工作?我还应该补充说,如果我在浏览器中使用URL并粘贴并且将命令传递给shell_exec,则它可以工作。谢谢你的帮助!

来自curl命令行的响应:

* Connection #0 to host firewall1 left intact
<response status="success" code="20"><msg>command succeeded</msg></response>

PHP脚本中curl的响应:

<response status="success" code="20"><msg>command succeeded</msg></response>

1 个答案:

答案 0 :(得分:0)

看起来你在PHP调用中省略了-g选项。我可以在下面的手册中看到描述:

  

“当使用这种样式时,必须给出-g选项以阻止curl将方括号解释为特殊的globbing字符。链接本地和站点本地地址,包括作用域标识符,例如fe80 :: 1234%1,也可以使用,但范围部分必须是数字或与Linux上的现有网络接口匹配,百分比字符必须是URL转义.SFTP URL中的前一个示例可能看起来像:sftp://[fe80::1234%251]/

https://curl.haxx.se/docs/manual.html

更好的选择是在您的情况下使用PHP shell脚本执行函数shell_exec()调用整个URL字符串。 PHP curl是一个用于使用PHP进行curl的包装库,在你的情况下可能没有像你自己的-g选项那样支持PHP curl库的选项。