2013-01-22 67 views
35

我必須使用PhP cURL進行PATCH請求。我找不到任何文檔,所以我嘗試了以下方法,但它不起作用。如何使用cURL在PHP中創建PATCH請求?

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

知道爲什麼這是不工作?我該如何解決它?

編輯: 我連接到RESTful Web服務。它爲成功的請求返回HTTP/1.1 200。不成功的請求返回HTTP/1.1 403我不斷收到403

我試圖改變$數據:

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

它並沒有改變結果。

編輯2: 最終工作代碼。

$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

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

+0

請求通過罰款。 curl_error是空的。 –

+0

爲了更簡單起見,curl_setopt_array而不是curl_setopt如何? – masakielastic

回答

60

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH');應該這樣做。

+2

謝謝。這與一個額外的請求標頭'Content-Type:application/json'完成了。 –

1

嘗試使用普通陣列

// $數據= 「{ 'FIELD_NAME': 'FIELD_VALUE'}」;

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

1

由於此格式是爲HTTP PATCH請求而設計的,因此JSON PATCH對於數據格式會更好。有關規格,請參閱http://tools.ietf.org/html/rfc6902。 Rails 4的教程展示了這個例子(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

注意:RFC 6902的當前狀態是建議標準。 – masakielastic