CURLOPT_POSTFIELDS के लिए कर्ल POST प्रारूप


99

मैं का उपयोग करते हैं 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)बाद से आप इसका उपयोग कर सकते हैं &
अशक्तता

6
बेशक आप उन्हें छोड़ सकते हैं। यह आपकी विशिष्ट आवश्यकताओं के अनुरूप अन्य दो तर्कों का वर्णन करने के लिए है जिन्हें आप बदल सकते हैं (या नहीं कर सकते हैं) (डिफ़ॉल्ट विभाजक)।
कोडेअर्ट

62

संपादित करें : php5 से ऊपर की ओर, के उपयोग की 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
*/

?>

php5 से पहले:

से मैनुअल :

CURLOPT_POSTFIELDS

HTTP "POST" ऑपरेशन में पोस्ट करने के लिए पूरा डेटा। एक फ़ाइल पोस्ट करने के लिए, @ के साथ एक फ़ाइल नाम प्रीपेन्ड करें और पूर्ण पथ का उपयोग करें। प्रारूप में प्रकार के साथ फ़ाइल नाम का अनुसरण करके फ़िलेपाइप को स्पष्ट रूप से निर्दिष्ट किया जा सकता है। यह पैरामीटर या तो 'para1 = val1 & para2 = val2 & ...' जैसे urlencoded string के रूप में पारित किया जा सकता है या मान के रूप में कुंजी और फ़ील्ड डेटा के रूप में फ़ील्ड नाम के साथ एक सरणी के रूप में। यदि मान एक सरणी है, तो सामग्री-प्रकार हेडर को मल्टीपार्ट / फॉर्म-डेटा पर सेट किया जाएगा। PHP 5.2.0 के रूप में, @ उपसर्ग के साथ इस विकल्प को पास की गई फाइलें काम करने के लिए एरे फॉर्म में होनी चाहिए।

तो इस तरह से कुछ पूरी तरह से काम करना चाहिए (एक साहचर्य सरणी में पारित मापदंडों के साथ):

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

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

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

11
यदि आप एक सरणी पास कर सकते हैं तो आप एक स्ट्रिंग पास क्यों करेंगे ...?
ThiefMaster

1
मुझे लगता है कि $ कुंजी को भी एन्कोड किया जाना चाहिए, बस अगर आपके पास यह "नाम और उपनाम" आदि की तरह है, खासकर यदि डेटा अंतिम उपयोगकर्ता द्वारा दिया गया है
Marius Balčytis

2
@ हार्बर, मैं आपसे सहमत हूं। और मुझे लगता है कि http_build_query () वास्तव में ऊपर परिभाषित फ़ंक्शन से बेहतर है।
आकाशी

1
@skyfree मैं सहमत हूँ! उस फ़ंक्शन को php5 में जोड़ा गया था, जो 2011 में मानक से बहुत दूर था।
Czechnology

1
जब आप सिर्फ सरणी पास कर सकते हैं तो http_build_query की आवश्यकता क्यों है?
ऑफेंसो

39

एक तार पास मत करो!

आप एक सरणी पास कर सकते हैं और php / कर्ल को एन्कोडिंग आदि का गंदा काम करने दे सकते हैं।


16
एक सरणी पास करना एक स्ट्रिंग की तुलना में एक अलग सामग्री-प्रकार होगा, इसलिए ऐसा करने का एक अच्छा कारण है। मुझे यह पता लगाने में थोड़ा समय लगा।
थॉमस वेंडर स्टिचेले

मुझे पता नहीं क्यों, लेकिन मुझे लगता है कि मेरी जीत देव पीसी पर एक सरणी के बारे में एक दूसरी लंबी (1.029s सरणी बनाम 0.016 का उपयोग करके http_build_query()उसी सरणी का उपयोग करते हुए)
लेता है

2
नेस्टेड सरणियाँ काम नहीं करेंगी। CURL उन्हें स्ट्रिंग में बदलने का प्रयास करेगा और PHP Array से स्ट्रिंग रूपांतरण सूचना का पालन करेगा
7ochem


4

इसके लिए CURLOPT_POSTFIELDS, पैरामीटर या तो urlencoded string के 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);

2
हाय श्रद्धा, json_encode()आपको एक मान्य पैरामीटर स्ट्रिंग के रूप में वास्तव में कुछ अलग देगा first=John&last=Smithjson_encode()उत्पादन होगा: {"first":"John","last":"Smith"}जो तब आपके POST अनुरोध का कच्चा शरीर बन जाएगा।
7 गान

1
जब तक प्राप्तकर्ता उम्मीद कर रही है: @ 7ochem की टिप्पणी को जोड़ने के लिए एक json एन्कोड स्ट्रिंग वाली एक एकल पैरामीटर के बजाय, json_encode(...)करते हैं http_build_query(...)। यह अपेक्षित "url- एन्कोडेड स्ट्रिंग" बनाएगा जिसमें "और" द्वारा अलग किए गए पैरामीटर होंगे।
टूलमेकरसेव

4

एक अन्य प्रमुख अंतर जो अभी तक यहां वर्णित नहीं है, CURLOPT_POSTFIELDSवह है नेस्टेड सरणियों को संभालना नहीं।

यदि हम नेस्टेड सरणी लेते हैं ['a' => 1, 'b' => [2, 3, 4]] तो इस रूप में parameterized जा किया जाना चाहिए a=1&b[]=2&b[]=3&b[]=4( [और ]URL होगा / होना चाहिए इनकोडिंग)। यह स्वचालित रूप से दूसरे छोर पर एक नेस्टेड सरणी में परिवर्तित हो जाएगा (यहाँ दूसरा छोर भी PHP है)।

यह काम करेगा:

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" :

PHP सूचना: पंक्ति में स्ट्रिंग रूपांतरण में सरणी ...


4

यह पर निर्भर करता है content-type

url- एन्कोडेड या मल्टीपार्ट / फॉर्म-डेटा

डेटा को मानक तरीके से भेजने के लिए, जैसा कि एक ब्राउज़र एक फार्म के साथ होगा, बस एक साहचर्य सरणी पास करें । जैसा कि PHP के मैनुअल ने कहा है:

यह पैरामीटर या तो 'para1 = val1 & para2 = val2 & ...' जैसे urlencoded string के रूप में पारित किया जा सकता है या मान के रूप में कुंजी और फ़ील्ड डेटा के रूप में फ़ील्ड नाम के साथ एक सरणी के रूप में। यदि मान एक सरणी है, तो सामग्री-प्रकार हेडर को मल्टीपार्ट / फॉर्म-डेटा पर सेट किया जाएगा।

JSON एन्कोडिंग

कभी-कभी, JSON API के साथ संचार करते समय, सामग्री हमारे JST डेटा को समझने के लिए API के लिए JSON एन्कोडेड होनी चाहिए।

ऐसे मामलों में, सामग्री को JSON के रूप में स्पष्ट रूप से एन्कोड किया जाना चाहिए:

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

जब JSON में संचार करते हैं, तो हम आमतौर पर सेट करते हैं acceptऔर content-typeतदनुसार हेडर करते हैं:

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


0

दिलचस्प बात यह है कि पोस्टमैन जिस तरह से POST करता है वह इन 2 अतिरिक्त विकल्पों के साथ एक पूर्ण GET ऑपरेशन है:

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

बस एक और तरीका है, और यह बहुत अच्छी तरह से काम करता है।


-3

इस जवाब ने मुझे हमेशा के लिए ढूंढ लिया। मुझे पता चला कि आपको केवल URL-एन्कोडेड क्वेरी स्ट्रिंग के साथ URL ('?' फ़ाइल नाम और एक्सटेंशन के बाद) को संक्षिप्त करना है। यह भी नहीं लगता है कि आपको POST cURL विकल्प सेट करना है। नीचे दिए गए नकली उदाहरण देखें:

//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
ऐसा लगता है कि आप POST के बजाय GET कर रहे हैं।
ग्रैंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.