PHP-Curl到API

PHP-Curl到API,php,rest,curl,Php,Rest,Curl,我正在尝试为我的wifi菠萝nano编写一个自定义web界面。我不是一个有经验的程序员,但我知道并理解php,并决定使用PHPCURL与菠萝上的内置RESTAPI进行对话 我编写了以下代码: ?php print "your code started</br>"; $key="7de64925dd8703fc5595a7d0b845ce0ed965fa799b67a19b310cb2538017aeaacb205e6dbc72d8758c3b995d25a1a273783c49bf

我正在尝试为我的wifi菠萝nano编写一个自定义web界面。我不是一个有经验的程序员,但我知道并理解php,并决定使用PHPCURL与菠萝上的内置RESTAPI进行对话

我编写了以下代码:

?php
print "your code started</br>";

$key="7de64925dd8703fc5595a7d0b845ce0ed965fa799b67a19b310cb2538017aeaacb205e6dbc72d8758c3b995d25a1a273783c49bfb7519b2e71fbd49af074ab35";

//define and encode json
/*$a = new \stdClass();
$a->module="Filters";
$a->action="addClient";
$a->mac="c0:ee:fb:4a:c1:57";
$a->apiToken=$key;
 */

$a=[
        'system'=>'notifications',
        'action'=>'addNotification',
        'message'=>'Hello from apache!',
        'apiToken'=>'7de64925dd8703fc5595a7d0b845ce0ed965fa799b67a19b310cb2538017aeaacb205e6dbc72d8758c3b995d25a1a273783c49bfb7519b2e71fbd49af074ab35'

   ];
    $JSON = json_encode($a);
    print $JSON;
    //curl post request
    $c = curl_init();
    curl_setopt($c, CURLOPT_CUSTOMREQUEST, "POST");
    //curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($c, CURLOPT_URL, "172.16.42.1/api");
    curl_setopt($c, CURLOPT_POST, true);
    curl_setopt($c, CURLOPT_POSTFIELDS, $JSON);
    curl_setopt($c, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Authorization: ' . $key
    ));

    //print curl output
    $result = curl_exec($c);
    print $result;
    $info = curl_getinfo($c);
print '</br>';
print $info['http_code'];
if(!curl_exec($c)){
        die('Error: "' . curl_error($c) . '" - Code: ' . curl_errno($c));
}
//close curl request
        curl_close($c);
        //debug
print "</br>Your code ran";
?php
打印“您的代码已启动”
; $key=“7DE64925DD8703FC5595A7D0B845CE0ED965FA799B67A19B310CB538017AEAACB205E6DBC72D8758C3B995D25A1A273783C49BFB7519B2E71FBD49AF074AB35”; //定义和编码json /*$a=new\stdClass(); $a->module=“Filters”; $a->action=“addClient”; $a->mac=“c0:ee:fb:4a:c1:57”; $a->apiToken=$key; */ 一美元=[ “系统”=>“通知”, “操作”=>“添加通知”, 'message'=>'Hello from apache!', “apiToken”=>“7de64925dd8703fc5595a7d0b845ce0ed965fa799b67a19b310cb2538017aeaacb205e6dbc72d8758c3b995d25a1a273783c49bfb7519b2e71fbd49af074ab35” ]; $JSON=JSON_encode($a); 打印$JSON; //提交请求 $c=curl_init(); curl_setopt($c,CURLOPT_CUSTOMREQUEST,“POST”); //curl_setopt($c,CURLOPT_FOLLOWLOCATION,true); curl_setopt($c,CURLOPT_RETURNTRANSFER,true); curl_setopt($c,CURLOPT_URL,“172.16.42.1/api”); curl_setopt($c,CURLOPT_POST,true); curl_setopt($c,CURLOPT_POSTFIELDS,$JSON); curl_setopt($c,CURLOPT_HTTPHEADER,数组( '内容类型:application/json', “授权:”。$key )); //打印卷曲输出 $result=curl_exec($c); 打印$result; $info=curl\u getinfo($c); 打印“
”; 打印$info['http_code']; 如果(!curl_exec($c)){ die('Error:'.curl_Error($c)。'-Code:'.curl_errno($c)); } //关闭卷曲请求 收尾费($c); //调试 打印“
您的代码已运行”;
执行时,我得到以下输出:

您的代码已启动 {“系统”:“通知”,“操作”:“添加通知”,“消息”:“您好” 从…起 apache!,“apiToken:“7de64925dd8703fc5595a7d0b845ce0ed965fa799b67a19b310cb2538017aeaacb205e6dbc72d8758c3b995d25a1a273783c49bfb7519b2e71fbd49af074ab35” 200错误:“”-代码:0

然而,在菠萝上什么也没有发生。当我通过wireshark查看数据时,我得到了很多“301永久移动”包

有人知道这个问题的答案,或者是我想做的事情的更好的方法吗

提前谢谢

仅供参考:curl请求在CLI和postman中都能工作,使用这些方法似乎没有任何问题。

您的代码中有2个“curl\u exec”

我不确定这是否是编写代码的好方法:)

如果你看一下日志的末尾,你会发现

200错误:“”-代码:0

至少要纠正这一点

$result = curl_exec($c);
    print $result;
    $info = curl_getinfo($c);
print '</br>';
print $info['http_code']; // (it displays http 200 : it works)
if(!curl_exec($c)){
        die('Error: "' . curl_error($c) . '" - Code: ' . curl_errno($c));
} 


PHP curl可能不会遵循重定向,除非您使用以下命令进行指定:

curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);

尝试设置
内容长度
标题:

curl_setopt($c, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Authorization: ' . $key,
        'Content-Length: ' . strlen( $JSON ) // <----
));
删除/评论此内容

curl_setopt($c, CURLOPT_POST, true);
因为您已经设置了
curl_setopt($c,CURLOPT_CUSTOMREQUEST,“POST”)

修复双
curl\u exec
:而不是
if(!curl\u exec($c)){


无论如何,当服务器返回状态代码
200
时,您的代码似乎正常工作

(无错误,无重定向)


仔细检查它实际上不会在目标服务器上产生任何结果。

结果是,很多代码都是不必要的,我错过了需要在url中定义的端口。工作代码如下:

<?php
print "your code started</br>";

//define JSON
$a=[
    'system'=>'notifications',
    'action'=>'addNotification',
    'message'=>'Hello from apache!',
    'apiToken'=>'apikey123'
];

//encode JSON
$JSON = json_encode($a);
print $JSON;

//curl post request
$c = curl_init();
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_URL, "http://172.16.42.1:1471/api/");
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $JSON);
curl_setopt($c, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
));

//print curl output
$result = curl_exec($c);
if($result === false){
    die('Error: "' . curl_error($c) . '" - Code: ' . curl_errno($c));
}
print $result;
$info = curl_getinfo($c);
print '</br>';
print $info['http_code'];

//close curl request
    curl_close($c);
    //debug
print "</br>Your code ran";
?>

您缺少$athanks to CURLOPT\u RETURNTRANSFER的结束“]”,您不能使用
检查curl\u exec是否失败。curl\u exec返回bool(false)如果有错误,但响应为空,但未发生错误,则返回空字符串,该字符串也会强制转换为bool(false),您必须通过执行if(false===curl\u exec($c)){
来检查if curl\u exec失败,另外,不要放弃curl\u exec的输出,var\u转储它。
if(false==($response=curl\u exec($c)){
var\u dump($response);
问题可能是--172.16.42.1 ping统计--16个数据包传输,0个接收,100%数据包丢失,时间14999ms@buildok,此IP是一个连接到wifi菠萝的本地IP。连接工作正常,通过CLI或postman执行curl请求时也是如此,请相信我:我多次确认!@inneedofhelp谢谢,这是一个复制粘贴错误。将其编辑为outcorrect,curl不正确。OP在其代码中注释掉了CURLOPT_FOLLOWLOCATION。这是真的,但是,我发现放入此选项不会更改输出或结果!注释掉了最后一个选项,但仍然不走运:(所有这些答案都没有成功,开始认为路由不起作用或其他什么。奇怪..好吧,我想没有。拔出返回正确的错误语句,因此200“也必须正确”感谢您的帮助!我相信URL已经添加了。我重复了检查,但仍然不走运。。
curl_setopt($c, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Authorization: ' . $key,
        'Content-Length: ' . strlen( $JSON ) // <----
));
curl_setopt($c, CURLOPT_URL, "http://172.16.42.1/api");
curl_setopt($c, CURLOPT_POST, true);
if( $result === false ) {
<?php
print "your code started</br>";

//define JSON
$a=[
    'system'=>'notifications',
    'action'=>'addNotification',
    'message'=>'Hello from apache!',
    'apiToken'=>'apikey123'
];

//encode JSON
$JSON = json_encode($a);
print $JSON;

//curl post request
$c = curl_init();
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_URL, "http://172.16.42.1:1471/api/");
curl_setopt($c, CURLOPT_POST, true);
curl_setopt($c, CURLOPT_POSTFIELDS, $JSON);
curl_setopt($c, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
));

//print curl output
$result = curl_exec($c);
if($result === false){
    die('Error: "' . curl_error($c) . '" - Code: ' . curl_errno($c));
}
print $result;
$info = curl_getinfo($c);
print '</br>';
print $info['http_code'];

//close curl request
    curl_close($c);
    //debug
print "</br>Your code ran";
?>