web-dev-qa-db-fra.com

Comment puis-je faire une demande PATCH dans PHP en utilisant cURL?

Je dois faire une demande PATCH en utilisant PhP cURL. Je n'ai trouvé aucune documentation, j'ai donc essayé ce qui suit mais cela ne fonctionne pas.

$data = "{'field_name': 'field_value'}";
$url = "http://webservice.url";
$headers = array('X-HTTP-Method-Override: PATCH');
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($curl);
curl_close($curl);

Une idée pourquoi cela ne fonctionne pas? Comment puis-je le réparer?

Edit: Je me connecte à un service Web RESTful. Il renvoie HTTP/1.1 200 pour les demandes réussies. Les demandes infructueuses renvoient HTTP/1.1 403. Je reçois toujours 403.

J'ai essayé de changer $ data en:

$data = "data={'field_name': 'field_value'}";

Cela n'a pas changé le résultat.

Edit2: Le code de travail final.

$data = "{'field_name': 'field_value'}";
$url = "http://webservice.url";
$headers = array('Content-Type: application/json');
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($curl);
curl_close($curl);
49
Sandeep M

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH'); devrait le faire.

80
quickshiftin

JSON PATCH serait préférable pour le format de données car ce format est conçu pour la demande HTTP PATCH. Voir http://tools.ietf.org/html/rfc6902 pour la spécification. Le tutoriel de Rails 4 montre l'exemple ( http://edgeguides.rubyonrails.org/upgrading_Ruby_on_Rails.html#http-patch ).

// http://tools.ietf.org/html/rfc6902#section-4
$data = '{ "op": "add", "path": "/a/b/c", "value": "foo" }';
$headers = array('Content-Type: application/json-patch+json');
1
masakielastic

Essayez d'utiliser un tableau normal

// $ data = "{'field_name': 'field_value'}";

$ data = array ('field_name' => 'field_value');

1
Shridhar