2016-06-10 137 views
1

我在PHP寫了一個小腳本發送POST請求的Web服務器:PHP echo語句

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

?> 

是的,這是碼頭工人。我正在使用remote API in Docker,這個小小的腳本很有用! 但是,URL末尾的?t = 5會被忽略。 我猜這跟有關?

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

(我試過1001點的方式,到目前爲止,用引號和雙引號,沒有運氣。花在這4個多小時後,我以爲計算器可以幫助?)

謝謝...

注:「cid」只是硬盤上的一個文件,用於存儲容器ID。所以我從文件中檢索容器ID,並將它傳遞給URL(無論如何,這部分工作)。 完整的網址由我編寫,即未解析。

+0

您試過了嗎? '$ ch = curl_init($ url);'我不確定,但這可能會改變事情。 –

+0

對Docker一無所知,所以這可能不適用於你的情況,但是如果使用mod_rewrite解析URL,則需要在.htaccess中添加選項[QSA]以傳遞get參數 – mikesp

+0

「stop」腳本是否期望't'參數在'GET'或'POST'數據中?把它放在'?'數據中。 – Barmar

回答

3

由於您的網址沒有特殊要求,爲什麼要使用不完整的cURL包裝函數?你可以簡單地做

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

爲了回答您的實際問題,爲什麼您的查詢字符串被忽略了,那是因爲它沒有被髮送到服務器正常。谷歌CURLOPT_POSTFIELDS

編輯既然有人提到,請求方法必須是POST,你可以改變的事情一點點在你的捲曲的代碼,以滿足該

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

然後,你可以打電話給你功能如

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

集裝箱站是一個POST端點https://docs.docker.com/engine/reference/api/docker_remote_api_v1.19/#stop-a-container – Matt

1

你可能會嘗試像這樣執行?

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

?> 
+0

嗯感謝這一點,但URL參數仍然被忽略。 – Tux

+0

哦,我的道歉我會在幾分鐘內回覆給你 –

+0

除了使用連接而不是'$ cid'變量插值之外,你有什麼改變?爲什麼會有所作爲? – Barmar

1

由於您正在嘗試POST請求,您可以稍微修改您的功能。對於$ data,你可以傳遞數組(「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; 
} 
+0

你介意完成你的一段代碼,以便我可以看到你如何構造結果網址? (我真的是PHP中的noob) – Tux

+1

他的意思是,echo httpPost(「http:// 172.17.0.1:2375/containers/$ cid/stop」,array(「t」=> 5)); - 我必須在斜線之前/之後放一些空格,因爲它不斷打破完整的語法。 –

+0

'CURLOPT_POSTFIELDS'如何修改查詢字符串? – Matt

0

您的捲曲設置對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) 

?> 
+0

嗨,我怎樣才能傳遞參數沒有「?」 例如$ URL =「http://172.17.0.1:2375/containers/$cid/stop和 $ PARAM =‘6’,我們可以在接收腳本收到6? 這裏是我的問題,如果你能幫助我https://stackoverflow.com/questions/39930240/php-curl-post-value-without-querystring-parameter – p4pravin