我现在遇到CodeIgniter的问题:我使用REST Controller library(这真的很棒)来创建API,但我无法获得PUT请求......
这是我的代码:
function user_put() {
$user_id = $this->get("id");
echo $user_id;
$username = $this->put("username");
echo $username;
}
我使用curl发出请求:
curl -i -X PUT -d "username=test" http://[...]/user/id/1
user_id已满,但username变量为空。然而它适用于动词POST和GET。 你有什么想法吗?
谢谢!
答案 0 :(得分:10)
根据:http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/我们应该咨询https://github.com/philsturgeon/codeigniter-restserver/blob/master/application/libraries/REST_Controller.php#L544以查看此方法:
/**
* Detect method
*
* Detect which method (POST, PUT, GET, DELETE) is being used
*
* @return string
*/
protected function _detect_method() {
$method = strtolower($this->input->server('REQUEST_METHOD'));
if ($this->config->item('enable_emulate_request')) {
if ($this->input->post('_method')) {
$method = strtolower($this->input->post('_method'));
} else if ($this->input->server('HTTP_X_HTTP_METHOD_OVERRIDE')) {
$method = strtolower($this->input->server('HTTP_X_HTTP_METHOD_OVERRIDE'));
}
}
if (in_array($method, array('get', 'delete', 'post', 'put'))) {
return $method;
}
return 'get';
}
查看我们是否定义了HTTP标头HTTP_X_HTTP_METHOD_OVERRIDE
,并使用它来支持我们在网络上实现的实际动词。要在请求中使用此选项,您可以指定标头X-HTTP-Method-Override: method
(所以X-HTTP-Method-Override: put
)以生成自定义方法覆盖。有时框架需要X-HTTP-Method
而不是X-HTTP-Method-Override
,所以这会因框架而异。
如果你是通过jQuery做这样的请求,你可以将这个块集成到你的ajax请求中:
beforeSend: function (XMLHttpRequest) {
//Specify the HTTP method DELETE to perform a delete operation.
XMLHttpRequest.setRequestHeader("X-HTTP-Method-Override", "DELETE");
}
答案 1 :(得分:3)
您可以先尝试检测方法类型,然后分开不同的情况。如果您的控制器只处理REST函数,那么在构造函数中获取所需的信息会很有帮助。
switch($_SERVER['REQUEST_METHOD']){
case 'GET':
$var_array=$this->input->get();
...
break;
case 'POST':
$var_array=$this->input->post();
...
break;
case 'PUT':
case 'DELETE':
parse_str(file_get_contents("php://input"),$var_array);
...
break;
default:
echo "I don't know how to handle this request.";
}
答案 2 :(得分:1)
答案 3 :(得分:1)
在CodeIgniter 4中,使用getRawInput将检索数据并将其转换为数组。
$data = $request->getRawInput();
答案 4 :(得分:0)
在官方Code Igniter文档Using the Input Stream for Custom Request Methods
中检出此链接这是使用代码点火器的方法。
如果请求的主体采用表单编码,则只需调用以下内容
$var1 = $this->input->input_stream('var_key')
// Or
$var1 = $this->security->xss_clean($this->input->input_stream('var_key'));
答案 5 :(得分:0)
Codeigniter put_stream没有提供帮助,相反,我不得不使用php输入流,因为可以将以下方法添加到帮助器中,从那里您可以在任何控制器中解析put请求:
function parsePutRequest()
{
// Fetch content and determine boundary
$raw_data = file_get_contents('php://input');
$boundary = substr($raw_data, 0, strpos($raw_data, "\r\n"));
// Fetch each part
$parts = array_slice(explode($boundary, $raw_data), 1);
$data = array();
foreach ($parts as $part) {
// If this is the last part, break
if ($part == "--\r\n") break;
// Separate content from headers
$part = ltrim($part, "\r\n");
list($raw_headers, $body) = explode("\r\n\r\n", $part, 2);
// Parse the headers list
$raw_headers = explode("\r\n", $raw_headers);
$headers = array();
foreach ($raw_headers as $header) {
list($name, $value) = explode(':', $header);
$headers[strtolower($name)] = ltrim($value, ' ');
}
// Parse the Content-Disposition to get the field name, etc.
if (isset($headers['content-disposition'])) {
$filename = null;
preg_match(
'/^(.+); *name="([^"]+)"(; *filename="([^"]+)")?/',
$headers['content-disposition'],
$matches
);
list(, $type, $name) = $matches;
isset($matches[4]) and $filename = $matches[4];
// handle your fields here
switch ($name) {
// this is a file upload
case 'userfile':
file_put_contents($filename, $body);
break;
// default for all other files is to populate $data
default:
$data[$name] = substr($body, 0, strlen($body) - 2);
break;
}
}
}
return $data;
}
答案 6 :(得分:-1)
CodeIgniter不支持读取传入的PUT请求,如果它不是必需的话,我会坚持使用GET / POST作为你的API,因为它可能没有必要。
如果您确实需要阅读PUT请求,请查看Accessing Incoming PUT Data from PHP。