получить запрос PUT с Codeigniter - PullRequest
8 голосов
/ 04 апреля 2011

У меня сейчас проблема с CodeIgniter: я использую библиотеку REST Controller (что действительно здорово) для создания 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.Есть идеи, пожалуйста?

Спасибо!

Ответы [ 4 ]

10 голосов
/ 25 июня 2012

Согласно: 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");
}
3 голосов
/ 04 февраля 2015

Вы можете сначала попытаться определить тип метода и отделить разные случаи. Если ваш контроллер обрабатывает только функции 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.";
}
1 голос
/ 06 ноября 2015

посмотрите эту проблему в github

Параметры PUT работают только в формате JSON

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

0 голосов
/ 04 апреля 2011

CodeIgniter не поддерживает чтение входящих запросов PUT, и если это не является необходимым, я бы использовал GET / POST для вашего API, поскольку, вероятно, в этом нет необходимости.

Если вам нужно прочитать запросы PUT, взгляните на Доступ к входящим данным PUT из PHP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...