Обработка 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;


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



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

605   6  

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.

  1. используйте пользовательскую переменную POST (например. Http, то=поставить), который переопределяет должности
  2. установите пользовательский заголовок 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&param2=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

    Ничего не найдено.