পিএইচপি-তে PUT / মোছার যুক্তিগুলি পরিচালনা করছে


84

আমি কোডইগিনিটারের জন্য আমার আরএসটি ক্লায়েন্ট লাইব্রেরিতে কাজ করছি এবং পিএইচপি-তে কীভাবে পুট এবং ডিলেট আর্গুমেন্ট পাঠাতে হয় তা নিয়ে কাজ করার জন্য সংগ্রাম করছি।

কয়েকটি জায়গায় আমি লোকদের বিকল্পগুলি ব্যবহার করতে দেখেছি:

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

বিরক্তিকরভাবে, মনে হচ্ছে এটি কিছুই করছে না। এটি কি PUT পরামিতি সেট করার সঠিক উপায়?

যদি তা হয় তবে আমি পরামিতিগুলি কীভাবে সরিয়ে দেব?

$ এই-> বিকল্পটি () আমার লাইব্রেরির অংশ, এটি কেবলমাত্র CURLOPT_XX ধ্রুবকের একটি অ্যারে তৈরি করে এবং যখন বিল্ট আপ সিআরএল অনুরোধটি কার্যকর করা হয় তখন তাদের curl_setopt_array () এ প্রেরণ করে।

আমি নিম্নলিখিত কোডটি ব্যবহার করে PUT এবং পরামিতিগুলি পড়ার চেষ্টা করছি:

        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;

এখানে দুটি বিকল্প রয়েছে, আমি এটি ভুল উপায়ে পৌঁছে যাচ্ছি বা আমার লাইব্রেরিতে কোথাও একটি বাগ রয়েছে। এটি যদি তাত্ত্বিকভাবে কাজ করা উচিত তবে আপনি যদি আমাকে জানাতে পারতেন তবে আমি এটি সমাধান না করা অবধি কেবল ডিবাগের উপর হাতুড়ি ফেলতে পারি।

মূলত ভুল যে পদ্ধতির জন্য আমি আর কোনও সময় নষ্ট করতে চাই না।


পুট ঠিকঠাক কাজ করছে, এখন সেট করার বিষয়ে চিন্তা করার জন্য পরামিতিগুলি মুছুন।
ফিল স্টারজন

4
এই প্রশ্নটি বিভ্রান্তিকর। এটি কি পাঠানো POST / DELETEপরামিতিগুলি, বা প্রাপ্ত POST / DELETEপরামিতিগুলি সম্পর্কে?
জামেশফিশার

উত্তর:


68

পরিবর্তে CURLOPT_PUT = TRUEব্যবহার CURLOPT_CUSTOMREQUEST = 'PUT' এবং CURLOPT_CUSTOMREQUEST = 'DELETE'তারপরে মানগুলি সেট করে CURLOPT_POSTFIELDS


আমি এপিআই / সার্ভারের পাশে POSTFIELDS কীভাবে পাব?
ড্যানিয়েল

48

এখানে কিছু কোড দেওয়া হয়েছে যা পুট এবং ডিলেট প্যারামগুলি পরিচালনা করতে ইচ্ছুক অন্যদের পক্ষে সহায়ক হতে পারে। আপনি সেট করতে $_PUTএবং এর $_DELETEমাধ্যমে সক্ষম $GLOBALS[]হয়ে উঠছেন তবে এর globalমাধ্যমে ঘোষিত বা অ্যাক্সেস না করা হলে এগুলি ফাংশনে সরাসরি অ্যাক্সেসযোগ্য হবে না $GLOBALS[]। এটি পেতে, আমি জিইটি / পোস্ট / পুট / ডিলেট অনুরোধ যুক্তিগুলি পড়ার জন্য একটি সাধারণ ক্লাস করেছি। এটি $_REQUESTপুট / ডিলিট প্যারামগুলির সাথেও পপুলেটে।

এই শ্রেণিটি পুট / ডিলিট প্যারামগুলি বিশ্লেষণ করবে এবং জিইটি / পোস্টকেও সমর্থন করবে।

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

কেবল মনে রাখবেন, বেশিরভাগ ওয়েবসার্সগুলি পুট এবং ডিলিট অনুরোধগুলি পরিচালনা করেন না। যেহেতু আপনি একটি গ্রন্থাগার তৈরি করছেন, আমি এটির জন্য অ্যাকাউন্টিং সম্পর্কে চিন্তা করার পরামর্শ দেব। সাধারণত, দুটি সম্মেলন রয়েছে যা আপনি পোষ্টের মাধ্যমে পুট এবং মুছে ফেলার জন্য ব্যবহার করতে পারেন।

  1. কাস্টম পোষ্ট ভেরিয়েবল ব্যবহার করুন (উদাঃ _METHOD = PUT) যা পোষ্টকে ওভাররাইড করে
  2. একটি কাস্টম HTTP শিরোনাম সেট করুন (উদাঃ এক্স-এইচটিটিপি-পদ্ধতি-ওভাররাইড: PUT)

সাধারণভাবে বলতে গেলে, বেশিরভাগ রেস্টস্টুল সার্ভিসগুলি যা পুট এবং ডিলিটকে সরাসরি অনুমতি দেয় না সেগুলি অন্তত সেই কৌশলগুলির মধ্যে একটিকে সমর্থন করবে। আপনি যদি CURLOPT_HTTPHEADERবিকল্পটির মাধ্যমে প্রয়োজন হয় তবে কাস্টম শিরোনাম সেট করতে আপনি URL ব্যবহার করতে পারেন ।

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

3

আমি মনে করি আপনি আপনার ক্রিয়াগুলি মিশ্রণ করছেন - PUT একটি ফাইল রাখার জন্য, POST ভেরিয়েবলগুলি পোস্ট করার জন্য (যদিও আপনি কোনও ফাইল পোস্ট করতে পারেন)।

পোস্ট ভেরিয়েবলগুলি সেট করতে, CURLOPT_POSTFIELDSস্ট্রিং param1=val1&param2=val2বা কোনও এসোসিয়েটিভ অ্যারে ব্যবহার করুন।

একটি মুছে ফেলতে, আপনি কার্ল বিকল্পটি ব্যবহার করতে চাইবেন CURLOPT_CUSTOMREQUEST


4
পুট এবং ডিলিট উভয়ই অতিরিক্ত যুক্তি প্রেরণকে সমর্থন করে। কার্লের সাথে কাজ করার সময় আপনি কমান্ড লাইনের মাধ্যমে এটি করতে পারেন তবে পিএইচপি-সিআরএল দিয়ে কীভাবে প্রেরণ করব তা আমি কাজ করতে পারি না। উদাহরণস্বরূপ, এটি বিশ্রামের জন্য যেমন, আমি কী মুছে দিচ্ছি তা চিহ্নিত করার জন্য আমার একটি উপায় প্রয়োজন। যদি আমি ব্যবহারকারীর আইডি মুছে ফেলতে চাই তবে আমি ইউআরএলটি বিশৃঙ্খলা না করে আইডিটি পাস করতে সক্ষম হতে চাই। টুইটারের মত এপিআই-র কেবল জিইটি / পোস্টকে সমর্থন করে যাতে আপনি এটি ইউআরএলটিতে রাখতে পারেন তবে অন্যান্য REST এপিআই এই ধরণের জিনিসটিকে সমর্থন করতে পারে না, সুতরাং এর জন্য আমাকে একটি মুছার পরামিতি প্রেরণ করতে হবে।
ফিল স্টারজেন

4
ঠিক আছে আমার PUT প্যারামিটারগুলি কাজ করছে, আমি CURLOPT_CUSTOMREQUEST = 'পুট' এর জন্য CURLOPT_PUT = TRUE অদলবদল করেছিলাম এবং ঠিকঠাক কাজ করতে পারি। এখন, আমি কীভাবে মুছে ফেলব?
ফিল স্টারজন

CURLOPT_CUSTOMREQUEST = 'মুছে ফেলুন', তারপরে প্যারামিটারগুলির জন্য কোয়েরি স্ট্রিং ব্যবহার করুন
অ্যাডাম হপকিনসন

4
বন্ধ, আমি ইতিমধ্যে উল্লিখিত হিসাবে আমি কোয়েরি স্ট্রিং এ তাদের ব্যবহার এড়াতে চেষ্টা করেছি। দেখা যাচ্ছে আপনি CURLOPT_CUSTOMREQUEST = 'মুছে ফেলার সাথে PUT এবং DELETE সহ CURLOPT_POSTFIELDS ব্যবহার করতে পারেন। আপনার মতামতের জন্য ধন্যবাদ, তবে আমি শেষ পর্যন্ত এটি সমাধান করেছি :-)
ফিল স্টারজন

4
তুমি কি? আমি কি তখন কিছু সাহায্য করিনি?
অ্যাডাম হপকিনসন

2

এটি সিআই এর জন্য মোছার সংস্করণ। এটি মোছার জন্য 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 এ আমি delault _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);
}

;) এটা আমার জন্য কাজ করে!


4
DE _DELETE ;? আমি কেবল ত্রুটিটি অনির্ধারিত পরিবর্তনশীল পেয়েছি: _DELETE
বীরত্ব_
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.