2013-01-22 17 views
35

Devo fare una richiesta PATCH utilizzando PhP cURL. Non sono riuscito a trovare alcuna documentazione, quindi ho provato quanto segue ma non funziona.Come posso fare una richiesta PATCH in PHP usando cURL?

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

Qualche idea sul perché questo non funziona? Come posso ripararlo?

Modifica: Mi collego a un servizio Web RESTful. Restituisce HTTP/1.1 200 per richieste riuscite. richieste senza successo ritorno HTTP/1.1 403. Continuo a ricevere 403.

Ho provato a cambiare $ dati:

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

E non ha cambiato il risultato.

Edit2: Il codice di lavoro finale.

$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); 
+0

Provare ['curl_error()'] (http://php.net/manual/en/function.curl-error.php). – jeremy

+0

La richiesta va bene. curl_error è vuoto. –

+0

Che dire di curl_setopt_array invece di curl_setopt per una maggiore semplicità? – masakielastic

risposta

60

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH'); dovrebbe farlo.

+2

Grazie. Questo insieme a un'intestazione di richiesta aggiuntiva 'Content-Type: application/json' ha fatto il trucco. –

1

provare a utilizzare gamma normale

dati // $ = "{ 'FIELD_NAME': 'FIELD_VALUE'}";

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

1

JSON PATCH potrebbe essere migliore per il formato dei dati poiché questo formato è progettato per la richiesta HTTP PATCH. Vedi http://tools.ietf.org/html/rfc6902 per le specifiche. Il tutorial di Rails 4 mostra l'esempio (http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#http-patch).

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

Nota: lo stato corrente di RFC 6902 è lo standard proposto. – masakielastic

Problemi correlati