[英]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.