使用PHP发送/接收PUT请求,无法解析请求体?

时间:2011-07-13 17:31:13

标签: php rest

我正在尝试构建一个RESTful APi。

我发送了一个PUT请求:/ api / customer / 1

$data['name'] = 'test';

$ch = curl_init('myurl/api/'.$name);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$results = json_decode(curl_exec($ch));

我在POSTFIELDS中传递$ data列表,我假设它将在请求正文中。

当我去解析时,我正在尝试:

$params = file_get_contents('php://input');

但是,我没有看到我在任何地方传递的变量。

任何建议都会有所帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

$params = file_get_contents('php://input');的值将是您需要使用的字符串parse_str

$input = file_get_contents('php://input');
parse_str($input, $params);
print_r($params);

另请注意,在某些情况下php://input只能读取一次,因此您可能需要存储它。

答案 1 :(得分:1)

接受的答案不适用于multipart/form-data,出于沮丧,我编写了自己的方法。这可以处理文件上传和多维请求。

/**
 * @param string $formData Raw response request of type FormData
 * @param array $header Meta data for each part of the form data (optional)
 * @return array Processed form data
 */
public function parse_form_data($formData, &$header)
{
    $endOfFirstLine = strpos($formData, "\r\n");
    $boundary = substr($formData, 0, $endOfFirstLine);
    // Split form-data into each entry
    $parts = explode($boundary, $formData);
    $return = [];
    $header = [];
    // Remove first and last (null) entries
    array_shift($parts);
    array_pop($parts);
    foreach ($parts as $part) {
        $endOfHead = strpos($part, "\r\n\r\n");
        $startOfBody = $endOfHead + 4;
        $head = substr($part, 2, $endOfHead - 2);
        $body = substr($part, $startOfBody, -2);
        $headerParts = preg_split('#; |\r\n#', $head);
        $key = null;
        $thisHeader = [];
        // Parse the mini headers,
        // obtain the key
        foreach ($headerParts as $headerPart) {
            if (preg_match('#(.*)(=|: )(.*)#', $headerPart, $keyVal)) {
                if ($keyVal[1] == "name") $key = substr($keyVal[3], 1, -1);
                else {
                    if($keyVal[2] == "="){
                        $thisHeader[$keyVal[1]] = substr($keyVal[3], 1, -1);
                    }else{
                        $thisHeader[$keyVal[1]] = $keyVal[3];
                    }
                }
            }
        }
        // If the key is multidimensional,
        // generate multidimentional array
        // based off of the parts
        $nameParts = preg_split('#(?=\[.*\])#', $key);
        if (count($nameParts) > 1) {
            $current = &$return;
            $currentHeader = &$header;
            $l = count($nameParts);
            for ($i = 0; $i < $l; $i++) {
                // Strip array access tokens
                $namePart = preg_replace('#[\[\]]#', "", $nameParts[$i]);

                // If we are at the end of the depth of this entry,
                // add data to array
                if ($i == $l - 1) {
                    if (isset($thisHeader['filename'])) {
                        $filename = tempnam(sys_get_temp_dir(), "php");
                        file_put_contents($filename, $body);
                        $current[$namePart] = [
                            "name" => $thisHeader['filename'],
                            "type" => $thisHeader['Content-Type'],
                            "tmp_name" => $filename,
                            "error" => 0,
                            "size" => count($body)
                        ];
                    } else {
                        $current[$namePart] = $body;
                    }
                    $currentHeader[$namePart] = $thisHeader;
                } else {
                    // Advance into the array
                    if (!isset($current[$namePart])) {
                        $current[$namePart] = [];
                        $currentHeader[$namePart] = [];
                    }
                    $current = &$current[$namePart];
                    $currentHeader = &$currentHeader[$namePart];
                }
            }
        } else {
            if (isset($thisHeader['filename'])) {
                $filename = tempnam(sys_get_temp_dir(), "php");
                file_put_contents($filename, $body);
                $return[$key] = [
                    "name" => $thisHeader['filename'],
                    "type" => $thisHeader['Content-Type'],
                    "tmp_name" => $filename,
                    "error" => 0,
                    "size" => count($body)
                ];
            } else {
                $return[$key] = $body;
            }
            $return[$key] = $body;
            $header[$key] = $thisHeader;
        }

    }
    return $return;
}