8

フレームワークを使用せずに PHP で RESTful API を開発しようとしています。リクエストの処理中、これを使用してクライアント データを読み取ることはできません。parse_str(file_get_contents("php://input"), $put_vars);

完全なコードは次のとおりです。

public static function processRequest() {

    //get the verb
    $method = strtolower($_SERVER['REQUEST_METHOD']);

    $request = new Request();

    $data = array();
    $put_vars = array();

    switch ($method) {
        case 'get':
            $data = $_GET;
            break;
        case 'post':
            $data = $_POST;
            break;
        case 'put':
            parse_str(file_get_contents("php://input"), $put_vars);
            $data = $put_vars;
            echo $data;
            break;
    }

    $request->setMethod($method);
    $request->setRequestVars($data);

    if (isset($data['data'])) {
        $request->setData(json_decode($data));
        echo 'data exists';
    }

    return $request;
}

APIを停止するためにcURLを使用しています。このコマンドを入力すると、次のコマンドcurl -i -X PUT -d '{"name":"a","data":"data1"}' http://localhost/my-rest-api/api/のみが返されます。

Array""

適切なデータが返されないのはなぜですか?

編集

また、API であるはずの別のコードをテストしましたが、file_get_contents('php://input', true)それでも null を返します。Webサーバーに問題がある可能性がありますか?

4

2 に答える 2

16

は、JSON ではなくクエリ文字列(arg1=xyz&arg2=abc の形式)parse_strを解析するために使用されます。JSON 文字列を解析するために使用する必要があります。json_decode

$data = json_decode(file_get_contents("php://input"), true);

動作するコードは次のとおりです。

$method = strtolower($_SERVER['REQUEST_METHOD']);
$data = array();

switch ($method) {
    case 'get':
        $data = $_GET;
        break;
    case 'post':
        $data = $_POST;
        break;
    case 'put':
        $data = json_decode(file_get_contents("php://input"), true);
        break;
}

var_dump($data);

カール コマンド:

curl -i -X PUT -d '{"name":"a","data":"data1"}' http://my-server/my.php

応答:

array(2) {
  ["name"]=>
  string(1) "a"
  ["data"]=>
  string(5) "data1"
}
于 2013-09-30T14:50:34.413 に答える
2

Webサーバーに問題がある可能性がありますか?

実はそうです。これについて数時間頭を悩ませた後、欠落しているデータの原因は次のとおりであることがわかりました。

Note: Prior to PHP 5.6, a stream opened with php://input could only be read once

私のコードの前に別のコードが php://input にアクセスしていました.php <5.6のサーバーでは、これにより入力が失われました。

つまり、PUT リクエストでのみ。

于 2017-01-12T14:00:02.283 に答える