PHP में PUT / DELETE तर्कों को संभालना


84

मैं CodeIgniter के लिए अपने REST क्लाइंट लाइब्रेरी पर काम कर रहा हूं और मैं PHP में PUT और DELETE तर्क भेजने का तरीका जानने के लिए संघर्ष कर रहा हूं।

कुछ स्थानों पर मैंने लोगों को विकल्पों का उपयोग करते हुए देखा है:

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

अनायास, यह कुछ भी नहीं करने के लिए लगता है। क्या PUT पैरामीटर सेट करने का यह सही तरीका है?

यदि हां, तो मैं DELETE पैरामीटर कैसे सेट करूं?

$ यह-> विकल्प () मेरी लाइब्रेरी का हिस्सा है, यह केवल 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;

यहां दो विकल्प हैं, मैं इसे गलत तरीके से देख रहा हूं या मेरे पुस्तकालयों में कहीं एक बग है। यदि आप मुझे बता सकते हैं कि क्या यह सैद्धांतिक रूप से काम करना चाहिए, तो मैं इसे हल करने तक डिबग पर हथौड़ा मार सकता हूं।

मैं एक दृष्टिकोण पर किसी भी अधिक समय बर्बाद नहीं करना चाहता हूं जो मौलिक रूप से गलत है।


PUT ठीक काम कर रहा है, बस सेटिंग के बारे में चिंता करने के लिए सिर्फ DELETE पैरामीटर।
फिल स्टर्जन

1
यह सवाल भ्रामक है। क्या यह भेजने POST / DELETEपैरामीटर, या प्राप्त करने POST / DELETEपैरामीटर के बारे में है?
jameshfisher

जवाबों:


68

इसके बजाय उपयोग का उपयोग CURLOPT_PUT = TRUEकरें CURLOPT_CUSTOMREQUEST = 'PUT' और CURLOPT_CUSTOMREQUEST = 'DELETE'फिर बस मूल्यों के साथ सेट करें CURLOPT_POSTFIELDS


मैं एपीआई / सर्वर साइड पर POSTFIELDS कैसे प्राप्त करूं?
डैनियल

48

यहां कुछ कोड दिए गए हैं जो अन्य लोगों के लिए उपयोगी हो सकते हैं जो PUT और DELETE परम को संभालना चाहते हैं। आप सेट $_PUTऔर के $_DELETEमाध्यम से करने में सक्षम हैं $GLOBALS[], लेकिन वे कार्यों में सीधे सुलभ नहीं होंगे जब तक कि घोषित globalया इसके माध्यम से एक्सेस नहीं किया जाता है $GLOBALS[]। इसके आसपास जाने के लिए, मैंने GET / POST / PUT / DELETE अनुरोध तर्क पढ़ने के लिए एक सरल वर्ग बनाया है। यह $_REQUESTPUT / DELETE परम के साथ भी आबाद है ।

यह वर्ग 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;
    }
  }
}

16

बस याद रखें, अधिकांश वेबसर्वर PUT & DELETE अनुरोधों को संभालते नहीं हैं। चूंकि आप एक पुस्तकालय बना रहे हैं, इसलिए मैं इसके लिए लेखांकन के बारे में सोचने का सुझाव दूंगा। आमतौर पर, दो सम्मेलनों का उपयोग आप POST के माध्यम से PUT & DELETE की नकल करने के लिए कर सकते हैं।

  1. एक कस्टम POST वेरिएबल का उपयोग करें (उदा। _METHOD = PUT) जो POST को ओवरराइड करता है
  2. एक कस्टम HTTP हेडर सेट करें (उदा। X-HTTP-Method-Override: PUT)

सामान्यतया, सबसे अधिक उपयोगी सेवाएँ जो PUT & DELETE को सीधे अनुमति नहीं देती हैं, कम से कम उन रणनीतियों में से एक का समर्थन करेंगी। आप कस्टम हेडर सेट करने के लिए cURL का उपयोग कर सकते हैं यदि आपको CURLOPT_HTTPHEADERविकल्प के माध्यम से ज़रूरत है ।

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

3

मुझे लगता है कि आप अपनी क्रियाओं को मिला रहे हैं - PUT एक फ़ाइल डालने के लिए है, POST चर पोस्ट करने के लिए है (हालाँकि आप किसी फ़ाइल को पोस्ट कर सकते हैं)।

पोस्ट चर सेट करने के लिए, CURLOPT_POSTFIELDSया तो स्ट्रिंग param1=val1&param2=val2या एक सहयोगी सरणी का उपयोग करें।

एक DELETE करने के लिए, आप कर्ल विकल्प का उपयोग करना चाहेंगे CURLOPT_CUSTOMREQUEST


1
PUT और DELETE दोनों अतिरिक्त तर्क भेजने का समर्थन करते हैं। आप कमांड लाइन के माध्यम से कर सकते हैं जब कर्ल के साथ काम करते हैं, लेकिन मैं काम नहीं कर सकता कि PHP-cURL के साथ कैसे भेजूं। उदाहरण के लिए, जैसा कि यह आरईएसटी के लिए है, मुझे जो मैं हटा रहा हूं उसे चिह्नित करने का एक तरीका चाहिए। यदि मैं उपयोगकर्ता आईडी को हटा रहा हूं, तो मैं URL को बंद किए बिना आईडी को पारित करने में सक्षम होना चाहता हूं। एपीआई की तरह ट्विटर केवल GET / POST का समर्थन करता है ताकि आप उसे URL में डाल सकें, लेकिन अन्य REST API इस प्रकार की चीज़ों का समर्थन नहीं कर सकता है, इसलिए मुझे इसके लिए एक डिलीट पैरामीटर भेजने की आवश्यकता है।
फिल स्टर्जन

1
ठीक है, मेरे पास काम करने वाले पैरामीटर हैं, मैंने CURLOPT_PUT = TRUE को CURLOPT_CUSTOMREQUEST = 'PUT' और ठीक काम करने वाले thats के लिए स्वैप किया। अब, मैं नरक को कैसे सेट करूं?
फिल स्टर्जन

CURLOPT_CUSTOMREQUEST = 'DELETE', तो शायद पैरामीटर के लिए क्वेरी स्ट्रिंग का उपयोग करें
Adam Hopkinson

1
बंद करें, मैं क्वेरी स्ट्रिंग में उनका उपयोग करने से बचने की कोशिश कर रहा था जैसा कि मैंने पहले ही उल्लेख किया है। पता चलता है कि आप CURLOPT_POSTFIELDS को PUT और DELETE के साथ CURLOPT_CUSTOMREQUEST = 'DELETE का उपयोग करते समय उपयोग कर सकते हैं। आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन मैंने इसे स्वयं अंत में हल कर दिया :-)
फिल स्टर्जन

2
क्या तुमने किया? मैं तो बिल्कुल भी मदद नहीं की?
एडम होपकिंसन

2

यह CI के लिए DELETE का मेरा संस्करण है। यह DELETE के लिए GET- शैली के तर्क स्वीकार करता है, समान नाम तर्क भी: GET / कुछ / 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;
            }
        }
    }
}

1

यह मेरी एकमात्र समस्या है:

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

;) इससे मेरा काम बनता है!


1
$ _DELETE ;? मुझे बस त्रुटिहीन अपरिभाषित चर मिलता है: _DELETE
Valor_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.