【问题标题】:PHP Curl to APIPHP 卷曲到 API
【发布时间】:2018-04-16 08:41:55
【问题描述】:

我正在尝试为我的 wifi pineapple nano 编写自定义 Web 界面。我不是一个经验丰富的编码员或任何东西,但我知道并有点了解 php,并决定使用 php curl 与菠萝上的 REST API 中的构建进行对话。

我写了以下代码:

?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";

在执行时,我得到以下输出:

您的代码已启动 {"system":"notifications","action":"addNotification","message":"你好 从 阿帕奇!","apiToken":"7de64925dd8703fc5595a7d0b845ce0ed965fa799b67a19b310cb2538017aeaacb205e6dbc72d8758c3b995d25a1a273783c49bfb7519b2e71fbd49af074ab3 200错误:“” - 代码:0

但是,在菠萝上什么都没有发生。当我通过wireshark查看数据时,我得到了很多'301永久移动'包。

任何人都知道这个问题的答案,或者可能是一种更好的方式来做我想做的事情?

提前致谢!

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

【问题讨论】:

  • 您缺少 $a 的结束 ']'
  • 感谢 CURLOPT_RETURNTRANSFER,您不能使用 ! 检查 curl_exec 是否失败。 curl_exec return bool(false) 如果有错误,但响应为空,但没有发生错误,它返回一个空字符串,即!也强制转换为 bool(false),您必须通过执行 if(false===curl_exec($c)){ 检查 curl_exec 是否失败,另外,不要丢弃 curl_exec 的输出,var_dump 它。 if(false===($response=curl_exec($c))){var_dump($response);
  • 可能问题是 --- 172.16.42.1 ping 统计 --- 发送了 16 个数据包,收到了 0 个数据包,丢包率 100%,时间 14999ms
  • @buildok,这个IP是连接wifi菠萝的本地IP。连接有效,通过 CLI 或邮递员完成的 curl 请求也是如此,相信我:我确定了不止几次!
  • @inneedofhelp 谢谢,这是复制粘贴错误。编辑了它

标签: php rest curl


【解决方案1】:

如果没有你指定它,PHP curl 可能不会跟随重定向:

curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);

【讨论】:

  • 正确,curl 没有。 OP 在他的代码中注释掉了 CURLOPT_FOLLOWLOCATION
  • 没错,但是,我发现把它放进去并不会改变输出或结果
【解决方案2】:

您的代码中有 2 个“curl_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));
} 

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

第二次编辑:你试过改变 http_header 吗?

curl_setopt($c, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Authorization: ' . $key
    ));

curl_setopt($c, CURLOPT_HTTPHEADER, array(
            'accept: application/json',
            'Authorization: ' . $key
    ));

【讨论】:

  • 谢谢!注释掉最后一个,但仍然没有运气:(
  • 所有这些答案都没有成功,开始认为路由不起作用或其他什么。奇怪..
  • 好吧,我猜不是。拔出会返回正确的错误语句,因此 200 'must be correct too'
【解决方案3】:

尝试设置Content-Length标头:

curl_setopt($c, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Authorization: ' . $key,
        'Content-Length: ' . strlen( $JSON ) // <----
));

将方案添加到 URL:

curl_setopt($c, CURLOPT_URL, "http://172.16.42.1/api");

删除/评论此

curl_setopt($c, CURLOPT_POST, true);

正如你已经设置的curl_setopt($c, CURLOPT_CUSTOMREQUEST, "POST");

修复双 curl_exec: 而不是 if(!curl_exec($c)){

if( $result === false ) {

无论如何,您的代码似乎都在工作,因为服务器返回了状态代码 200

(没有错误,没有重定向)。

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

【讨论】:

  • 感谢您的帮助!我相信,该 URL 已添加。我仔细检查了,但仍然没有运气..
【解决方案4】:

原来,很多都是不必要的代码,我错过了需要在 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";
?>

感谢所有试图帮助我的人!

【讨论】:

    猜你喜欢
    • 2015-03-25
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2012-01-21
    相关资源
    最近更新 更多