2010-10-18 4 views
24

Ich bin in der Lage, den folgenden curl Befehl (in der Befehlszeile) erfolgreich auszuführen:Mit PUT-Methode mit PHP cUrl Bibliothek

curl -XPOST --basic -u user:password -H accept:application/json -H Content-type:application/json --data-binary '{ "@queryid" : 1234 }' http://localhost/rest/run?10 

Hier ist, was ich bisher zu tun aber es scheint nicht, mit dem REST-Service zu arbeiten, ich bin mit:

$headers = array(
    'Accept: application/json', 
    'Content-Type: application/json', 
); 

$url = 'http://localhost/rest/run?10'; 
$query = '{ "@queryid" : 1234 }'; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
curl_setopt($ch, CURLOPT_USERPWD, "user:password"); 

curl_setopt($ch, CURLOPT_PUT, 1); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 

curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $query); 
curl_setopt($ch, CURLOPT_POSTFIELDSIZE, strlen($query)); 

$output = curl_exec($ch); 

echo $output; 

Was ist der richtige Weg, wenn sie versuchen --data-binary mit einer PUT-Methode zu konvertieren?

Antwort

41

Statt eine temporäre Datei auf der Festplatte zu schaffen, können Sie php://temp verwenden.

$body = 'the RAW data string I want to send'; 

/** use a max of 256KB of RAM before going to disk */ 
$fp = fopen('php://temp/maxmemory:256000', 'w'); 

if (!$fp) 
{ 
    die('could not open temp memory data'); 
} 

fwrite($fp, $body); 
fseek($fp, 0); 

curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); 
curl_setopt($ch, CURLOPT_INFILE, $fp); // file pointer 
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($body));        

Der Vorteil ist keine Festplatte IO so sollte es schneller und weniger Belastung auf Ihrem Server sein.

+1

Das ist brillant! Ich hatte keine Ahnung von Temp FDs, es half mir, lädt einen Upload mit curl für youtube (lesen Sie die verbleibenden Bytes in Mem und dann wie gewohnt mit Ihrer Methode hochladen) –

+0

Sollte nicht der Modus 'w +' sein? – flm

34

Hallo zusammen, ich habe es mit dieser Konfiguration arbeiten:

// Start curl 
$ch = curl_init(); 
// URL for curl 
$url = "http://localhost/"; 

// Clean up string 
$putString = stripslashes($query); 
// Put string into a temporary file 
$putData = tmpfile(); 
// Write the string to the temporary file 
fwrite($putData, $putString); 
// Move back to the beginning of the file 
fseek($putData, 0); 

// Headers 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
// Binary transfer i.e. --data-BINARY 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_URL, $url); 
// Using a PUT method i.e. -XPUT 
curl_setopt($ch, CURLOPT_PUT, true); 
// Instead of POST fields use these settings 
curl_setopt($ch, CURLOPT_INFILE, $putData); 
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($putString)); 

$output = curl_exec($ch); 
echo $output; 

// Close the file 
fclose($putData); 
// Stop curl 
curl_close($ch); 

:)

+2

+1 Vielen Dank für die Zeit nehmen, zurück und beantworten Ihre eigene Frage zu kommen gespeichert Sie mich viel Zeit – Basic

5

Alles, was eingestellt werden muss, ist die benutzerdefinierte Anfrage zur Wiederverwendung der Post-Methode.

CURLOPT_URL=>$url, 
CURLOPT_CUSTOMREQUEST=>'PUT', 
CURLOPT_POSTFIELDS=>$params, 
+0

dieser Zeiger war hilfreich für mich beim Zugriff auf eine REST-API, wo keine tatsächlichen Daten in der Anfrage übertragen wurden (die URL enthält die Parameter) – Loopo

+0

Diese Methode macht es viel einfacher, über PUT zu sprechen. Keine Dateiklirren, sondern nur die POST-Infrastruktur. – kratenko

+0

Sie haben mich gerettet ... upvoted ... –