2016-04-01 2 views
1

一部のユーザのデータを編集するためにPUTリクエストを作成しようとしていますが、リクエストを送信する代わりに空のデータを受信して​​います。Curl PUTリクエストと空のリクエストデータ(残りのAPI)

私は郵便配達(クロームプラグイン)で、カスタムのPHPスニペットを試してみました:

?php 
$process = curl_init('http://localhost/myapp/api/users/1.json'); 

$headers = [ 
    'Content-Type:application/json', 
    'Authorization: Basic "...=="' 
]; 
$data = [ 
    'active' => 0, 
    'end_date' => '01/01/2018' 
]; 

curl_setopt($process, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($process, CURLOPT_TIMEOUT, 30); 
curl_setopt($process, CURLOPT_PUT, 1); 
curl_setopt($process, CURLOPT_POSTFIELDS, $data); 
curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE); 
$return = curl_exec($process); 
curl_close($process); 

print_r($return); 

は、これは私がCakePHPの側を使用しているコードです:

class UsersController extends AppController 
{ 
    public function initialize() 
    { 
     parent::initialize(); 
     $this->loadComponent('RequestHandler'); 
    } 

    ....  

    public function edit($id = null) 
    { 
     debug($_SERVER['REQUEST_METHOD']); 
     debug($this->request->data); 
     die; 
    } 

    .... 

そして、これそれを出力するものである:

/src/Controller/UsersController.php (line 318) 
'PUT' 


/src/Controller/UsersController.php (line 319) 
[] 

私は混乱しています...類似したコードは、POSTリクエストのために働い及びされますアクション...このコードで何が問題になっていますか?

答えて

1

2つの問題があります。

  1. CURLOPT_PUTを使用して、あなたはまったくのデータを送信しません。現在、あなたのコード、つまり、送信するデータを定義するためにCURLOPT_INFILEを使用する必要があります。 HTTP PUTファイルへ

    CURLOPT_PUT

    TRUEPUTへのファイルは、のCURLOPT_INFILEのCURLOPT_INFILESIZEで設定する必要があります。

    http://php.net/manual/en/function.curl-setopt.php

  2. あなたは配列としてデータを定義しています。 が配列である場合

    CURLOPT_POSTFIELDS

    は、[...]、Content-Typeヘッダは、multipart/form-dataに設定されます。

    http://php.net/manual/en/function.curl-setopt.php

    データが送信される場合であってもそう、それは(それがJSON文字列を期待する)要求ハンドラコンポーネントは復号することができないフォームデータとして送信されますあなたのカスタムContent-Typeヘッダーは、データを文字列として渡さない限り設定されないため、試してみることができます。

かいつまんで、代わりにCURLOPT_PUTCURLOPT_CUSTOMREQUESTを使用して、JSON文字列としてデータを設定します。

curl_setopt($process, CURLOPT_CUSTOMREQUEST, 'PUT'); 
curl_setopt($process, CURLOPT_POSTFIELDS, json_encode($data)); 

あなたの郵便配達人のリクエストには、おそらく同様の問題があります。

関連する問題