2016-06-10 5 views
1

Ich schrieb einen Mini-Skript in PHP eine POST-Anforderung an den Web-Server zu senden:PHP echo-Anweisung mit URL-Parameter

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

?> 

Ja, das Docker ist. Ich benutze die remote API in Docker, und dieses kleine Stück Skript funktioniert! Allerdings wird das? T = 5 am Ende der URL ignoriert. Ich denke, es hat mit der zu tun?.

Wie bekomme ich diese URL richtig formatiert, so dass die? T = 5 korrekt funktioniert?

(I 1.001 Weise versucht, so weit, mit Zitaten und doppelten Anführungszeichen, ohne Glück. Nach mehr als 4 Stunden dafür ausgegeben, dachte ich Stackoverflow helfen könnte?)

Dank ...

HINWEIS: Die "CID" ist nur eine Datei auf der Festplatte, die die Container-ID speichert. Also lade ich die Container-ID aus der Datei ab und übergebe sie an die URL (dieser Teil funktioniert sowieso). Die vollständige URL wird von mir geschrieben, d. H. Nicht geparst.

+0

Haben Sie das versucht? '$ ch = curl_init ($ url);' Ich bin mir nicht sicher, aber das könnte die Dinge ändern. –

+0

weiß nichts über Docker, so dass dies in Ihrem Fall nicht funktionieren könnte, aber wenn die URL mit mod_rewrite geparst wird, müssen Sie die Option [QSA] in der .htaccess übergeben, um get Parameter zu erhalten – mikesp

+0

Erwartet das 'stop' Skript das 't' Parameter in' GET' oder 'POST' Daten zu sein? Setzen Sie es nach '?' Setzt es in die 'GET' Daten. – Barmar

Antwort

3

Da an Ihrer URL keine besonderen Anforderungen gestellt werden, warum sollten Sie eine unvollständige cURL-Wrapper-Funktion verwenden? Sie einfach

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

Um Ihre eigentliche Frage, warum Ihre Abfrage-String zu antworten ignoriert wird, ist es, weil es nicht richtig an den Server gesendet wird. Google CURLOPT_POSTFIELDS

bearbeiten Da wurde erwähnt, dass die Anforderungsmethode POST sein muss, können Sie die Dinge ein wenig in Ihrem cURL-Code ändern für die

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

gerecht zu werden Dann können Sie rufen Sie Ihren Funktion wie

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

Container-Stop ist ein POST-Endpunkt https://docs.docker.com/engine/reference/api/docker_remote_api_v1.19/#stop-a-container – Matt

1

Sie könnten versuchen, so auszuführen?

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

ummm danke dafür, aber der URL-Parameter wird immer noch ignoriert. – Tux

+0

Oh, Entschuldigung, ich werde in ein paar Minuten auf Sie zurückkommen dann –

+0

Was haben Sie anders als die Verkettung anstelle der Interpolation für die $ cid-Variable geändert? Warum sollte das einen Unterschied machen? – Barmar

1

Da Sie eine POST-Anfrage versuchen, können Sie Ihre Funktion ein wenig ändern. Für $ Daten können Sie Array übergeben ("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

Würde es Ihnen etwas ausmachen, Ihr Stück Code zu vervollständigen, damit ich sehen kann, wie Sie das bauen Ergebnis-URL? (Ich bin wirklich ein Noob in PHP) – Tux

+1

Er meint, Echo httpPost ("http: // 172.17.0.1:2375/Container/$ cid/stop", Array ("t" => 5)); - Ich musste einige Leerzeichen vor/nach Schrägstrichen einfügen, da es immer wieder die volle Syntax durchbrach. –

+0

Wie ändert 'CURLOPT_POSTFIELDS' die Abfragezeichenfolge? – Matt

0

Ihr Curl-Setup funktioniert gegen Docker und übergibt die Abfragezeichenfolge. Sie müssen Whitespace beim Lesen von Dateien trimmen, falls am Ende eine neue Zeile vorhanden ist.

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

HI, wie kann ich den Parameter ohne "?" zB $ url = "http://172.17.0.1:2375/containers/$cid/stop und $ param =" 6 "und wir können die 6 auf dem empfangenden Skript erhalten? Hier ist meine Frage, wenn Sie helfen können Ich https://stackoverflow.com/questions/39930240/php-curl-post-value-without-querystring-parameter – p4pravin