পিএইচপি সিআরএল অনুরোধ মুছে ফেলুন


101

আমি পিএইচপি এবং সিআরএল ব্যবহার করে একটি মোছার http অনুরোধ করার চেষ্টা করছি।

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

আমি এটি এইভাবে করি:

public function curl_req($path,$json,$req)
{
    $ch = curl_init($this->__url.$path);
    $data = json_encode($json);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $req);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data)));
    $result = curl_exec($ch);
    $result = json_decode($result);
    return $result;
}

আমি তখন এগিয়ে যাই এবং আমার ফাংশনটি ব্যবহার করি:

public function deleteUser($extid)
{
    $path = "/rest/user/".$extid."/;token=".$this->__token;
    $result = $this->curl_req($path,"","DELETE");
    return $result;

}

এটি আমাকে HTTP অভ্যন্তরীণ সার্ভার ERROR দেয়। আমার অন্যান্য ক্রিয়াকলাপগুলিতে জিইটি এবং পোষ্টের সাথে একই curl_req পদ্ধতি ব্যবহার করে, সবকিছু ঠিকঠাক হয়।

তাহলে আমি কী ভুল করছি?


4
অভ্যন্তরীণ সার্ভার ত্রুটির অর্থ আপনার অনুরোধটি পাওয়ার জন্য স্ক্রিপ্টটিতে একটি সমস্যা ছিল।
ব্র্যাড

ধন্যবাদ ব্র্যাড - আমি জানি, আমি এটি অনুমান করি কারণ এটি মুছে ফেলার অনুরোধ হিসাবে প্রেরণ করে না। যদি আমি ফায়ারফক্সের জন্য একটি REST ক্লায়েন্ট প্লাগইন ব্যবহার করি এবং ডিলিটের সাথে একই অনুরোধটি প্রেরণ করি তবে এটি ঠিক আছে। সুতরাং এটি সিআরএল-এর মতো seams অনুরোধটি মোছার হিসাবে প্রেরণ করছে না।
বলি


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

উত্তর:


221

অবশেষে আমি নিজেই এটি সমাধান করেছি। অন্য কারও যদি সমস্যা হয় তবে আমার সমাধানটি এখানে:

আমি একটি নতুন পদ্ধতি তৈরি করেছি:

public function curl_del($path)
{
    $url = $this->__url.$path;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
    $result = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return $result;
}

আপডেট 2

যেহেতু এটি কিছু লোককে সহায়তা করে বলে মনে হচ্ছে, এখানে আমার চূড়ান্ত কার্লটি মুছে ফেলা পদ্ধতি, যা জেএসএন ডিকোডড অবজেক্টে HTTP প্রতিক্রিয়া ফিরিয়ে দেয়:

  /**
 * @desc    Do a DELETE request with cURL
 *
 * @param   string $path   path that goes after the URL fx. "/user/login"
 * @param   array  $json   If you need to send some json with your request.
 *                         For me delete requests are always blank
 * @return  Obj    $result HTTP response from REST interface in JSON decoded.
 */
public function curl_del($path, $json = '')
{
    $url = $this->__url.$path;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    $result = json_decode($result);
    curl_close($ch);

    return $result;
}

আপনি কি আমাকে বলতে পারেন যে আমরা কীভাবে পিএইচপি (পদ্ধতি: মুছুন) এ এইজ্যাক কল করি যা এই মোছার কার্ল কোডটি ধরে রাখে এবং এজ্যাক্স থেকে এটির মানটি পাস করে?
ব্যবহারকারী 1788736

@ ব্যবহারকারী 1788736 আমি আজাক্সে ভাল নই, তবে আমার ধারণা আপনি এই পিএইচপি ফাইল তৈরি করতে পারেন যা এই পদ্ধতিটি কার্যকর করে এবং এজ্যাক্সের সাথে আপনার পিএইচপি ফাইলটি পিএইচপি ফাইলটিতে প্রেরণ করে। যদি আপনি মনে করেন উপরের পদ্ধতিটি বিভ্রান্তিকর, তবে আবার দেখুন। some ইউআরএল (সার্ভারের সাথে ) কথা বলতে হবে এমন সার্ভার এবং $ পথটি ইউআরএল (/ কিছু /) এর পরে থাকা জিনিস after আমি এগুলি বিভক্ত করার একমাত্র কারণ, কারণ আমাকে সর্বদা একই সার্ভারে প্রেরণ করা প্রয়োজন, তবে গতিশীল পথ দিয়ে। আশা করি তা বোধগম্য হয়।
বলি

হেডার লাগবে না?
er.irfankhan11

আমি একই কোড ব্যবহার করছি, এবং পেপাল HTTP কোডটি ফেরত পাঠাবে: 204 এর অর্থ সফলভাবে মোছা। তবে আমি সব সময় 400 পেয়েছি।
er.irfankhan11

4
@kuttoozz যা আমার ক্লাসে একটি প্রাইভেট ভেরিয়েবল। এটি কেবল আপনার অনুরোধ করার প্রয়োজন URL টি। এটি api.someurl.com এর মতো কিছু হতে পারে এবং $ পথটি সেই ইউআরএল (/ কিছু /) এর পরে চলে। আপনি কেবল সেই মানটি আপনার ইউআরএলে পরিবর্তন করতে পারেন বা এটিকে সরাতে পারেন এবং পুরো URL টি $ পাথ ভেরিয়েবলের অন্তর্ভুক্ত করতে পারেন। যে জানার জন্য?
বলি

20

জিইটি, পোস্ট, ডিলিট, পুট সব ধরণের অনুরোধ করতে কল করতে আমি একটি সাধারণ ফাংশন তৈরি করেছি

function CallAPI($method, $api, $data) {
    $url = "http://localhost:82/slimdemo/RESTAPI/" . $api;
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    switch ($method) {
        case "GET":
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
            break;
        case "POST":
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
            break;
        case "DELETE":
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); 
            curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
            break;
    }
    $response = curl_exec($curl);
    $data = json_decode($response);

    /* Check for 404 (file not found). */
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    // Check the HTTP Status code
    switch ($httpCode) {
        case 200:
            $error_status = "200: Success";
            return ($data);
            break;
        case 404:
            $error_status = "404: API Not found";
            break;
        case 500:
            $error_status = "500: servers replied with an error.";
            break;
        case 502:
            $error_status = "502: servers may be down or being upgraded. Hopefully they'll be OK soon!";
            break;
        case 503:
            $error_status = "503: service unavailable. Hopefully they'll be OK soon!";
            break;
        default:
            $error_status = "Undocumented error: " . $httpCode . " : " . curl_error($curl);
            break;
    }
    curl_close($curl);
    echo $error_status;
    die;
}

কল মুছুন পদ্ধতি

$data = array('id'=>$_GET['did']);
$result = CallAPI('DELETE', "DeleteCategory", $data);

কল পোস্ট পদ্ধতি

$data = array('title'=>$_POST['txtcategory'],'description'=>$_POST['txtdesc']);
$result = CallAPI('POST', "InsertCategory", $data);

কল করুন পদ্ধতি

$data = array('id'=>$_GET['eid']);
$result = CallAPI('GET', "GetCategoryById", $data);

কল রাখুন পদ্ধতি

$data = array('id'=>$_REQUEST['eid'],m'title'=>$_REQUEST['txtcategory'],'description'=>$_REQUEST['txtdesc']);
$result = CallAPI('POST', "UpdateCategory", $data);

সাবাশ. শুধু একটি নোট: ডিলিট জন্য HTTP প্রতিক্রিয়া কোড 204. আমি মনে করি আপনি ভাল প্রতিক্রিয়া :) সব 20x কোড বিবেচনা করা উচিত
ryuujin

0

ডাব্লুএসই প্রমাণীকরণের সাথে আমার নিজের শ্রেণীর অনুরোধ

class Request {

    protected $_url;
    protected $_username;
    protected $_apiKey;

    public function __construct($url, $username, $apiUserKey) {
        $this->_url = $url;     
        $this->_username = $username;
        $this->_apiKey = $apiUserKey;
    }

    public function getHeader() {
        $nonce = uniqid();
        $created = date('c');
        $digest = base64_encode(sha1(base64_decode($nonce) . $created . $this->_apiKey, true));

        $wsseHeader = "Authorization: WSSE profile=\"UsernameToken\"\n";
        $wsseHeader .= sprintf(
            'X-WSSE: UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"', $this->_username, $digest, $nonce, $created
        );

        return $wsseHeader;
    }

    public function curl_req($path, $verb=NULL, $data=array()) {                    

        $wsseHeader[] = "Accept: application/vnd.api+json";
        $wsseHeader[] = $this->getHeader();

        $options = array(
            CURLOPT_URL => $this->_url . $path,
            CURLOPT_HTTPHEADER => $wsseHeader,
            CURLOPT_RETURNTRANSFER => true, 
            CURLOPT_HEADER => false             
        );                  

        if( !empty($data) ) {
            $options += array(
                CURLOPT_POSTFIELDS => $data,
                CURLOPT_SAFE_UPLOAD => true
            );                          
        }

        if( isset($verb) ) {
            $options += array(CURLOPT_CUSTOMREQUEST => $verb);                          
        }

        $ch = curl_init();
        curl_setopt_array($ch, $options);
        $result = curl_exec($ch);                   

        if(false === $result ) {
            echo curl_error($ch);
        }
        curl_close($ch);

        return $result; 
    }
}

ব্যবহার করুন = অ্যারে_ডম ইনস্ট্যানড
অ্যাড্রিওয়ান কেনোবি

এটি সম্ভবত কার্যকর হয় তবে এটি সমস্যার অহেতুক জটিল সমাধান।
স্যামুয়েল লিন্ডব্লম

0

স্যুইচ ($ পদ্ধতি) {কেস "জিইটি": কার্ল_সেটপ্ট ($ কার্ল, CURLOPT_CUSTOMREQUEST, "জিইটি"); বিরতি; কেস "পোস্ট": curl_setopt ((কার্ল, CURLOPT_CUSTOMREQUEST, "পোস্ট"); বিরতি; কেস "পুট": কার্ল_সেটপ্ট ($ কার্ল, CURLOPT_CUSTOMREQUEST, "PUT"); বিরতি; কেস "মোছা": কার্ল_সেটপ্ট ($ কার্ল, CURLOPT_CUSTOMREQUEST, "মোছা"); বিরতি; }


-19
    $json empty

public function deleteUser($extid)
{
    $path = "/rest/user/".$extid."/;token=".$this->__token;
    $result = $this->curl_req($path,"**$json**","DELETE");
    return $result;

}

ধন্যবাদ এই বিশেষ REST কলে, JSON অংশটি খালি থাকা দরকার, সুতরাং এটি কোনও সমস্যা নয়। তবে যাইহোক ধন্যবাদ
বলি

$json emptyএখানে মানে কি ? এটি যাইহোক যাইহোক এই ফাংশনটির ভিতরে সুযোগ নেই, সুতরাং এর ব্যবহার কিছু $jsonকরবে না।
অর্ধেক

আমি এই উত্তরটি মুছে ফেলার জন্য বলেছি, তবে একজন মধ্যস্থতা না বলেছিলেন। এই উত্তরের পোস্টারটি ২০১৪ সাল থেকে যাইহোক সাইন ইন করেনি।
অর্ধেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.