繁体   English   中英

使用 PHP 发送/接收 PUT 请求,解析请求正文时遇到问题?

[英]Sending/Receiving PUT requests with PHP, having trouble parsing the request body?

我正在尝试构建一个 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 列表,我假设它将在请求正文中。

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

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

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

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

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

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

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

接受的答案不适用于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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM