【问题标题】:PHP echo statement with URL parameter带有 URL 参数的 PHP 回显语句
【发布时间】:2016-06-10 07:32:53
【问题描述】:

我用 PHP 写了一个小脚本来向 web 服务器发送一个 POST 请求:

<?php

$cid = file_get_contents('cid');

function httpPost($url)
{
    $ch = curl_init();

    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_POST, true);

    $output=curl_exec($ch);

    curl_close($ch);
    return $output;
}

echo httpPost("http://172.17.0.1:2375/containers/$cid/stop?t=5");

?>

是的,这是 Docker。我正在使用remote API in Docker,这个小脚本有效! 但是,URL 末尾的 ?t=5 会被忽略。 我想这与 ? 有关。

如何正确格式化此 URL,以便 ?t=5 正常工作?

(到目前为止,我尝试了 1001 种方法,使用引号和双引号,但没有成功。花了 4 个多小时后,我认为 stackoverflow 可以提供帮助?)

谢谢...

注意:“cid”只是硬盘上的一个文件,用于存储容器 ID。所以我正在从文件中检索容器 ID,并将其传递给 URL(无论如何,这部分都有效)。 完整的网址是我写的,即未解析。

【问题讨论】:

  • 你试过了吗? $ch = curl_init($url);我不确定,但这可能会改变事情。
  • 对 Docker 一无所知,因此这可能不适用于您的情况,但如果使用 mod_rewrite 解析 URL,您需要在 .htaccess 中添加选项 [QSA] 以传递获取参数跨度>
  • stop 脚本是否期望t 参数位于GETPOST 数据中?将其放在? 之后将其放入GET 数据中。
  • 好吧,这可以作为命令行工作:curl -v --raw -X POST http://172.17.0.1:2375/containers/79dbbc471a4a/stop?t=5。所以我找到了一种让容器ID“动态”的方法。然后,我在网上寻找一种在 PHP 中构造正确 cURL 函数的方法。这就是我卡住的地方。
  • 嘿晚礼服,更新了下面的答案。您缺少 CURLOPT_POSTFIELDS。

标签: php curl docker http-post


【解决方案1】:

既然对你的 URL 没有特殊要求,为什么要使用一个不完整的 cURL 包装函数呢?你可以简单地做

echo file_get_contents("http://172.17.0.1:2375/containers/$cid/stop?t=5");

要回答您的查询字符串为何被忽略的实际问题,这是因为它没有正确发送到服务器。谷歌 CURLOPT_POSTFIELDS

编辑既然提到了请求方法必须是 POST,你可以在你的 cURL 代码中稍作改动以适应它

curl_setopt($ch, CURLOPT_POSTFIELDS,"t=5");

然后你可以像这样调用你的函数

echo httpPost("http://172.17.0.1:2375/containers/$cid/stop");

【讨论】:

【解决方案2】:

由于您正在尝试 POST 请求,因此您可以稍微修改一下您的函数。对于 $data,您可以传递 array("t"=>5)。

function httpPost($url, $data = '')
{
    $ch = curl_init();

    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_POST, true);
    if ($data != '')
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    $output=curl_exec($ch);

    curl_close($ch);
    return $output;
}

【讨论】:

  • 您介意完成您的代码,以便我了解您是如何构建结果 URL 的吗? (我真的是 PHP 的菜鸟)
  • 他的意思是,echo httpPost("http://172.17.0.1:2375/containers/$cid/stop", array("t"=>5)); -- 我不得不在斜杠之前/之后放置一些空格,因为它不断破坏完整的语法。
  • CURLOPT_POSTFIELDS如何修改查询字符串?
【解决方案3】:

你可以试试这样执行吗?

<?php
$cid = file_get_contents('cid');

function containeraction($cid, $action, $s) {
    //Time in Seconds
    $timedelay="t=".$s;
    //Docker Container Host
    $dockerhost="172.17.0.1";
    //Host Port
    $port="2375";
    $url = "http://".$dockerhost.":".$port."/containers/".$cid."/".$action;
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_POSTFIELDS, $timedelay);
    $output=curl_exec($ch);
    curl_close($ch);
    return $output;
}

//containeraction(container id, action, delay)
echo containeraction($cid, "stop", "5");

?>

【讨论】:

  • 嗯,谢谢你,但 URL 参数仍然被忽略。
  • 抱歉,我会在几分钟内回复您
  • 除了对$cid 变量使用串联而不是插值之外,您还做了哪些更改?为什么会有不同?
  • 我认为我们正在接近它,使用史蒂夫的代码。但是,URL 被执行,再次忽略了 URL 参数! (这个 t=5 应该在停止容器之前暂停 5 秒)
  • 我才意识到这是为了什么……一瞬间
【解决方案4】:

您的 curl 设置适用于 Docker 并传递查询字符串。读取文件时确实需要修剪空格,以防末尾有新行。

<?php

$cid = trim(file_get_contents('cid'));
echo "$cid\n";

function httpPost($url)
{
    $ch = curl_init();

    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_POST, true);

    $output=curl_exec($ch);

    curl_close($ch);
    return $output;
}

$url = "http://172.17.0.1:2375/containers/$cid/stop?t=6";
echo "$url\n";
echo httpPost($url)

?>

【讨论】:

猜你喜欢
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多