Обработка аргументов PUT / DELETE в PHP

Я работаю над своей клиентской библиотекой REST для CodeIgniter, и я изо всех сил пытаюсь разобраться, как отправлять аргументы PUT и DELETE в PHP.

В нескольких местах я видел людей, которые использовали варианты:

$this->option(CURLOPT_PUT, TRUE); $this->option(CURLOPT_POSTFIELDS, $params); 

Раздражающе, похоже, это ничего не делает. Правильно ли это установить параметры PUT?

Если да, как установить параметры DELETE?

$ this-> option () является частью моей библиотеки, он просто создает массив констант CURLOPT_XX и отправляет их curl_setopt_array (), когда выполняется созданный запрос cURL.

Я пытаюсь прочитать параметры PUT и DELETE, используя следующий код:

  case 'put': // Set up out PUT variables parse_str(file_get_contents('php://input'), $this->_put_args); break; case 'delete': // Set up out PUT variables parse_str(file_get_contents('php://input'), $this->_delete_args); break; 

Здесь есть два варианта: я приближаюсь к этому неправильно, или есть ошибка где-то в моих библиотеках. Если бы вы могли сообщить мне, если это теоретически будет работать, я могу просто отработать отладку до тех пор, пока я ее не разрешу.

Я больше не хочу тратить время на подход, который в корне неверен.

Related of "Обработка аргументов PUT / DELETE в PHP"

Вместо использования CURLOPT_PUT = TRUE используйте CURLOPT_CUSTOMREQUEST = 'PUT' и CURLOPT_CUSTOMREQUEST = 'DELETE' затем просто устанавливайте значения с помощью CURLOPT_POSTFIELDS .

Вот код, который может быть полезен для других, которые хотят обрабатывать параметры PUT и DELETE. Вы можете установить $_PUT и $_DELETE через $GLOBALS[] , но они не будут доступны напрямую в функциях, если не объявлены global или не будут доступны через $GLOBALS[] . Чтобы обойти это, я сделал простой класс для чтения аргументов запроса GET / POST / PUT / DELETE. Это также заполняет $_REQUEST PUT / DELETE.

Этот класс будет анализировать параметры PUT / DELETE и поддерживать GET / POST.

 class Params { private $params = Array(); public function __construct() { $this->_parseParams(); } /** * @brief Lookup request params * @param string $name Name of the argument to lookup * @param mixed $default Default value to return if argument is missing * @returns The value from the GET/POST/PUT/DELETE value, or $default if not set */ public function get($name, $default = null) { if (isset($this->params[$name])) { return $this->params[$name]; } else { return $default; } } private function _parseParams() { $method = $_SERVER['REQUEST_METHOD']; if ($method == "PUT" || $method == "DELETE") { parse_str(file_get_contents('php://input'), $this->params); $GLOBALS["_{$method}"] = $this->params; // Add these request vars into _REQUEST, mimicing default behavior, PUT/DELETE will override existing COOKIE/GET vars $_REQUEST = $this->params + $_REQUEST; } else if ($method == "GET") { $this->params = $_GET; } else if ($method == "POST") { $this->params = $_POST; } } } 

Просто помните, что большинство веб-серверов не обрабатывают запросы PUT & DELETE. Поскольку вы создаете библиотеку, я бы предложил подумать об учете этого. Как правило, существуют два соглашения, которые вы можете использовать для имитации PUT & DELETE через POST.

  1. используйте пользовательскую переменную POST (например, _METHOD = PUT), которая переопределяет POST
  2. установить собственный HTTP-заголовок (например, X-HTTP-Method-Override: PUT)

Вообще говоря, большинство служб RESTful, которые не позволяют PUT и DELETE напрямую поддерживать хотя бы одну из этих стратегий. Вы можете использовать cURL для установки настраиваемого заголовка, если вам нужен параметр CURLOPT_HTTPHEADER .

 // ex... curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT') ); 

Я думаю, что вы смешиваете свои глаголы – PUT предназначен для размещения файла, POST – для публикации переменных (хотя вы можете POST-файл).

Чтобы установить пост-переменные, используйте CURLOPT_POSTFIELDS либо с помощью строки param1=val1&param2=val2 либо с помощью ассоциативного массива.

Чтобы выполнить DELETE, вы хотите использовать параметр curl CURLOPT_CUSTOMREQUEST

Вот как я единственный мой вопрос DELETE:

== >> в REST_Controller.php я заменяю функцию debause _parse_delete () :

 protected function _parse_delete() { $this->_delete_args = $_DELETE; $this->request->format and $this->request->body = file_get_contents('php://input'); // Set up out DELETE variables (which shouldn't really exist, but sssh!) parse_str(file_get_contents('php://input'), $this->_delete_args); } 

😉 меня устраивает!

Это моя версия DELETE для CI. Он принимает аргументы GET-стиля для DELETE, даже те же аргументы имени, то есть: GET / some / url? Id = 1 & id = 2 & id = 3

 protected function _parse_delete() { $query = $_SERVER['QUERY_STRING']; if ( !empty( $query ) ) { foreach( explode('&', $query ) as $param ) { list($k, $v) = explode('=', $param); $k = urldecode($k); $v = urldecode($v); if ( isset( $this->_delete_args[$k] ) ) { if ( is_scalar( $this->_delete_args[$k] ) ) { $this->_delete_args[$k] = array( $this->_delete_args[$k] ); } $this->_delete_args[$k][] = $v ; } else { $this->_delete_args[$k] = $v; } } } }