通过Codeigniter获取PUT请求

时间:2011-04-04 15:30:37

标签: php codeigniter rest

我现在遇到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。 你有什么想法吗?

谢谢!

7 个答案:

答案 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)

在github中查看此问题

  

PUT参数仅以JSON格式工作

https://github.com/chriskacerguis/codeigniter-restserver/issues/362

答案 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