web-dev-qa-db-fra.com

PHP CURL HTTP PUT

J'essaie de créer une requête HTTP PUT avec cURL et je ne peux pas le faire fonctionner. J'ai lu de nombreux tutoriels mais aucun d'entre eux n'a réellement fonctionné. Voici mon code actuel:

$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;
}

J'ai également essayé d'utiliser PHP PEAR mais j'ai obtenu le même résultat. Le problème est que le référentiel dit qu'aucune métadonnée n'a été définie. J'ai vraiment besoin d'aide! Merci!

47
user601513

Je viens de le faire moi-même aujourd'hui ... voici le code que j'ai travailler pour moi ...

$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

99
Brian

En utilisant Postman pour Chrome, en sélectionnant CODE, vous obtenez ceci ... Et ça marche

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

?>

6
Jordi Serra

Dans une méthode POST, vous pouvez placer un tableau. Cependant, dans une méthode PUT, vous devriez utiliser http_build_query pour construire les paramètres comme ceci:

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

Vous avez mélangé 2 standard.

L'erreur est dans $header = "Content-Type: multipart/form-data; boundary='123456f'";

La fonction http_build_query($filedata) concerne uniquement "Type de contenu: application/x-www-form-urlencoded" ou aucune.