Отправка / получение PUT-запросов с PHP, возникли проблемы с анализом тела запроса? - PullRequest
6 голосов
/ 13 июля 2011

Я пытаюсь создать 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, который, как я предполагаю, будет в теле запроса.

Когда я иду на анализ, я пытаюсь:

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

Однако, я не вижу переменную Iпрошел в любом месте.

Любой совет будет полезен, спасибо.

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Значение $params = file_get_contents('php://input'); будет строкой, которую необходимо использовать parse_str :

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

Также обратите внимание, что в некоторых случаях php://input может толькопрочитайте один раз, так что вам, возможно, придется его сохранить.

1 голос
/ 28 июля 2016

Принятый ответ не будет работать для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...