Handling PUT/DELETE arguments in PHP

前端 未结 6 1234
盖世英雄少女心
盖世英雄少女心 2020-11-30 21:30

I am working on my REST client library for CodeIgniter and I am struggling to work out how to send PUT and DELETE arguments in PHP.

In a few places I have seen peopl

相关标签:
6条回答
  • 2020-11-30 22:08

    This is how i sole my DELETE problem:

    ==>> in REST_Controller.php i replace the delault _parse_delete() function by :

    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);
    }
    

    ;) it works for me!

    0 讨论(0)
  • 2020-11-30 22:14

    Just remember, most webservers do not handle PUT & DELETE requests. Since you're making a library, I'd suggest thinking about accounting for this. Typically, there are two conventions you can use to mimic PUT & DELETE via POST.

    1. use a custom POST variable (ex. _METHOD=PUT) which overrides POST
    2. set a custom HTTP header (ex. X-HTTP-Method-Override: PUT)

    Generally speaking, most RESTful services that don't allow PUT & DELETE directly will support at least one of those strategies. You can use cURL to set a custom header if you need via the CURLOPT_HTTPHEADER option.

    // ex...
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT') );
    
    0 讨论(0)
  • 2020-11-30 22:21

    This is my version of the DELETE for CI. It accepts GET-style arguments for the DELETE, even same name arguments, i.e.: 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;
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-30 22:28

    Instead of using CURLOPT_PUT = TRUE use CURLOPT_CUSTOMREQUEST = 'PUT' and CURLOPT_CUSTOMREQUEST = 'DELETE' then just set values with CURLOPT_POSTFIELDS.

    0 讨论(0)
  • 2020-11-30 22:30

    Here is some code which may be helpful for others wanting to handle PUT and DELETE params. You are able to set $_PUT and $_DELETE via $GLOBALS[], but they will not be directly accessible in functions unless declared global or accessed via $GLOBALS[]. To get around this, I've made a simple class for reading GET/POST/PUT/DELETE request arguments. This also populates $_REQUEST with PUT/DELETE params.

    This class will parse the PUT/DELETE params and support GET/POST as well.

    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;
        }
      }
    }
    
    0 讨论(0)
  • 2020-11-30 22:33

    I think you're mixing your verbs - PUT is for putting a file, POST is for posting variables (although you can POST a file).

    To set the post variables, use CURLOPT_POSTFIELDS with either a string of param1=val1&param2=val2 or an associative array.

    To do a DELETE, you'll want to use the curl option CURLOPT_CUSTOMREQUEST

    0 讨论(0)
提交回复
热议问题