আমি কীভাবে পিএইচপি দিয়ে একটি পোষ্ট অনুরোধ পাঠাব?


656

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

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

উত্তর:


1260

পিএইচপি 5 এর সাথে সিআরএল-কম পদ্ধতি:

$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);

পদ্ধতিটি এবং শিরোনামগুলি কীভাবে যুক্ত করবেন তার আরও তথ্যের জন্য পিএইচপি ম্যানুয়াল দেখুন:


64
এটি লক্ষণীয় যে আপনি যদি শিরোনামগুলির জন্য কোনও অ্যারে ব্যবহার করার সিদ্ধান্ত নেন তবে '\ r \ n' দিয়ে কী বা মানগুলি শেষ করবেন না। স্ট্রিম_কন্টেক্সট_ক্রিয়েট () টেক্সটটি কেবল প্রথম '\ r \ n' পর্যন্ত নেবে
রাপ্টর

11
file_get_contents()ফোপেন র‍্যাপারগুলি সক্ষম করা থাকলে কেবল একটি URL ফাইল নাম হিসাবে ব্যবহার করা যেতে পারে । দেখুন php.net/manual/en/...
Pino

3
@ আমি ভালবাসাfile_get_contents()
অচলাবস্থা

14
সিআরএল ব্যবহার না করার জন্য কি কোনও নির্দিষ্ট কারণ আছে?
jvannistelrooy

37
পিএইচপি-র জন্য @ জাভান্নিসটেলারয়ে সিআরএল একটি এক্সটেনশন যা সমস্ত পরিবেশে নাও থাকতে পারে যেখানে file_get_contents()পিএইচপি এর মূল অংশ of এছাড়াও, অযৌক্তিকভাবে একটি এক্সটেনশন ব্যবহার করা আপনার অ্যাপ্লিকেশনটির আক্রমণ পৃষ্ঠকে প্রশস্ত করতে পারে। যেমন গুগল পিএইচপি কার্ল সিভ
পকেটস্যান্ড

139

আপনি সিআরএল ব্যবহার করতে পারেন :

<?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, true);
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;
?>

3
এটি আমার জন্য কাজ করেছিল কারণ যে পৃষ্ঠায় আমি কোনও পৃষ্ঠাতে পাঠাচ্ছি তাতে কোনও বিষয়বস্তু নেই তাই ফাইল_জেট_কন্টেন্টস সংস্করণটি কাজ করে না।
কমেন্টলভ

9
ফাইল_জেট_কন্টেন্টস সলিউশন পিএইচপি কনফিগারেশনগুলিতে অনুমতি_url_fopen বন্ধ (ভাগ করা হোস্টিংয়ের মতো) দিয়ে কাজ করে না। এই সংস্করণটি কার্ল লাইব্রেরি ব্যবহার করে এবং আমি মনে করি সর্বাধিক "সর্বজনীন" তাই আমি আপনাকে আমার ভোট দিয়েছি
ডায়রন গ্যালার্ডো

81
: আপনি সাইট যেখানে আপনার কাছ থেকে এই কোড নমুনা কপি না davidwalsh.name/curl-post
efreed

4
যদিও এটি খুব গুরুত্বপূর্ণ নয় তবে CURLOPT_POSTFIELDS পরামিতি ডেটা আসলে স্ট্রিংয়ে রূপান্তরিত করার প্রয়োজন হয় না ("urlified")। উক্তি: "এই প্যারামিটারটি হয় 'প্যারা 1 = ভাল 1 এবং প্যারা 2 = ভাল 2 এবং ...' এর মতো urlncoded স্ট্রিং হিসাবে বা ক্ষেত্রের নাম হিসাবে কী এবং ক্ষেত্রের ডেটা হিসাবে মান হিসাবে একটি অ্যারে হিসাবে পাস হতে পারে value মানটি যদি অ্যারে হয় তবে সামগ্রী-প্রকার শিরোনামটি মাল্টিপার্ট / ফর্ম-ডেটাতে সেট করা হবে। " লিঙ্ক: php.net/manual/en/function.curl-setopt.php
এডওয়ার্ড

2
এছাড়াও, এটি অন্যভাবে লেখার জন্য কোনও অপরাধ নেই, তবে কেন জানি না যে ম্যানুয়াল পৃষ্ঠায় এটি বুলিয়ানে সেট করার জন্য CURLOPT_POST প্যারামিটারটি কেন এখানে একটি নম্বর হিসাবে নির্দিষ্ট করা হয়েছে। উক্তি: "CURLOPT_POST: নিয়মিত HTTP পোষ্ট করতে সত্য"। লিঙ্ক: php.net/manual/en/function.curl-setopt.php
এডওয়ার্ড

68

আমি কার্ল ব্যবহার করে ডেটা পোস্ট করতে নীচের ফাংশনটি ব্যবহার করি। post ডেটা পোস্ট করার জন্য ক্ষেত্রগুলির একটি বিন্যাস (http_build_query ব্যবহার করে সঠিকভাবে এনকোড করা হবে)। অ্যাপ্লিকেশন / x-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 প্যারামিটারে পাস করা অ্যারে এনকোড করবে, তবে পরামর্শ দেওয়া হবে যে এই ক্ষেত্রে মাল্টিপার্ট / ফর্ম-ডেটা ব্যবহার করে ডেটা এনকোড করা হবে।

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


CURLOPT_POSTFIELDS এ অ্যারে পাস করার ফলে মাল্টিপার্ট / ফর্ম-ডেটা ব্যবহার করে ডেটা এনকোড করা হয় যা পছন্দসই নয়।
দিমা এল

ব্যবহারকারী ফাইল_জেট_কন্টেন্টস চেয়েছিলেন, তাই তার ডিফল্ট_ধারার_কন্টেক্সট পরিবর্তনের জন্য একটি সমাধান প্রয়োজন
রডন 8484২

স্পষ্ট করার জন্য: আমি মনে করি @ ডিমেল। মুছে ফেলা হয়েছে এমন একটি মন্তব্যে সাড়া দিচ্ছে; মাল্টিপার্ট / ফর্ম-ডেটা হিসাবে আউটপুট এড়িয়ে আরকে স্ট্রিতে http_build_queryরূপান্তর করে $datats
টুলমেকারস্টেভ

@ Radon8472 - সামগ্রীতে থাকা ... CURLOPT_RETURNTRANSFER, trueফলাফল $response
টুলমেকারস্টেভ

@ টলমেকারস্টেভ যেমনটি আমি বলেছিলাম, প্রশ্নটি ছিল file_get_contentsএবং আপনার সমাধানটির জন্য অনেক লোকের কাছে কী নেই তা সিআরএল প্রয়োজন। সুতরাং আপনার সমাধান সম্ভবত কাজ করছে, তবে দেশীয় বিল্টিন ফাইল / স্ট্রিম ফাংশনগুলির সাহায্যে এটি কীভাবে করা যায় সে প্রশ্নের উত্তর দিচ্ছে না।
Radon8472

42

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

গুজল ইনস্টল করা হচ্ছে

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

php composer.phar require guzzlehttp/guzzle

একটি পোষ্ট অনুরোধ প্রেরণ করতে গুজল ব্যবহার করে

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

// 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);

7
ইতিমধ্যে পোস্ট করা দেশীয় পিএইচপি সমাধানের সাথে এর কী কী সুবিধা রয়েছে তা জানার জন্য দরকারী হবে এবং সিআরএলও রয়েছে।
আর্টফুলবোট

9
@artfulrobot: নেটিভ পিএইচপি-সমাধানে প্রচুর সমস্যা রয়েছে (যেমন https, শংসাপত্র যাচাইকরণ, ইত্যাদি। সাথে সংযোগ করা), এ কারণেই প্রায় প্রতিটি পিএইচপি বিকাশকারী সিআরএল ব্যবহার করে। এবং কেন এই ক্ষেত্রে সিআরএল ব্যবহার করবেন না? এটি সহজ: গুজলের একটি সোজা-এগিয়ে, সহজ, হালকা ওজনের ইন্টারফেস রয়েছে যা সমস্ত "নিম্ন-স্তরের সিআরএল হ্যান্ডেলিং সমস্যাগুলি" দূরে ফেলে। আধুনিক পিএইচপি বিকাশকারী প্রায় সকলেই যেভাবেই সুরকার ব্যবহার করেন, তাই গুজল ব্যবহার করা খুব সহজ।
Andreas

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

26

আপনি যদি সেভাবে চলে যান তবে অন্য একটি সিআরএল পদ্ধতি রয়েছে।

পিএইচপি কার্ল এক্সটেনশন যেভাবে কাজ করে সেটাকে সেটআপ্ট () কলগুলির সাথে বিভিন্ন পতাকা সমন্বিত করার পথে আপনার মাথাটি একবার পেয়ে গেলে এটি বেশ সহজ। এই উদাহরণে আমি একটি পরিবর্তনশীল $ xML পেয়েছি যা আমার প্রেরণের জন্য প্রস্তুত করা এক্সএমএল ধারণ করে - আমি উদাহরণের পরীক্ষার পদ্ধতিতে এর সামগ্রীগুলি পোস্ট করতে চলেছি।

$url = 'http://api.example.com/services/xmlrpc/';
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);
//process $response

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


1
তৃতীয় কার্ল_সেটপ্ট () কলটিতে প্রথম আর্গটি হওয়া উচিত $chনয় $curl, সঠিক?
jcomeau_ictx

আপনি কি JSON ডেটা পোস্ট করতে এই একই কোডটি ব্যবহার করতে পারেন? তবে say এক্সএমএলকে বলুন $ জসন (যেখানে son জসন সম্ভবত জেএসএন স্ট্রিং?) এর সাথে প্রতিস্থাপন করুন
নীল ডেভিস

24

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

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

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

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

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

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

// ... your code

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


22

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

আমি এখানে যে ক্লাসটি লিখেছিলাম তা এইচটিটিপি-জিইটি / পোষ্ট / পুট / ডিলেট ডিলেট অনুরোধের উপর ভিত্তি করে কার্লের উপর ভিত্তি করে, কেবলমাত্র প্রতিক্রিয়া বডি সম্পর্কে:

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 ব্যবহার ক্যোয়ারী স্ট্রিং একটি অনুরোধ-বিন্যস্ত নামা (আপনি অ্যারের নিজেই ব্যবহার করতে পারে, সেইজন্য দেখুন: http://php.net/manual/en/function.curl-setopt.php )
  • প্রতিধ্বনির পরিবর্তে প্রতিক্রিয়া ফিরিয়ে দেওয়া। বিটিডব্লিউ আপনি curl_setopt রেখাটি সরিয়ে ফিরতে এড়াতে পারবেন ($ চ, সিআরএলওপি 07 রিটার্নটি ট্রান্সফার, সত্য); । এর পরে রিটার্ন মানটি একটি বুলিয়ান (সত্য = অনুরোধ সফল হয়েছিল অন্যথায় একটি ত্রুটি ঘটেছে) এবং প্রতিক্রিয়া প্রতিধ্বনিত হয়। দেখুন: http://php.net/en/manual/function.curl-exec.php
  • কার্ল_ক্লোজ ব্যবহার করে কার্ল হ্যান্ডলারটি পরিষ্কার করে সেশন ক্লোজিং এবং মুছুন । দেখুন: http://php.net/manual/en/function.curl-close.php
  • কার্ল_সেটপ্ট ফাংশনের জন্য বুলিয়ান মানগুলি কোনও সংখ্যা ব্যবহার না করে ব্যবহার করুন (
  • HTTP-PUT / DELETE কল করার ক্ষমতা (RESTful পরিষেবা পরীক্ষার জন্য দরকারী)

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

পাওয়া

$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}]');
    }
}

আমার জন্য, এটি বলেছে "আনচাড ত্রুটি: অপরিজ্ঞাত পদ্ধতিতে কল করুন HTTPRequester :: HTTPost ()" । আমি আপনার ক্লাসটি কেবল আমার। Php ফাইলে আটকিয়েছি। আমার আর কিছু করা দরকার?
লিনাসেফার্থ

1
আপনি কি আপনার কোড পোস্ট করতে পারেন? কোনও কোড স্নিপেট ছাড়াই কি হয়েছে তা অনুমান করা বেশ কঠিন।
এমওয়াত্জার

আমি যেমন বলেছি, আমি আক্ষরিকভাবে আপনার আমার প্লেইন পিএইচপি ফাইলটিতে অনুলিপি করেছি এবং এটি আমাকে এই ত্রুটি দিয়েছে।
লিনাসগফার্থ

1
ঠিক আছে এখন আমি সমস্যাটি দেখতে পাচ্ছি, .. উদাহরণটিতে এটি ভুল ছিল! আপনাকে HTTPRequester :: HTTPPes () HTTPRequester :: HTTPost () এর পরিবর্তে কল করতে হবে
এমটিউটিজার

1
আহ। যে এক সহজে মিস করা। আমি অতিরিক্ত পি স্পট করার আগে আপনার মন্তব্যটি 5x এর মতো পড়তে হয়েছিল । ধন্যবাদ!
লিনাসেফার্থ

19

উপরের কার্ল-কম পদ্ধতির আর একটি বিকল্প হ'ল দেশীয় স্ট্রিম ফাংশনগুলি ব্যবহার করা :

  • stream_context_create():

    অপশন প্রিসেটে সরবরাহিত যে কোনও বিকল্পের সাথে একটি স্ট্রিম প্রসঙ্গ তৈরি করে এবং প্রদান করে ।

  • stream_get_contents():

    অভিন্ন file_get_contents()ছাড়া stream_get_contents() একটি ইতিমধ্যেই খোলা প্রবাহ করে পরিচালিত সম্পদ ও আয় একটি স্ট্রিং অবশিষ্ট বিষয়বস্তু, আপ MAXLENGTH বাইট এবং নিদিষ্ট শুরু অফসেট

এগুলির সাথে একটি পোষ্ট ফাংশন সহজভাবে এটি হতে পারে:

<?php

function post_request($url, array $params) {
  $query_content = http_build_query($params);
  $fp = fopen($url, 'r', FALSE, // do not use_include_path
    stream_context_create([
    'http' => [
      'header'  => [ // header array does not need '\r\n'
        'Content-type: application/x-www-form-urlencoded',
        'Content-Length: ' . strlen($query_content)
      ],
      'method'  => 'POST',
      'content' => $query_content
    ]
  ]));
  if ($fp === FALSE) {
    return json_encode(['error' => 'Failed to get contents...']);
  }
  $result = stream_get_contents($fp); // no maxlength/offset
  fclose($fp);
  return $result;
}

1
এই সিআরএল-কম পদ্ধতিটি আমার কাছে গুগল থেকে র্যাপাপচা যাচাই করার জন্য ভাল কাজ করেছে। এই উত্তরটি এই গুগল কোডের সাথে রূপান্তরিত হয়েছে: github.com/google/recaptcha/blob/master/src/ReCaptcha/…
জাভি মন্টেরো

1
আপনি ব্যবহার করতে হবে না fclose()যদি $fpহয় false। কারণ fclose()কোনও সংস্থানটি প্যারামিটার বলে আশা করে।
ফ্লোরিস

1
@ ফ্লোরিস এটি ঠিক এখনই সম্পাদনা করেছে এবং প্রকৃতপক্ষে fclose ডক্স উল্লেখ করেছে "ফাইল পয়েন্টারটি অবশ্যই বৈধ হওয়া উচিত"। যে লক্ষ্য করার জন্য আপনাকে ধন্যবাদ!
সিপিএইচপিথন

8

এর সাথে প্রেরণের GETবা POSTঅনুরোধের আরও ভাল উপায় PHPনীচে রয়েছে:

<?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://docs.php.net/manual/da/httprequest.send.php


1
@ ইয়াকুনুরি হাইলাইট করার জন্য ধন্যবাদ, আমি নতুনটি ভাগ করতে যাচ্ছি।
ইমরান জহুর

পিএইচপি 5x এ কীভাবে করবেন?

@ ইউমি ইউয়াম দয়া করে উপরে 5x এর জন্য ডাবউর উত্তরটি চেকআউট করুন যা এই কৌশলটি ব্যবহার করে php.net/manual/en/function.stream-context-create.php অথবা আপনি সর্বদা স্ট্যান্ডার্ড কার্ল সমাধানে ফিরে যেতে পারেন।
ইমরান জহুর

5

আপনি ব্যবহার করতে পারেন আরও একটি আছে

<?php
$fields = array(
    'name' => 'mike',
    'pass' => 'se_ret'
);
$files = array(
    array(
        'name' => 'uimg',
        'type' => 'image/jpeg',
        'file' => './profile.jpg',
    )
);

$response = http_post_fields("http://www.example.com/", $fields, $files);
?>

বিস্তারিত জানতে এখানে ক্লিক করুন


2
এটি একটি PECL এক্সটেনশানের উপর নির্ভর করে যা বেশিরভাগ ইনস্টল করা হবে না। ম্যানুয়াল পৃষ্ঠাগুলি সরানো হয়েছে বলে এটি এখনও উপলব্ধ কিনা তাও নিশ্চিত নয়।
মিকেন 32

5

আমি অনুরূপ সমস্যার সন্ধান করছিলাম এবং এটি করার আরও ভাল পদ্ধতির সন্ধান করলাম। সুতরাং এখানে এটি যায়।

আপনি কেবল নীচের লাইনটি পুনঃনির্দেশ পৃষ্ঠায় রাখতে পারেন (পৃষ্ঠা 1.php বলুন)।

header("Location: URL", TRUE, 307); // Replace URL with to be redirected URL, e.g. final.php

REST API কলগুলির জন্য POST অনুরোধগুলি পুনর্নির্দেশ করতে আমার এটি দরকার । এই সমাধানটি পোস্ট ডেটার পাশাপাশি কাস্টম শিরোনামের মানগুলির সাথে পুনঃনির্দেশ করতে সক্ষম।

এখানে রেফারেন্স লিঙ্ক দেওয়া আছে


1
এই উত্তর কিভাবে একটি পৃষ্ঠায় পুনঃনির্দেশ অনুরোধ না আমি পিএইচপি সাথে একটি পোস্ট অনুরোধ কিভাবে পাঠাবো? নিশ্চিত যে এটি কোনও পোস্ট পরামিতি ফরোয়ার্ড করবে তবে এটি মোটেও একই নয়
ওয়েসলি স্মিথ

@ DelightedD0D, দুঃখিত আমি redirect a page request with POST paramবনাম মধ্যে পার্থক্য পাই না send POST request। আমার উভয়ের উদ্দেশ্য একই, আমি ভুল হলে আমাকে সংশোধন করুন।
অরিন্দম নায়ক

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

5

এখানে সিআরএল ছাড়াই কেবল একটি কমান্ড ব্যবহার করা হচ্ছে। সুপার সিম্পল

echo file_get_contents('https://www.server.com', false, stream_context_create([
    'http' => [
        'method' => 'POST',
        'header'  => "Content-type: application/x-www-form-urlencoded",
        'content' => http_build_query([
            'key1' => 'Hello world!', 'key2' => 'second value'
        ])
    ]
]));

কী 2 কীভাবে কাজ করবে? তাদের মধ্যে সেপারেটর কী?
সাইয়েদ মুহাম্মদ ইদ্রিস

কী -2 যোগ করতে সাইয়েডিড্রিগুলিতে আপনি এটি দ্বিতীয় অ্যারে আইটেম হিসাবে প্রবেশ করতে পারেন। 'কী 1' => 'হ্যালো ওয়ার্ল্ড!', 'কী 2' => 'দ্বিতীয় মান'
লিগা

এটি জ্যাপিয়ারের সাথে ব্যবহারের সময় খুব ভাল কাজ করে।
মোক্সেট জানুয়ারী

3

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

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


7
আমি যদি আপনাকে সম্ভব হয় তবে এটিকে আরও বিস্তৃত করতে দেখতে চাই।
গুই ইমামুরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.