2010-01-17 60 views
77

Tôi đang làm việc trên REST client library for CodeIgniter và tôi đang cố gắng tìm ra cách gửi các đối số PUT và DELETE trong PHP.Xử lý các đối số PUT/DELETE trong PHP

Trong một vài nơi tôi đã thấy những người sử dụng các tùy chọn:

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

Khó chịu, điều này dường như không làm gì cả. Đây có phải là cách đúng để đặt thông số PUT không?

Nếu có, làm cách nào để đặt thông số DELETE?

$ this-> option() là một phần của thư viện của tôi, nó đơn giản xây dựng một mảng các hằng số CURLOPT_XX và gửi chúng tới curl_setopt_array() khi yêu cầu cURL được xây dựng được thực hiện.

Tôi đang cố gắng để đọc PUT và DELETE thông số sử dụng đoạn mã sau:

 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; 

Có hai lựa chọn ở đây, tôi đang tiếp cận này trong một cách sai lầm hoặc có một lỗi ở đâu đó trong các thư viện của tôi. Nếu bạn có thể cho tôi biết nếu điều này lý thuyết nên làm việc tôi chỉ có thể búa đi gỡ lỗi cho đến khi tôi giải quyết nó.

Tôi không muốn lãng phí thêm thời gian vào phương pháp tiếp cận cơ bản là sai.

+0

PUT đang làm việc tốt, chỉ cần DELETE tham số để lo lắng về cài đặt ngay bây giờ. –

+1

Câu hỏi này khó hiểu. Có phải về * gửi các tham số 'POST' /' DELETE', hoặc * nhận * 'POST' /' DELETE'? – jameshfisher

Trả lời

66

Thay vì sử dụng CURLOPT_PUT = TRUE sử dụng CURLOPT_CUSTOMREQUEST = 'PUT'CURLOPT_CUSTOMREQUEST = 'DELETE' sau đó chỉ cần thiết lập giá trị với CURLOPT_POSTFIELDS.

3

Tôi nghĩ bạn đang trộn động từ của mình - PUT là để đặt một tệp, POST là để đăng biến (mặc dù bạn có thể POST một tệp).

Để đặt các biến bài đăng, hãy sử dụng CURLOPT_POSTFIELDS với một chuỗi là param1=val1&param2=val2 hoặc một mảng liên kết.

Để làm một DELETE, bạn sẽ muốn sử dụng tùy chọn curl CURLOPT_CUSTOMREQUEST

+1

PUT và DELETE đều hỗ trợ gửi các đối số bổ sung. Bạn có thể làm điều này thông qua dòng lệnh khi làm việc với curl nhưng tôi không thể tìm ra cách gửi bằng PHP-cURL. Ví dụ, vì đây là dành cho REST, tôi cần một cách để đánh dấu những gì tôi đang xóa. Nếu tôi xóa id người dùng, tôi muốn có thể chuyển id mà không làm lộn xộn URL. API giống như Twitter chỉ hỗ trợ GET/POST để bạn có thể đặt URL đó vào trong URL, nhưng các API REST khác có thể không hỗ trợ loại điều này, vì vậy tôi cần gửi tham số xóa cho nó. –

+1

Ok Tôi có tham số PUT đang hoạt động, tôi đã đổi chỗ CURLOPT_PUT = TRUE cho CURLOPT_CUSTOMREQUEST = 'PUT' và điều đó hoạt động tốt. Bây giờ, làm thế nào địa ngục để tôi đặt DELETE? –

+0

CURLOPT_CUSTOMREQUEST = 'DELETE', sau đó sử dụng chuỗi truy vấn cho các tham số có thể –

16

Hãy nhớ rằng hầu hết các máy chủ web không xử lý các yêu cầu DELETE PUT & DELETE. Kể từ khi bạn đang làm một thư viện, tôi muốn đề nghị suy nghĩ về kế toán cho việc này. Thông thường, có hai quy ước bạn có thể sử dụng để bắt chước PUT & DELETE qua POST.

  1. sử dụng một biến tùy chỉnh POST mà đè POST
  2. thiết lập một tiêu đề HTTP tùy chỉnh (ví dụ X-HTTP-Phương-Override: PUT.) (Ví dụ _METHOD = PUT.)

Nói chung , hầu hết các dịch vụ RESTful không cho phép PUT & DELETE trực tiếp sẽ hỗ trợ ít nhất một trong các chiến lược đó. Bạn có thể sử dụng cURL để đặt tiêu đề tùy chỉnh nếu bạn cần thông qua tùy chọn CURLOPT_HTTPHEADER.

// ex... 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-HTTP-Method-Override: PUT')); 
+1

Tuyệt vời addidtion, cảm ơn Owen. –

+1

Bạn đã cứu người đàn ông của tôi ngày. Cảm ơn bạn! –

47

Dưới đây là một số mã có thể hữu ích cho những người khác muốn xử lý thông số PUT và DELETE. Bạn có thể đặt $_PUT$_DELETE qua $GLOBALS[], nhưng chúng sẽ không thể truy cập trực tiếp vào các chức năng trừ khi được khai báo global hoặc truy cập qua $GLOBALS[]. Để giải quyết vấn đề này, tôi đã tạo một lớp đơn giản để đọc các đối số yêu cầu GET/POST/PUT/DELETE.Điều này cũng phổ biến $_REQUEST với thông số PUT/DELETE.

Lớp này sẽ phân tích cú pháp tham số PUT/DELETE và hỗ trợ 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; 
    } 
    } 
} 
+0

Điều này có hiệu quả đối với tôi. Cảm ơn Bryan. – evanmcd

+0

Siêu mát mẻ ... thnx :) –

1

Đây là cách duy nhất tôi có vấn đề DELETE tôi:

== >> trong REST_Controller.php i thay thế delault _parse_delete() chức năng theo:

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

;) nó hoạt động cho tôi!

+1

$ _DELETE ;? Tôi chỉ nhận được lỗi không xác định biến: _DELETE –

0

Đây là phiên bản DELETE dành cho CI của tôi. Nó chấp nhận GET kiểu lập luận ủng hộ, thậm chí tranh luận cùng tên DELETE, tức là: 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; 
      } 
     } 
    } 
} 
Các vấn đề liên quan