代码之家  ›  专栏  ›  技术社区  ›  Phil Sturgeon

在PHP中处理PUT/DELETE参数

  •  83
  • Phil Sturgeon  · 技术社区  · 15 年前

    REST client library for CodeIgniter 我正在努力解决如何在PHP中发送PUT和DELETE参数。

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

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

    $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;
    

    这里有两种选择,我以错误的方式处理这个问题,或者我的库中有一个bug。如果你能让我知道这在理论上是否可行,我可以继续调试直到我解决它。

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

    6 回复  |  直到 13 年前
        1
  •  68
  •   Bhavik Ambani    12 年前

    而不是使用 CURLOPT_PUT = TRUE 使用 CURLOPT_CUSTOMREQUEST = 'PUT' CURLOPT_CUSTOMREQUEST = 'DELETE' 然后用 CURLOPT_POSTFIELDS .

        2
  •  49
  •   Bryan Drewery    14 年前

    下面是一些代码,对于希望处理PUT和DELETE参数的其他人可能会有所帮助。您可以设置 $_PUT $_DELETE 通过 $GLOBALS[] global 或通过 $GLOBALS[] . 为了解决这个问题,我创建了一个简单的类来阅读get/POST/PUT/DELETE请求参数。这也很普遍 $_REQUEST 使用PUT/DELETE参数。

    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;
        }
      }
    }
    
        3
  •  16
  •   Owen Ryan Doherty    15 年前

    请记住,大多数Web服务器不处理PUT&删除请求。既然你在建一个图书馆,我建议你考虑一下这个问题。通常,您可以使用两种约定来模拟PUT&通过邮寄删除。

    1. 使用覆盖POST的自定义POST变量(ex.\u METHOD=PUT)
    2. 设置自定义HTTP头(例如X-HTTP-Method-Override:PUT)

    一般来说,大多数不允许PUT&的RESTful服务;直接删除将至少支持其中一种策略。如果需要,可以使用cURL通过 CURLOPT_HTTPHEADER 选项

    // ex...
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT') );
    
        4
  •  3
  •   Adam Hopkinson    15 年前

    我认为你把动词混用了——PUT是用来放文件的,POST是用来放变量的(尽管你可以放文件)。

    要设置post变量,请使用 CURLOPT_POSTFIELDS 用一串 param1=val1&param2=val2

    要执行删除操作,您需要使用curl选项 CURLOPT_CUSTOMREQUEST

        5
  •  2
  •   Patrick Savalle    10 年前

    这是我的CI删除版本。它接受DELETE的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;
                }
            }
        }
    }
    
        6
  •  1
  •   okobsamoht    10 年前

    REST\u Controller.php 我更换了德洛特 _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);
    }
    

    ;) 这对我有用!