2013-01-22 31 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を返します。それは結果を変更しませんでした

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

:失敗した要求が、私は403

を得続けるHTTP/1.1 403を返す私はに$データを変更しようとしました。

Edit2: 最終的な作業コード。

$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ではなくcurl_setopt_arrayについて教えてください。 – 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の現在のステータスはProposed Standardです。 – masakielastic

関連する問題