PHP cURL HTTP PUT

74

Ich versuche, eine HTTP-PUT-Anforderung mit cURL zu erstellen, aber ich kann sie nicht zum Laufen bringen. Ich habe viele Tutorials gelesen, aber keines davon hat tatsächlich funktioniert. Hier ist mein aktueller Code:

$filedata = array('metadata' => $rdfxml);
$ch = curl_init($url);
$header = "Content-Type: multipart/form-data; boundary='123456f'";
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array($header));
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($filedata));
$returned = curl_exec($ch);

if (curl_error($ch))
{
    print curl_error($ch);
}
else
{
    print 'ret: ' .$returned;
}

Ich habe auch versucht, PHP PEAR zu verwenden, habe aber das gleiche Ergebnis erzielt. Das Problem ist, dass das Repository angibt, dass keine Metadaten festgelegt wurden. Ich brauche wirklich Hilfe! Vielen Dank!

user601513
quelle

Antworten:

149

Habe das heute selbst gemacht ... hier ist Code, den ich für mich arbeiten habe ...

$data = array("a" => $a);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data));

$response = curl_exec($ch);

if (!$response) 
{
    return false;
}

src: http://www.lornajane.net/posts/2009/putting-data-fields-with-php-curl

Brian
quelle
3
Beachten Sie, dass ich versucht habe, curl_setopt($curl, CURLOPT_PUT, true);diesen Code zu verwenden, und er nicht funktioniert hat und daher entfernt werden curl_setopt($curl, CURLOPT_PUT, true);muss.
Nick M
Wie lesen Sie die PUT-Daten? Ich habe alles versucht, aber kein Glück. POST, GET oder REQUEST funktionieren nicht.
andrebruton
5
@andrebruton Ich würde versuchenfile_get_contents('php://input')
Vojtech Kane
16

Wenn Sie mit Postman for Chrome CODE auswählen, erhalten Sie Folgendes ... und es funktioniert

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://blablabla.com/comorl",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "PUT",
  CURLOPT_POSTFIELDS => "{\n  \"customer\" : \"con\",\n  \"customerID\" : \"5108\",\n  \"customerEmail\" : \"[email protected]\",\n  \"Phone\" : \"34600000000\",\n  \"Active\" : false,\n  \"AudioWelcome\" : \"https://audio.com/welcome-defecto-es.mp3\"\n\n}",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache",
    "content-type: application/json",
    "x-api-key: whateveriyouneedinyourheader"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

?>

Jordi Serra
quelle
3

In einer POST-Methode können Sie ein Array einfügen. In einer PUT-Methode sollten Sie jedoch http_build_querydie folgenden Parameter erstellen:

curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $postArr ) );
beck bi
quelle
1

Sie haben 2 Standard gemischt.

Der Fehler ist in $header = "Content-Type: multipart/form-data; boundary='123456f'";

Die Funktion http_build_query($filedata)ist nur für "Inhaltstyp: application / x-www-form-urlencoded" oder keine.

Fabian Maximiliano Lucena Gome
quelle