php - আমি কিভাবে পিএইচপি সঙ্গে একটি পোস্ট অনুরোধ পাঠাতে পারি?




http post (8)

PHP5 সঙ্গে curl- কম পদ্ধতি:

$url = 'http://server.com/path';
$data = array('key1' => 'value1', 'key2' => 'value2');

// use key 'http' even if you send the request to https://...
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => http_build_query($data)
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === FALSE) { /* Handle error */ }

var_dump($result);

পদ্ধতি এবং কীভাবে হেডার যুক্ত করবেন তার আরো তথ্যের জন্য পিএইচপি ম্যানুয়াল দেখুন, উদাহরণস্বরূপ:

প্রকৃতপক্ষে আমি অনুসন্ধান ক্যোয়ারির পরে আসা সামগ্রীগুলি পড়তে চাই, যখন এটি সম্পন্ন হয়। সমস্যাটি হল URL শুধুমাত্র POST পদ্ধতি গ্রহণ করে এবং এটি GET পদ্ধতির সাথে কোনও পদক্ষেপ নেয় না ...

আমি domdocument বা file_get_contents() এর domdocument সমস্ত সামগ্রী পড়তে হবে। POST পদ্ধতির সাথে পরামিতি পাঠাতে এবং PHP মাধ্যমে বিষয়বস্তু পড়তে হবে এমন কোন পদ্ধতি আছে কি?


আপনি curl ব্যবহার করতে পারেন:

<?php
//The url you wish to send the POST request to
$url = $file_name;

//The data you want to send via POST
$fields = [
    '__VIEWSTATE '      => $state,
    '__EVENTVALIDATION' => $valid,
    'btnSubmit'         => 'Submit'
];

//url-ify the data for the POST
$fields_string = http_build_query($fields);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);

//So that curl_exec returns the contents of the cURL; rather than echoing it
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 

//execute post
$result = curl_exec($ch);
echo $result;
?>

আপনি যদি কোনও সুযোগে আপনার অ্যাপ বিকাশ করার জন্য ওয়ার্ডপ্রেস ব্যবহার করছেন (এটি আসলে খুব সাধারণ জিনিসগুলির জন্য অনুমোদন, তথ্য পৃষ্ঠা ইত্যাদি পেতে একটি সুবিধাজনক উপায়), আপনি নীচের স্নিপেটটি ব্যবহার করতে পারেন:

$response = wp_remote_post( $url, array('body' => $parameters));

if ( is_wp_error( $response ) ) {
    // $response->get_error_message()
} else {
    // $response['body']
}

এটি ওয়েব সার্ভারে যা পাওয়া যায় তার উপর নির্ভর করে, প্রকৃত HTTP অনুরোধ করার বিভিন্ন উপায়ে ব্যবহার করে। আরো বিস্তারিত জানার জন্য HTTP API ডকুমেন্টেশন দেখুন

আপনি যদি ওয়ার্ডপ্রেস ইঞ্জিনটি শুরু করতে কোনও কাস্টম থিম বা প্লাগইন বিকাশ করতে না চান তবে আপনি ওয়ার্ডপ্রেস রুটের একটি বিচ্ছিন্ন পিএইচপি ফাইলটিতে নিম্নলিখিতটি করতে পারেন:

require_once( dirname(__FILE__) . '/wp-load.php' );

// ... your code

এটি কোন থিম বা আউটপুট কোন এইচটিএমএল প্রদর্শন করবে না, শুধু ওয়ার্ডপ্রেস APIs সঙ্গে দূরে হ্যাক!


আমি আপনাকে সম্পূর্ণরূপে ইউনিট পরীক্ষা করা এবং সর্বশেষ কোডিং অনুশীলন ব্যবহার করে ওপেন-উত্স প্যাকেজ guzzle ব্যবহার করার সুপারিশ করি।

Guzzle ইনস্টল করা হচ্ছে

আপনার প্রোজেক্ট ফোল্ডারে কমান্ড লাইনটিতে যান এবং নিম্নোক্ত কমান্ডটি টাইপ করুন (অনুমান করা হচ্ছে যে আপনি ইতিমধ্যে প্যাকেজ পরিচালকের composer ইনস্টল করেছেন)। আপনি সুরকার ইনস্টল করতে সাহায্য প্রয়োজন হলে, আপনি এখানে একটি চেহারা থাকা উচিত

php composer.phar require guzzlehttp/guzzle

একটি POST অনুরোধ পাঠাতে Guzzle ব্যবহার করে

Guzzle ব্যবহারের খুব সোজা এগিয়ে রয়েছে কারণ এটি একটি হালকা-ওজন বস্তু ভিত্তিক API ব্যবহার করে:

// Initialize Guzzle client
$client = new GuzzleHttp\Client();

// Create a POST request
$response = $client->request(
    'POST',
    'http://example.org/',
    [
        'form_params' => [
            'key1' => 'value1',
            'key2' => 'value2'
        ]
    ]
);

// Parse the response object, e.g. read the headers, body, etc.
$headers = $response->getHeaders();
$body = $response->getBody();

// Output headers and body for debugging purposes
var_dump($headers, $body);

আমি কার্ল ব্যবহার করে তথ্য পোস্ট করার জন্য নিম্নলিখিত ফাংশন ব্যবহার করুন। $ ডেটা পোস্ট করার ক্ষেত্রগুলির একটি অ্যারে (http_build_query ব্যবহার করে সঠিকভাবে এনকোড করা হবে)। তথ্য অ্যাপ্লিকেশন / এক্স-www-form-urlencoded ব্যবহার করে এনকোড করা হয়।

function httpPost($url, $data)
{
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}

@ এডওয়ার্ড উল্লেখ করে যে http_build_query বাদ দেওয়া যেতে পারে কারণ কার্ল সঠিকভাবে CURLOPT_POSTFIELDS প্যারামিটারে প্রেরিত অ্যারেকে এনকোড করবে, তবে এই ক্ষেত্রে তথ্যটি মাল্টিপার্ট / ফর্ম-ডেটা ব্যবহার করে এনকোড করা হবে।

আমি এই ফাংশনটি API গুলির সাথে ব্যবহার করি যা অ্যাপ্লিকেশন / x-www-form-urlencoded ব্যবহার করে ডেটা এনকোড করার আশা করে। এজন্য আমি http_build_query () ব্যবহার করি।


আমি ফ্রেড তানরিকুট এর কার্ল ভিত্তিক উত্তর সম্পর্কে কিছু চিন্তা যুক্ত করতে চাই। আমি জানি তাদের বেশিরভাগই উপরে উত্তরগুলিতে লিখিত আছে, কিন্তু আমি মনে করি এটি একটি ভাল ধারণা যা তাদের সকলকে একসঙ্গে অন্তর্ভুক্ত করে।

এখানে আমি যে ক্লাসটি লিখেছি তা হ'ল HTTP- GET / POST / PUT / কার্টের উপর ভিত্তি করে ডিলিট অনুরোধগুলি তৈরি করুন, কেবলমাত্র প্রতিক্রিয়া শরীর সম্পর্কিত:

class HTTPRequester {
    /**
     * @description Make HTTP-GET call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPGet($url, array $params) {
        $query = http_build_query($params); 
        $ch    = curl_init($url.'?'.$query);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-POST call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPost($url, array $params) {
        $query = http_build_query($params);
        $ch    = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
        $response = curl_exec($ch);
        curl_close($ch);
        return $response;
    }
    /**
     * @description Make HTTP-PUT call
     * @param       $url
     * @param       array $params
     * @return      HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPPut($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'PUT');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
    /**
     * @category Make HTTP-DELETE call
     * @param    $url
     * @param    array $params
     * @return   HTTP-Response body or an empty string if the request fails or is empty
     */
    public static function HTTPDelete($url, array $params) {
        $query = \http_build_query($params);
        $ch    = \curl_init();
        \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, true);
        \curl_setopt($ch, \CURLOPT_HEADER, false);
        \curl_setopt($ch, \CURLOPT_URL, $url);
        \curl_setopt($ch, \CURLOPT_CUSTOMREQUEST, 'DELETE');
        \curl_setopt($ch, \CURLOPT_POSTFIELDS, $query);
        $response = \curl_exec($ch);
        \curl_close($ch);
        return $response;
    }
}

উন্নতি

  • অনুরোধ-অ্যারের বাইরে ক্যোয়ারী-স্ট্রিং পেতে http_build_query ব্যবহার করে। (আপনি অ্যারেটিও ব্যবহার করতে পারেন, তাই দেখুন: php.net/manual/en/function.curl-setopt.php )
  • এটি প্রতিচ্ছবি পরিবর্তে প্রতিক্রিয়া ফিরে। BTW আপনি লাইন curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, সত্য) সরানোর মাধ্যমে প্রত্যাবর্তন এড়াতে পারেন ; । তারপরে রিটার্ন মান একটি বুলিয়ান (সত্য = অনুরোধ সফল হয়েছে অন্যথায় একটি ত্রুটি ঘটেছে) এবং প্রতিক্রিয়া প্রতিধ্বনিত হয়। দেখুন: http://php.net/en/manual/function.curl-exec.php
  • Curl_close ব্যবহার করে কুল -হ্যান্ডলারের ক্লিনেশন বন্ধ এবং মুছে ফেলা। দেখুন: http://php.net/manual/en/function.curl-close.php
  • কোনও সংখ্যা ব্যবহার করার পরিবর্তে curl_setopt ফাংশনের জন্য বুলিয়ান মানগুলি ব্যবহার করে। (আমি জানি যে কোন সংখ্যা শূন্যের সমান নয় এমনটিও সত্য হিসাবে বিবেচিত হয় তবে সত্যের ব্যবহার আরও পাঠযোগ্য কোড তৈরি করে, তবে এটি আমার মতামত)
  • HTTP-PUT / DELETE কলগুলি করার জন্য যোগ্যতা (পুরোপুরি পরিষেবা পরীক্ষার জন্য দরকারী)

ব্যবহারের উদাহরণ

পাওয়া

$response = HTTPRequester::HTTPGet("http://localhost/service/foobar.php", array("getParam" => "foobar"));

পোস্ট

$response = HTTPRequester::HTTPPost("http://localhost/service/foobar.php", array("postParam" => "foobar"));

PUT

$response = HTTPRequester::HTTPPut("http://localhost/service/foobar.php", array("putParam" => "foobar"));

মুছে ফেলা

$response = HTTPRequester::HTTPDelete("http://localhost/service/foobar.php", array("deleteParam" => "foobar"));

পরীক্ষামূলক

আপনি এই সহজ বর্গ ব্যবহার করে কিছু শীতল সেবা পরীক্ষা করতে পারেন।

class HTTPRequesterCase extends TestCase {
    /**
     * @description test static method HTTPGet
     */
    public function testHTTPGet() {
        $requestArr = array("getLicenses" => 1);
        $url        = "http://localhost/project/req/licenseService.php";
        $this->assertEquals(HTTPRequester::HTTPGet($url, $requestArr), '[{"error":false,"val":["NONE","AGPL","GPLv3"]}]');
    }
    /**
     * @description test static method HTTPPost
     */
    public function testHTTPPost() {
        $requestArr = array("addPerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPost($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPPut
     */
    public function testHTTPPut() {
        $requestArr = array("updatePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPPut($url, $requestArr), '[{"error":false}]');
    }
    /**
     * @description test static method HTTPDelete
     */
    public function testHTTPDelete() {
        $requestArr = array("deletePerson" => array("foo", "bar"));
        $url        = "http://localhost/project/req/personService.php";
        $this->assertEquals(HTTPRequester::HTTPDelete($url, $requestArr), '[{"error":false}]');
    }
}

HTTP_Request2 অনুরোধগুলি সহজেই পাঠাতে HTTP_Request2 প্যাকেজটি চেষ্টা করুন। অন্যথায়, আপনি পিএইচপি এর কার্ল ফাংশন ব্যবহার করতে পারেন অথবা একটি পিএইচপি স্ট্রিম প্রসঙ্গ ব্যবহার করতে পারেন।

HTTP_Request2 এছাড়াও সার্ভারকে ঠকানো সম্ভব করে তোলে, যাতে আপনি সহজেই আপনার কোডটি একক-পরীক্ষা করতে পারেন


PHP সাথে GET বা POST অনুরোধ পাঠানোর আরও ভাল উপায় নীচে দেওয়া হল:

<?php
    $r = new HttpRequest('http://example.com/form.php', HttpRequest::METH_POST);
    $r->setOptions(array('cookies' => array('lang' => 'de')));
    $r->addPostFields(array('user' => 'mike', 'pass' => 's3c|r3t'));

    try {
        echo $r->send()->getBody();
    } catch (HttpException $ex) {
        echo $ex;
    }
?>

কোড এখানে অফিসিয়াল ডকুমেন্টেশন থেকে নেওয়া হয় http://php.net/manual/it/httprequest.send.php





request