পিএইচপি + কার্ল, এইচটিটিপি পোস্টের নমুনা কোড?


489

এইচটিটিপি পোস্ট দিয়ে কীভাবে একজন পিএইচপি কার্ল করবেন তা আমাকে কেউ দেখাতে পারেন?

আমি এই জাতীয় ডেটা প্রেরণ করতে চাই:

username=user1, password=passuser1, gender=1

প্রতি www.domain.com

আমি কার্লটি মত একটি প্রতিক্রিয়া প্রত্যাশা আশা করি result=OK। কোন উদাহরণ আছে?

উত্তর:


838
<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://www.example.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "postvar1=value1&postvar2=value2&postvar3=value3");

// In real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS, 
//          http_build_query(array('postvar1' => 'value1')));

// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);

curl_close ($ch);

// Further processing ...
if ($server_output == "OK") { ... } else { ... }
?>

47
http_build_query()পরামিতিগুলি হ্যান্ডেল করার জন্য কোনও প্রয়োজন নেই ; শুধু অ্যারে পাস CURLOPT_POSTFIELDSযথেষ্ট।
র‌্যাপিটার

8
@ র‌্যাপ্টর সরাসরি সিআরএলওপিT_POSTFIELDS এ অ্যারে সরবরাহ করে আসলে কার্ল কিছুটা আলাদা ধরণের POST তৈরি করে। (প্রত্যাশা: 100-চালিয়ে যাওয়া)
ওলেগ পপভ

22
এছাড়াও মানটি যদি CURLOPT_POSTFIELDSঅ্যারে হয় তবে Content-Typeশিরোনামটি multipart/form-dataপরিবর্তে সেট করা হবে application/x-www-form-urlencodedphp.net/manual/en/function.curl-setopt.php
ক্লো

2
সিআরএলএপপিআরআরসিএনটিআরএনএসএফআর ব্যবহার করার অর্থ কার্ল_এক্সেক আউটপুট না দিয়ে প্রতিক্রিয়াটিকে স্ট্রিং হিসাবে ফিরিয়ে দেবে।
বিএনপি 887

2
আমি ব্যবহার সুপারিশ trueপরিবর্তে 1জন্য CURLOPT_POST
ফ্লুরোসেন্টগ্রিন 5

260

প্রথাগত

// set post fields
$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];

$ch = curl_init('http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

// execute!
$response = curl_exec($ch);

// close the connection, release resources used
curl_close($ch);

// do anything you want with your response
var_dump($response);

অবজেক্ট ওরিয়েন্টেড

<?php

// mutatis mutandis
namespace MyApp\Http;

class CurlPost
{
    private $url;
    private $options;

    /**
     * @param string $url     Request URL
     * @param array  $options cURL options
     */
    public function __construct($url, array $options = [])
    {
        $this->url = $url;
        $this->options = $options;
    }

    /**
     * Get the response
     * @return string
     * @throws \RuntimeException On cURL error
     */
    public function __invoke(array $post)
    {
        $ch = curl_init($this->url);

        foreach ($this->options as $key => $val) {
            curl_setopt($ch, $key, $val);
        }

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

        $response = curl_exec($ch);
        $error    = curl_error($ch);
        $errno    = curl_errno($ch);

        if (is_resource($ch)) {
            curl_close($ch);
        }

        if (0 !== $errno) {
            throw new \RuntimeException($error, $errno);
        }

        return $response;
    }
}

ব্যবহার

// create curl object
$curl = new \MyApp\Http\CurlPost('http://www.example.com');

try {
    // execute the request
    echo $curl([
        'username' => 'user1',
        'password' => 'passuser1',
        'gender'   => 1,
    ]);
} catch (\RuntimeException $ex) {
    // catch errors
    die(sprintf('Http error %s with code %d', $ex->getMessage(), $ex->getCode()));
}

পার্শ্ব নোট এখানে: পদ্ধতির AdapterInterfaceসাথে উদাহরণস্বরূপ বলা হয় এমন কিছু ধরণের ইন্টারফেস তৈরি করা ভাল getResponse()এবং সর্বোপরি শ্রেণিটি এটি প্রয়োগ করতে দেয়। তারপরে আপনি নিজের প্রয়োগের কোনও পার্শ্ব প্রতিক্রিয়া ছাড়াই সর্বদা আপনার পছন্দসই আরেকটি অ্যাডাপ্টারের সাথে এই প্রয়োগটি অদলবদল করতে পারেন।

HTTPS ব্যবহার / ট্রাফিক এনক্রিপ্ট করা

সাধারণত উইন্ডোজ অপারেটিং সিস্টেমের অধীনে পিএইচপি-তে সিআরএল নিয়ে সমস্যা হয়। একটি https সুরক্ষিত শেষ পয়েন্টের সাথে সংযোগ দেওয়ার চেষ্টা করার সময়, আপনাকে এটি বলতে একটি ত্রুটি পাবেন certificate verify failed

বেশিরভাগ লোকেরা এখানে যা করেন তা হ'ল সিআরএল লাইব্রেরিটি শংসাপত্রের ত্রুটিগুলি উপেক্ষা করার জন্য এবং ( curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);) চালিয়ে যেতে বলা । যেহেতু এটি আপনার কোডটিকে কাজ করবে, আপনি বিশাল সুরক্ষা গর্ত প্রবর্তন করুন এবং দূষিত ব্যবহারকারীদের আপনার অ্যাপ্লিকেশনটিতে ম্যান ইন দ্য মিডল আক্রমণ বা এর মতো বিভিন্ন আক্রমণ করতে সক্ষম করে enable

কখনই না, কখনই না। পরিবর্তে, আপনাকে কেবল নিজের সংশোধন করতে হবে php.iniএবং পিএইচপি বলতে হবে আপনার CA Certificateফাইলটি এটি কোথায় শংসাপত্রগুলি সঠিকভাবে যাচাই করতে দেয়:

; modify the absolute path to the cacert.pem file
curl.cainfo=c:\php\cacert.pem

সর্বশেষতমটি cacert.pemইন্টারনেট থেকে ডাউনলোড করা বা আপনার প্রিয় ব্রাউজার থেকে নেওয়া যেতে পারে । কোনও php.iniসম্পর্কিত সেটিংস পরিবর্তন করার সময় আপনার ওয়েব সার্ভারটি পুনরায় চালু করতে ভুলবেন না।


4
এটি সত্যই গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ সেরা অনুশীলন হ'ল এইচটিটিপি লাইব্রেরিটি আপনার ভেরিয়েবলগুলির এনকোডিং পরিচালনা করতে দেয়।
এরিক সিস্ট্র্যান্ড

4
এই সবসময় তা হয় না। আমি এমন ওয়েব সার্ভারগুলি দেখেছি যা প্রত্যাশিত ভেরিয়েবলগুলি নির্দিষ্ট উপায়ে এনকোড হওয়ার আশা করে, অন্যথায় ব্যর্থ হতে পারে। আমার কাছে মনে হয় যে এটির জন্য সিআরএল-এর চেয়ে http_build_query () আসলে আরও নির্ভরযোগ্য।
সিউজার

4
পোষ্ট প্যারামিটারগুলি দেখতে কেমন হওয়া উচিত সে সম্পর্কে HTTP স্পেসটি বেশ সোজা। ওয়েবসার্ভার সফ্টওয়্যার যেভাবেই মান মেনে চলতে হবে।
এমিক্স

1
এইভাবে ব্যবহার করে আপনি সিআরএলকে পোষ্টের কিছু ভিন্ন ধরণের ব্যবহার করতে বাধ্য করবেন। (প্রত্যাশা: 100-চালিয়ে যান)। এই নিবন্ধটি দেখুন: সমর্থন.urbanairship.com/entries/…
ওলেগ পপভ

5
@ সিজারের মন্তব্যে সম্প্রসারণ করার সাথে সাথে পিএইচপি ডকুমেন্টেশনগুলি স্পষ্টভাবে নিম্নলিখিতটি নোট করে: "সিআরএলপিপস-পিওএসটিএফআইএলডিএস-তে একটি অ্যারে পাঠানো হলে মাল্টিপার্ট / ফর্ম-ডেটা হিসাবে ডেটা এনকোড হবে , যখন ইউআরএল-এনকোডযুক্ত স্ট্রিংটি পাস করার সময় অ্যাপ্লিকেশন / এক্স-www- ফর্ম হিসাবে ডেটা এনকোড হবে -আরলঙ্কডড । "। আমি সম্প্রতি একটি তৃতীয় পক্ষের শেষ পয়েন্টে কেন একটি সিআরএল কলটি ব্যর্থ হচ্ছিল তা কেবল অবশেষে উপলব্ধি করতে গিয়েছিলাম যে তারা মাল্টিপার্ট / ফর্ম-ডেটা সমর্থন করে না trying
জেক জেড

31

এইচটিটিপি পোস্ট করতে পিএইচপি কার্ল_এক্সেক ব্যবহারের একটি জীবন্ত উদাহরণ:

এটিকে foobar.php নামক একটি ফাইলে রাখুন:

<?php
  $ch = curl_init();
  $skipper = "luxury assault recreational vehicle";
  $fields = array( 'penguins'=>$skipper, 'bestpony'=>'rainbowdash');
  $postvars = '';
  foreach($fields as $key=>$value) {
    $postvars .= $key . "=" . $value . "&";
  }
  $url = "http://www.google.com";
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_POST, 1);                //0 for a get request
  curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
  curl_setopt($ch,CURLOPT_TIMEOUT, 20);
  $response = curl_exec($ch);
  print "curl response is:" . $response;
  curl_close ($ch);
?>

তারপর কমান্ড দিয়ে এটি চালান php foobar.php , এটি স্ক্রিনে এই জাতীয় আউটপুট ডাম্প করে:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Title</title>

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">
<body>
  A mountain of content...
</body>
</html>

সুতরাং আপনি www.google.com এ একটি পিএইচপি পোস্ট করেছেন এবং এটিকে কিছু ডেটা প্রেরণ করেছেন।

সার্ভারটি যদি পোস্ট ভেরিয়েবলগুলিতে পড়ার জন্য প্রোগ্রাম করা হত তবে এটি এর ভিত্তিতে আলাদা কিছু করার সিদ্ধান্ত নিতে পারে।


$postvars .= $key . $value;উচিত $postvars .= $key . $value ."&";নাকি?
মানওয়াল

এই উত্তরটির দিকে আবার তাকানো , আপনি নিজের কাস্টম ক্যোরিয় স্ট্রিং রূপান্তরকরণ বাস্তবায়নটিকে http_build_query দিয়ে প্রতিস্থাপন করতে পারেন , কেবল এটি $fieldsঅ্যারে দিন এবং এটি একটি কোয়েরি স্ট্রিং আউটপুট দেবে।

সচেতন হন যে আপনার ডেটা নিরাপদে জমা দেওয়ার জন্য আপনার কোডটি এনকোড করা উচিত।
wtf8_decode

3
ওহ না পোস্ট স্ট্রিং নিজে তৈরি করার চেষ্টা করবেন না! এটি ব্যবহার করুন:curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
ওরিয়াদাম

3
-1 কারণ আপনি আপনার পোস্টের বারগুলি এড়িয়ে যাচ্ছেন না। ওপির উদাহরণটি প্রমাণীকরণের জন্য ব্যবহারকারী-জমা দেওয়া ব্যবহারকারীর নাম এবং পাসওয়ার্ড প্রেরণ করছে। আপনার সমাধানের সাহায্যে, কোনও ও এর পাসওয়ার্ড সহ কোনও ব্যবহারকারী কখনও লগ ইন করতে পারবেন না iরিয়াদামের মন্তব্য সঠিক, তবে আপনি ছেড়ে যেতে পারেনhttp_build_query যেমন:curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
এরিক Seastrand

26

এটি সহজেই পৌঁছে যেতে পারে:

<?php

$post = [
    'username' => 'user1',
    'password' => 'passuser1',
    'gender'   => 1,
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.domain.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
$response = curl_exec($ch);
var_export($response);

13

কার্ল পোস্ট + ত্রুটি হ্যান্ডলিং + শিরোনামগুলি সেট করুন [@ মন্টাস-ডিকে ধন্যবাদ]:

function curlPost($url, $data=NULL, $headers = NULL) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if(!empty($data)){
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    }

    if (!empty($headers)) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $response = curl_exec($ch);

    if (curl_error($ch)) {
        trigger_error('Curl Error:' . curl_error($ch));
    }

    curl_close($ch);
    return $response;
}


curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);

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

7
curlPost('google.com', [
    'username' => 'admin',
    'password' => '12345',
]);


function curlPost($url, $data) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $response = curl_exec($ch);
    $error = curl_error($ch);
    curl_close($ch);
    if ($error !== '') {
        throw new \Exception($error);
    }

    return $response;
}

1
আপনার কোড হ্যান্ডেল এবং বিনামূল্যে সংস্থানগুলি বন্ধ করবে না, কারণ আপনি একটি ব্যতিক্রম ছুঁড়ে দেওয়ার পরে কার্ল_ক্লোজ করুন। আপনার curl_closeএকটি finallyব্লকের ভিতরে থাকা উচিত ।
এমিক্স

6

ফর্মটি যদি পুনঃনির্দেশ, প্রমাণীকরণ, কুকিজ, এসএসএল (https), বা পোষ্ট ভেরিয়েবলের প্রত্যাশা করা একটি সম্পূর্ণ উন্মুক্ত স্ক্রিপ্ট ব্যতীত অন্য কোনও কিছু ব্যবহার করে থাকে তবে আপনি সত্যিই দ্রুত আপনার দাঁত ঘষতে শুরু করতে যাচ্ছেন। স্নোপিতে একবার দেখুন , যা আপনাকে প্রচুর ওভারহেড সেটআপ করার প্রয়োজনীয়তা অপসারণ করার সময় যা মনে মনে রাখে ঠিক তাই করে।


আপনি যদি স্টক curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
লিবের সাথে লেগে থাকতে চান তবে

কেবলমাত্র খারাপ দিকটি হ'ল আপনাকে এখনও কুকির জার সেট করার এবং অন্যান্য সম্ভাব্য সমস্যাগুলি (যেমন পুনঃনির্দেশগুলি অনুসরণ করা উচিত কিনা, কীভাবে এইচটিটিপি-ভিত্তিক অ্যান্টিফিকেশন ইত্যাদির সাথে ডিল করতে হবে ইত্যাদি) মোকাবেলা করতে হবে। 6 বছর পরে, আমি সেই নির্দিষ্ট লাইব্রেরির পরিবর্তে "হেডলেস-ব্রাউজার" এর আরও জেনেরিক ধারণাটি সুপারিশ করব (বা সোর্সফোজের কোনও কিছু, কতটা তারিখের অধিকার?) এবং আমি সাধারণত কার্ল বিকল্পগুলি সরাসরি মোকাবেলা করার পরেও পরামর্শ দেব মাথা ব্যথা এড়াতে একটি হেডলেস-ব্রাউজার লাইব্রেরির দিকে তাকানো যা PSR-7 সামঞ্জস্যপূর্ণ (গুজল কেবলমাত্র আমি জানিনা)
অ্যান্টনি

3

একটি সহজ উত্তর যদি আপনি নিজের ওয়েবসাইটে তথ্য প্রেরণ করছেন তবে একটি সেশন ভেরিয়েবল ব্যবহার করা। পিএইচপি পৃষ্ঠা দিয়ে শুরু করুন:

session_start();

যদি কোনও পর্যায়ে এমন তথ্য থাকে যা আপনি পিএইচপি-তে উত্পন্ন করতে চান এবং সেশনে পরবর্তী পৃষ্ঠায় পাস করার জন্য, কোনও পোষ্ট ভেরিয়েবল ব্যবহার না করে, এটি একটি সেশন ভেরিয়েবলে বরাদ্দ করুন। উদাহরণ:

$_SESSION['message']='www.'.$_GET['school'].'.edu was not found.  Please try again.'

তারপরে পরবর্তী পৃষ্ঠায় আপনি কেবলমাত্র এই সেশন ভেরিয়েবলটি উল্লেখ করুন। দ্রষ্টব্য: আপনি এটি ব্যবহারের পরে, নিশ্চিত হয়ে নিন যে আপনি এটি ধ্বংস করেছেন, সুতরাং এটি ব্যবহারের পরে এটি স্থির থাকে না:

if (isset($_SESSION['message'])) {echo $_SESSION['message']; unset($_SESSION['message']);}

3

এখানে পিএইচপি + কার্লের জন্য কিছু বয়লারপ্লেট কোড রয়েছে http://www.webbotsspidersscreenscrapers.com/DSP_download.php

এই লাইব্রেরি অন্তর্ভুক্ত উন্নয়ন সহজ করবে

<?php
# Initialization
include("LIB_http.php");
include("LIB_parse.php");
$product_array=array();
$product_count=0;

# Download the target (store) web page
$target = "http://www.tellmewhenitchanges.com/buyair";
$web_page = http_get($target, "");
    ...
?>

2

আপনি যদি কুকিজ সহ সাইটে লগইন করার চেষ্টা করেন।

এই কোড:

if ($server_output == "OK") { ... } else { ... }

আপনি লগইন করার চেষ্টা করলে কাজ করতে পারে না, কারণ অনেক সাইট 200 টি স্ট্যাটাস ফিরিয়ে দেয় তবে পোস্টটি সফল হয় না।

লগইন পোস্টটি সফল কিনা তা যাচাই করার সহজ উপায়টি এটি আবার কুকিজ সেট করে কিনা তা পরীক্ষা করে দেখুন। যদি আউটপুটে সেট-কুকিজের স্ট্রিং থাকে তবে এর অর্থ পোস্টগুলি সফল হয় না এবং এটি নতুন সেশন শুরু করে।

এছাড়াও পোস্টটি সফল হতে পারে তবে স্থিতিটি 200 এর পরিবর্তে পুনঃনির্দেশ করা যেতে পারে।

পোস্টটি সফল কিনা তা নিশ্চিত হওয়ার জন্য:

পোস্টের পরে অবস্থান অনুসরণ করুন, সুতরাং এটি সেই পৃষ্ঠাতে যাবে যেখানে পোস্টটিতে পুনঃনির্দেশ করা হয়:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

এবং অনুরোধে নতুন কুকিজ বিদ্যমান কিনা তা যাচাই করার চেয়ে:

if (!preg_match('/^Set-Cookie:\s*([^;]*)/mi', $server_output)) 

{echo 'post successful'; }

else { echo 'not successful'; }

1

ফর্ম এবং কাঁচা ডেটা প্রেরণের উদাহরণ :

$curlHandler = curl_init();

curl_setopt_array($curlHandler, [
    CURLOPT_URL => 'https://postman-echo.com/post',
    CURLOPT_RETURNTRANSFER => true,

    /**
     * Specify POST method
     */
    CURLOPT_POST => true,

    /**
     * Specify array of form fields
     */
    CURLOPT_POSTFIELDS => [
        'foo' => 'bar',
        'baz' => 'biz',
    ],
]);

$response = curl_exec($curlHandler);

curl_close($curlHandler);

echo($response);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.