Taşıma PUT / PHP argümanlar DELETE

3 Cevap php

Benim REST client library for CodeIgniter üzerinde çalışıyorum ve ben PUT göndermek ve PHP argümanları SİL nasıl çalışmak için mücadele ediyorum.

Birkaç yerde ben seçeneklerini kullanarak insanları gördük:

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

Annoyingly, bu hiçbir şey yapmak gibi görünüyor. Bu PUT parametrelerini ayarlamak için doğru yolu nedir?

Eğer öyleyse, nasıl parametreleri SİL ayarlarım?

* $ This-> seçenek () Benim kitaplığın parçası olan, sadece CURLOPT_XX sabitleri bir dizi kurar ve inşa cURL isteği yürütüldüğünde) (curl_setopt_array gönderir. *

Ben PUT ve aşağıdaki kodu kullanarak parametreleri SİL okumaya çalışıyorum:

        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;

Orada iki seçenek, burada ben yanlış bir şekilde bu yaklaşıyorum ya da bir yerde benim kütüphanelerde bir hata var. Bu teorik olarak çalışması gerekir varsa bana bildirin eğer ben bunu çözmek kadar ben sadece debug uzakta çekiç olabilir.

Ben temelde yanlış bir yaklaşım üzerinde daha fazla zaman harcamak istemiyorum.

3 Cevap

İşte PUT ve DELETE params'ı işlemek isteyen başkaları için faydalı olabilecek bazı kodudur. Sen $GLOBALS[] aracılığı $_PUT ve $_DELETE ayarlamak mümkün, ama global ilan veya erişilen sürece onlar fonksiyonları doğrudan erişilebilir olmayacak $GLOBALS[]. Bu almak için, ben okuma GET / POST / PUT / istek argümanlar DELETE için basit bir sınıf yaptık. Bu da PUT / DELETE params ile $_REQUEST doldurur.

Bu sınıf aynı zamanda params'ı ve destek GET / POST SİL / PUT ayrıştırmak olacaktır.

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

Sadece en websunucu KOYMAK işlemek ve unutmayın, DELETE istekleri. Eğer bir kütüphane yapıyoruz beri, ben bu muhasebe düşünmeye öneririm. Tipik olarak, orada koymak taklit kullanabileceğiniz iki sözleşmeler & POST üzerinden SİL.

  1. POST geçersiz kılan (örn. _method = PUT) özel bir POST değişken kullanmak
  2. özel bir HTTP başlığı ayarlamak (örneğin X-HTTP-Yöntem-geçersiz kılma: PUT)

Izin vermez genellikle konuşan, en dinlendirici hizmetleri PUT & DELETE doğrudan Bu stratejilerin en az bir destek olacaktır. Eğer CURLOPT_HTTPHEADER seçeneği ile ihtiyacınız varsa özel bir başlığı ayarlamak için cURL kullanabilirsiniz.

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

Ben size fiiller karıştırma düşünüyorum - PUT bir dosya koymak için, POST değişkenlerini gönderme için, (Eğer bir dosyayı POST rağmen).

, Sonrası değişkenleri set CURLOPT_POSTFIELDS param1=val1&param2=val2 bir dize ya da bir ilişkisel dizi ile ya kullanın.

DELETE yapmak için, kıvrılma seçeneği kullanmak isteyeceksiniz CURLOPT_CUSTOMREQUEST