内容类型为 json 的 PUT 请求

PUT request with json content-type

我有一个基于 $_SERVER['REQUEST_METHOD']switchPUT 的情况出了点问题。 阅读 PUT 的合理方法是使用 php://input 并使用 fopenfile_get_contents.

阅读它

发送到 PUT 的数据属于 Content-type: application/json

目前我得到的情况是这样的:

case "PUT":
        parse_str(file_get_contents("php://input"), $putData);
        var_dump($putData);
        if(isset($_GET['id'])){
            putData($_GET['id'], $putData);
        } else {
            print json_encode(["message" => "Missing parameter `id`."]);
            http_response_code(400);
        }
        break;

很棒的是我的 key/value 对 cURL 请求工作得很好。数据已填满,我的 putData() 处理一切都很好。 问题是在这种情况下我需要接受JSON,我该怎么办? 当我 var_dump($putData).

时,我的 REST 客户端抛出一个空数组

只是猜测,但如果您的 REST 客户端接受 JSON 这个请求,它会阻塞 var_dump() 输出一个不是 JSON 的字符串回复。尝试删除 var_dump()

此外,我很确定您必须先调用 http_response_code() 才能将任何输出发送到客户端。

尝试使用 json_decode 而不是 parse_str

case "PUT":
        $rawInput = file_get_contents("php://input");
        $putData = json_decode($rawInput);
        if (is_null($putData)) {
            http_response_code(400);
            print json_encode(["message" => "Couldn't decode submission", "invalid_json_input" => $rawInput]);
        } else {
            if(isset($_GET['id'])){
                putData($_GET['id'], $putData);
            } else {
                http_response_code(400);
                print json_encode(["message" => "Missing parameter `id`."]);
            }
        }
        break;