Обработка PUT / DELETE аргументов в PHP
Я работаю над моей клиентская библиотека REST для CodeIgniter и я изо всех сил пытаюсь понять, как отправлять аргументы PUT и DELETE в PHP.
в нескольких местах я видел людей, используя параметры:
$this->option(CURLOPT_PUT, TRUE);
$this->option(CURLOPT_POSTFIELDS, $params);
досадно, это, кажется, ничего не делать. Это правильный путь, чтобы задать параметры ставить?
Если да, то как установить параметры удаления?
$this->option() является частью моей библиотеки, он просто создает массив Константы CURLOPT_XX и отправляет их в curl_setopt_array () при выполнении запроса built up cURL.
Я пытаюсь прочитать PUT и удалить параметры, используя следующий код:
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;
здесь есть два варианта, я подхожу к этому неправильно или где-то в моих библиотеках есть ошибка. Если бы вы могли дать мне знать, если это должно теоретически работать, я могу просто забить на отладку, пока не решу ее.
Я не хочу тратить больше времени на подход, который в корне неверен.
6 ответов:
вместо
CURLOPT_PUT = TRUEиспользоватьCURLOPT_CUSTOMREQUEST = 'PUT'иCURLOPT_CUSTOMREQUEST = 'DELETE'тогда просто установите значения сCURLOPT_POSTFIELDS.
вот некоторый код, который может быть полезен для других желающих обрабатывать PUT и DELETE params. Вы можете установить
$_PUTи$_DELETEчерез$GLOBALS[], но они не будут непосредственно доступны в функциях, если не объявленоglobalили через$GLOBALS[]. Чтобы обойти это, я сделал простой класс для чтения аргументов запроса GET/POST/PUT/DELETE. Это также заселяет$_REQUESTС PUT / DELETE params.этот класс будет анализировать параметры 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.
- используйте пользовательскую переменную POST (например. Http, то=поставить), который переопределяет должности
- установите пользовательский заголовок HTTP (например. X-HTTP-метод-переопределение: PUT)
вообще говоря, большинство RESTful услуг, которые не позволяют поставить & Удаление напрямую будет поддерживать по крайней мере одну из этих стратегий. Вы можете использовать cURL для установки пользовательского заголовка, если вам нужно через .
// ex... curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT') );
Я думаю, что вы смешиваете свои глаголы-PUT для размещения файла, POST для размещения переменных (хотя вы можете разместить файл).
чтобы установить переменные post, используйте
CURLOPT_POSTFIELDSс строкуparam1=val1¶m2=val2или ассоциативный массив.чтобы сделать удаление, вы хотите использовать опцию curl
CURLOPT_CUSTOMREQUEST
вот как я единственный мой удалить проблему:
==>> в REST_Controller.php я заменяю delault _parse_delete ()
Это моя версия удаления для CI. Он принимает аргументы GET-стиля для удаления, даже те же аргументы имени, Т. е.: 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; } } } }
Comments