1

一部のユーザーのデータを編集するために PUT リクエストを作成しようとしていますが、リクエストで送信したデータではなく、空のデータを受信して​​います。

postman (chrome プラグイン) とカスタム 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リクエストとaddアクションに対して機能しています...このコードの何が問題になっていますか?

4

1 に答える 1

1

2 つの問題。

  1. を使用する場合CURLOPT_PUT、 を使用して送信するデータを定義する必要がありますCURLOPT_INFILE。つまり、コードは現在、データをまったく送信していません。

    CURLOPT_PUT

    HTTP PUTファイルに対してTRUE 。ファイルは、 CURLOPT_INFILEおよびCURLOPT_INFILESIZEPUTで設定する必要があります。

    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_CUSTOMREQUEST代わりに を使用CURLOPT_PUTし、データを JSON 文字列として設定します。

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

Postman リクエストにも同様の問題がある可能性があります。

于 2016-04-03T17:38:11.433 に答える