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