处理 PHP 中的 PUT/DELETE 参数

2022-08-30 08:09:08

我正在为CodeIgniter开发我的REST客户端库,我正在努力研究如何在PHP中发送PUT和DELETE参数。

在一些地方,我看到人们使用这些选项:

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

令人讨厌的是,这似乎无济于事。这是设置 PUT 参数的正确方法吗?

如果是这样,如何设置 DELETE 参数?

$this->option() 是我的库的一部分,它只是构建一个CURLOPT_XX常量数组,并在执行构建的 cURL 请求时将它们发送到 curl_setopt_array()。

我正在尝试使用以下代码读取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;

这里有两个选项,我以错误的方式接近它,或者我的库中的某个地方有一个错误。如果你能让我知道这在理论上是否应该工作,我可以直接调试,直到我解决它。

我不想再浪费时间在一种根本上错误的方法上。


答案 1

而不是使用 use,然后只用 设置值。CURLOPT_PUT = TRUECURLOPT_CUSTOMREQUEST = 'PUT'CURLOPT_CUSTOMREQUEST = 'DELETE'CURLOPT_POSTFIELDS


答案 2

这里有一些代码,对于其他想要处理PUT和DELETE参数的人来说可能会有所帮助。您可以设置 和 via ,但除非通过 声明或访问,否则无法在函数中直接访问它们。为了解决这个问题,我做了一个简单的类来阅读GET/POST/PUT/DELETE请求参数。这还会填充 PUT/DELETE 参数。$_PUT$_DELETE$GLOBALS[]global$GLOBALS[]$_REQUEST

此类将解析 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;
    }
  }
}

推荐