CURLOPT_POSTFIELDS এর জন্য POST ফর্ম্যাটটি কার্ল করুন


102

আমি যখন curlমাধ্যমে POSTসেট এবং সেট CURLOPT_POSTFIELDকরি তখন আমার কি urlencodeকোনও বিশেষ বিন্যাস আছে?

উদাহরণস্বরূপ: আমি যদি 2 টি ক্ষেত্র পোস্ট করতে চাই তবে প্রথম এবং শেষ:

first=John&last=Smith

কার্ল সহ সঠিক কোড / ফর্ম্যাটটি কী ব্যবহার করা উচিত?

$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$reply=curl_exec($ch);
curl_close($ch);

উত্তর:


100

আপনি যদি কোনও স্ট্রিং প্রেরণ করছেন তবে এটি urlencode () করুন। অন্যথায় যদি অ্যারে হয় তবে এটি কী => মান যুক্ত হওয়া উচিত এবং শিরোনামটি Content-typeস্বয়ংক্রিয়ভাবে সেট করা থাকে multipart/form-data

এছাড়াও, আপনার অ্যারেগুলির জন্য ক্যোয়ারী তৈরি করতে আপনাকে অতিরিক্ত ফাংশন তৈরি করতে হবে না, আপনার ইতিমধ্যে এটি রয়েছে:

$query = http_build_query($data, '', '&');

13
আপনি শুধু ব্যবহার করতে পারেন http_build_query($data)যেহেতু &ডিফল্ট বিভাজক হয়।
nullability

6
অবশ্যই আপনি এগুলি এড়িয়ে যেতে পারেন। এটি অন্য দুটি যুক্তি ব্যাখ্যা করার জন্য যা আপনি আপনার নির্দিষ্ট প্রয়োজন অনুসারে পরিবর্তন করতে (বা নাও করতে পারেন) পূর্বনির্ধারিত পৃথক পৃথক) করতে পারেন।
কোডেয়ার্ট

63

সম্পাদনা : পিএইচপি 5 থেকে উপরের দিকে, ব্যবহারের http_build_queryপ্রস্তাব দেওয়া হয়:

string http_build_query ( mixed $query_data [, string $numeric_prefix [, 
                          string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )

ম্যানুয়াল থেকে সহজ উদাহরণ:

<?php
$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

echo http_build_query($data) . "\n";

/* output:
foo=bar&baz=boom&cow=milk&php=hypertext+processor
*/

?>

পিএইচপি 5 এর আগে:

ম্যানুয়াল থেকে :

CURLOPT_POSTFIELDS

এইচটিটিপি "পোস্ট" অপারেশনে পোস্ট করার জন্য সম্পূর্ণ ডেটা। একটি ফাইল পোস্ট করতে, @ দিয়ে একটি ফাইলের নাম সংশোধন করুন এবং পুরো পথটি ব্যবহার করুন। '; টাইপ = মিমিটাইপ' ফরম্যাটে টাইপযুক্ত ফাইলের নাম অনুসরণ করে ফাইল টাইপ স্পষ্টভাবে নির্দিষ্ট করা যেতে পারে। এই প্যারামিটারটি হয় 'প্যারা 1 = ভাল 1 এবং প্যারা 2 = ভাল 2 এবং ...' এর মতো urlencoded স্ট্রিং হিসাবে বা ক্ষেত্রের নাম হিসাবে কী এবং ক্ষেত্রের ডেটা হিসাবে মান হিসাবে একটি অ্যারে হিসাবে পাস হতে পারে। মানটি যদি একটি অ্যারে হয় তবে সামগ্রী-প্রকারের শিরোনামটি মাল্টিপার্ট / ফর্ম-ডেটাতে সেট করা হবে। পিএইচপি 5.2.0 হিসাবে, @ উপসর্গ সহ এই বিকল্পটিতে পাস করা ফাইলগুলি কাজ করার জন্য অ্যারে আকারে থাকতে হবে।

সুতরাং এর মতো কিছুতে নিখুঁতভাবে কাজ করা উচিত (কোনও সংযুক্তিযুক্ত অ্যারেতে প্যারামিটারগুলি সহ):

function preparePostFields($array) {
  $params = array();

  foreach ($array as $key => $value) {
    $params[] = $key . '=' . urlencode($value);
  }

  return implode('&', $params);
}

11
আপনি যদি একটি অ্যারে পাস করতে পারেন তবে আপনি কেন একটি স্ট্রিং পাস করবেন ...?
চোরমাস্টার

4
আমি মনে করি $ কীটিও এনকোড করা উচিত, ঠিক আপনার যদি "নাম এবং উপাধি" ইত্যাদির মতো থাকে তবে বিশেষ করে যদি শেষ ব্যবহারকারী ব্যবহার করেন
মারিয়াস বালিয়েটিস

4
@ বারিয়াস, আমি আপনার সাথে একমত এবং আমি মনে করি যে উপরে উল্লিখিত ফাংশনটির চেয়ে http_build_query () আসলে ভাল।
স্কাইফ্রি

4
@ স্কিফ্রি আমি সম্মত! যে ফাংশন PHP5 মধ্যে যোগ করা হয়েছিল যদিও যা ছিল এখনও 2011 মান থেকে অনেক দূরে
Czechnology

4
আপনি কেবল অ্যারে পাস করতে পারলে কেন http_build_query প্রয়োজন?
অফেনসো

39

মোটেও স্ট্রিং পাস করবেন না!

আপনি একটি অ্যারে পাস করতে পারেন এবং পিএইচপি / কার্লকে এনকোডিং ইত্যাদির নোংরা কাজ করতে দিন can


17
অ্যারে পাস করা স্ট্রিংয়ের চেয়ে আলাদা কন্টেন্ট-টাইপ হবে, তাই এটি করার উপযুক্ত কারণ আছে। আমাকে কিছুটা সময় নিল
থমাস ভ্যান্ডার স্টিচিল

কেন আমার কোনও ধারণা নেই তবে আমি দেখতে পেয়েছি যে আমার জিতে দেব পিসি একটি অ্যারে পাস করতে প্রায় এক সেকেন্ড সময় নেয় (1.029s অ্যারে ব্যবহার http_build_query()করে 0.01 সে একই অ্যারে ব্যবহার করে)
kratenko

4
নেস্টেড অ্যারেগুলি কাজ করবে না। সিআরএল তাদের স্ট্রিংয়ে রূপান্তর করতে চেষ্টা করবে এবং একটি পিএইচপি অ্যারে স্ট্রিং রূপান্তর বিজ্ঞপ্তি অনুসরণ করবে
7ochem

5

পিএইচপি ম্যানুয়াল অনুসারে, স্ট্রিং হিসাবে সিআরএল-এ দেওয়া ডেটা ইউআরএলকোড করা উচিত। Curl_setopt () এর জন্য পৃষ্ঠাটি দেখুন এবং অনুসন্ধান করুন CURLOPT_POSTFIELDS


5

এর জন্য CURLOPT_POSTFIELDS, প্যারামিটারগুলি হয় urlncoded স্ট্রিং para1=val1&para2=val2&..হিসাবে বা ক্ষেত্রের নাম হিসাবে কী হিসাবে এবং ক্ষেত্রের ডেটা হিসাবে মান হিসাবে অ্যারে হিসাবে পাস করা যেতে পারে

নিম্নলিখিত বিন্যাস চেষ্টা করুন:

$data = json_encode(array(
"first"  => "John",
"last" => "Smith"
));

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
curl_close($ch);

4
হাই শ্রদ্ধা, json_encode()আপনাকে কোনও বৈধ প্যারামিটার স্ট্রিংয়ের থেকে সত্যিই আলাদা কিছু দেবে first=John&last=Smithjson_encode()আউটপুট হবে: {"first":"John","last":"Smith"}যা আপনার পোষ্ট অনুরোধের কাঁচা অংশ হয়ে যাবে।
7:55

4
যদি না প্রাপক আশা করছে: @ 7ochem এর মন্তব্যের জুড়তে একটি JSON- এনকোড স্ট্রিং সম্বলিত একটি একক প্যারামিটার পরিবর্তে json_encode(...)Do http_build_query(...)। এটি প্রত্যাশিত "url- এনকোডেড স্ট্রিং" তৈরি করবে যা "&" দ্বারা পৃথক পৃথক পরামিতিগুলি ধারণ করে।
টুলমেকারস্টেভ

5

অন্য একটি প্রধান পার্থক্য যা এখনও এখানে উল্লেখ করা হয়নি তা হ'ল CURLOPT_POSTFIELDSনেস্টেড অ্যারেগুলি পরিচালনা করতে পারে না।

যদি আমরা নেস্টেড অ্যারেটি নিই ['a' => 1, 'b' => [2, 3, 4]]তবে এটিকে প্যারামিটারাইজ করা উচিত a=1&b[]=2&b[]=3&b[]=4( [এবং ]ইউআরএল এনকোড হওয়া উচিত)। এটি অন্য প্রান্তের নেস্টেড অ্যারেতে স্বয়ংক্রিয়ভাবে ফিরে রূপান্তরিত হবে (ধরে নিলে অন্য প্রান্তটিও পিএইচপি হয়)।

এটি কাজ করবে:

var_dump(http_build_query(['a' => 1, 'b' => [2, 3, 4]]));
// output: string(36) "a=1&b%5B0%5D=2&b%5B1%5D=3&b%5B2%5D=4"

এটি কাজ করবে না:

curl_setopt($ch, CURLOPT_POSTFIELDS, ['a' => 1, 'b' => [2, 3, 4]]);

এটি আপনাকে একটি বিজ্ঞপ্তি দেবে। কোড সম্পাদন অব্যাহত থাকবে এবং আপনার শেষ পয়েন্টটি bস্ট্রিং হিসাবে প্যারামিটার গ্রহণ করবে "Array":

পিএইচপি বিজ্ঞপ্তি: স্ট্রিং রূপান্তর এ অ্যারে ... লাইনে ...


5

এটি নির্ভর করে content-type

url- এনকোডড বা মাল্টিপার্ট / ফর্ম-ডেটা

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

এই প্যারামিটারটি হয় 'প্যারা 1 = ভাল 1 এবং প্যারা 2 = ভাল 2 এবং ...' এর মতো urlencoded স্ট্রিং হিসাবে বা ক্ষেত্রের নাম হিসাবে কী এবং ক্ষেত্রের ডেটা হিসাবে মান হিসাবে একটি অ্যারে হিসাবে পাস হতে পারে। মানটি যদি একটি অ্যারে হয় তবে সামগ্রী-প্রকারের শিরোনামটি মাল্টিপার্ট / ফর্ম-ডেটাতে সেট করা হবে।

JSON এনকোডিং

নিঃসন্দেহে, JSON এপিআইয়ের সাথে যোগাযোগ করার সময়, সামগ্রীটি অবশ্যই আমাদের পোস্টের ডেটা বোঝার জন্য এপিআইয়ের জন্য জেএসএন এনকোডেড থাকতে হবে।

এই জাতীয় ক্ষেত্রে, লিখিত সামগ্রী অবশ্যই JSON হিসাবে স্পষ্টভাবে এনকোড করা উচিত:

CURLOPT_POSTFIELDS => json_encode(['param1' => $param1, 'param2' => $param2]),

যখন তাদেরকে JSON মধ্যে যোগাযোগ, আমরা সাধারণত সেট acceptএবং content-typeহেডার তদনুসারে:

CURLOPT_HTTPHEADER => [
    'accept: application/json',
    'content-type: application/json'
]


0

মজার বিষয় পোস্টম্যান পোষ্টটি যেভাবে করেন এই 2 অতিরিক্ত বিকল্পের সাথে একটি সম্পূর্ণ জিইটি অপারেশন:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, '');

আর একটি উপায়, এবং এটি খুব ভাল কাজ করে।


-3

এই উত্তরটি আমাকে চিরকালের জন্যও খুঁজে পেতেছিল। আমি আবিষ্কার করেছি যে আপনাকে যা করতে হবে তা হ'ল ইউআরএল-এনকোডযুক্ত ক্যোরিয় স্ট্রিংয়ের সাথে ইউআরএল ('ফাইলের নাম এবং এক্সটেনশনের পরে?') একত্রিত করতে হবে। এমনকি আপনার পোষ্ট সিআরএল বিকল্পগুলি সেট করতে হবে বলে মনে হচ্ছে না। নীচে জাল উদাহরণ দেখুন:

//create URL
$exampleURL = 'http://www.example.com/example.php?';

// create curl resource
$ch = curl_init(); 

// build URL-encoded query string
$data = http_build_query(
    array('first' => 'John', 'last' => 'Smith', '&'); // set url
curl_setopt($ch, CURLOPT_URL, $exampleURL . $data); 

// return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// $output contains the output string
$output = curl_exec($ch); 

// close curl resource to free up system resources <br/>
curl_close($ch);

আপনি এটি ব্যবহার করতে পারেন file_get_contents():

// read entire webpage file into a string
$output = file_get_contents($exampleURL . $data);

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