क्या मुझे POST डेटा URL-एनकोड करना चाहिए?


122

मैं डेटा को बाहरी API (PHP का उपयोग करके, यदि यह प्रासंगिक है) पोस्ट कर रहा हूँ।

क्या मुझे अपने द्वारा पारित POST चर को URL-एनकोड करना चाहिए?

या क्या मुझे केवल GET डेटा को URL-एनकोड करने की आवश्यकता है?

धन्यवाद!

अद्यतन: यह मेरी PHP है, अगर यह प्रासंगिक है:

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>urlencode($_POST["username"]),
    'password'=>urlencode($_POST["password"]),
    'latitude'=>urlencode($_POST["latitude"]),
    'longitude'=>urlencode($_POST["longitude"]),
    'datetime'=>urlencode($_POST["datetime"]),
    'category'=>urlencode($_POST["category"]),
    'metacategory'=>urlencode($_POST["metacategory"]),
    'caption'=>($_POST["description"])
);
$fields_string = http_build_query($fields);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);

1
यह संदर्भ के लिए एपीआई है: cyclestreets.net/api - यह निर्दिष्ट नहीं करता है कि यह क्या उम्मीद करता है।
रिचर्ड

जवाबों:


136

सामान्य उत्तर

आपके प्रश्न का सामान्य उत्तर यह है कि यह निर्भर करता है। और आप HTTP हेडर में अपने "कंटेंट-टाइप" को निर्दिष्ट करके निर्णय लेते हैं।

"एप्लिकेशन / x-www-form-urlencoded" के मान का अर्थ है कि आपके POST बॉडी को GET पैरामीटर स्ट्रिंग की तरह URL एनकोडेड होना चाहिए। "मल्टीपार्ट / फॉर्म-डेटा" के मूल्य का मतलब है कि आप सामग्री का उपयोग कर रहे हैं और सामग्री को एन्कोडिंग नहीं करना चाहिए।

यदि आप अधिक जानकारी चाहते हैं तो इस उत्तर में बहुत अधिक गहन व्याख्या है


विशिष्ट उत्तर

आपके द्वारा उपयोग किए जा रहे PHP लाइब्रेरीज़ (CURL) के लिए विशिष्ट उत्तर के लिए, आपको यहाँ प्रलेखन पढ़ना चाहिए ।

यहाँ प्रासंगिक जानकारी है:

CURLOPT_POST

नियमित रूप से HTTP POST करने की कोशिश करें। यह POST सामान्य अनुप्रयोग / x-www-form-urlencoded प्रकार है, जो आमतौर पर HTML रूपों द्वारा उपयोग किया जाता है।

CURLOPT_POSTFIELDS

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


9

@DougW ने स्पष्ट रूप से इस प्रश्न का उत्तर दिया है, लेकिन मैं अभी भी डौग के बिंदुओं को समझाने के लिए कुछ कोड जोड़ना चाहता हूं। (और उपरोक्त कोड में सही त्रुटियां)

समाधान 1: सामग्री-प्रकार के हेडर के साथ POST डेटा को URL-एनकोड करें: एप्लिकेशन / x-www-form-urlencoded।

नोट: आपको $ _POST [] फ़ील्ड्स को एक-एक करके urlencode करने की आवश्यकता नहीं है, http_build_query () फ़ंक्शन urlencoding कार्य को अच्छी तरह से कर सकता है।

$fields = array(
    'mediaupload'=>$file_field,
    'username'=>$_POST["username"],
    'password'=>$_POST["password"],
    'latitude'=>$_POST["latitude"],
    'longitude'=>$_POST["longitude"],
    'datetime'=>$_POST["datetime"],
    'category'=>$_POST["category"],
    'metacategory'=>$_POST["metacategory"],
    'caption'=>$_POST["description"]
);

$fields_string = http_build_query($fields);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);

समाधान 2: सरणी को सीधे URL-एन्कोडिंग के बिना पोस्ट डेटा के रूप में पास करें, जबकि सामग्री-प्रकार हेडर को मल्टीपार्ट / फॉर्म-डेटा पर सेट किया जाएगा।

$fields = array(
        'mediaupload'=>$file_field,
        'username'=>$_POST["username"],
        'password'=>$_POST["password"],
        'latitude'=>$_POST["latitude"],
        'longitude'=>$_POST["longitude"],
        'datetime'=>$_POST["datetime"],
        'category'=>$_POST["category"],
        'metacategory'=>$_POST["metacategory"],
        'caption'=>$_POST["description"]
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST,1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);

दोनों कोड स्निपेट्स काम करते हैं, लेकिन विभिन्न HTTP हेडर और बॉडी का उपयोग करते हैं।


2

कर्ल आपके लिए डेटा को एन्कोड करेगा, बस अपने कच्चे फ़ील्ड डेटा को फ़ील्ड सरणी में छोड़ दें और इसे "गो" को बताएं।


1
मैंने php कर्ल स्क्रिप्ट को ठीक करने के लिए घंटों बिताए जहाँ लक्ष्य ASP वेबपृष्ठ मुझे कर्ल पोस्ट डेटा भेजने के बाद एक त्रुटि पृष्ठ पर पुनः निर्देशित कर रहा है और मैं यह पता लगाने में असमर्थ था कि क्यों। फिर पोस्ट डेटा को url एन्कोडिंग करने के बाद, यह काम किया और मुझे मेरा अपेक्षित परिणाम मिलना शुरू हो गया।
रॉबी

1
ऐसा लगता है कि यह सरणी है, तो यह कर्ल द्वारा स्वचालित रूप से urlencoded होगा। यदि इसे स्ट्रिंग के रूप में पारित किया जाता है, तो हमें पहले urlencode करने की आवश्यकता है।
रॉबी

2

उपरोक्त पोस्ट URL एन्कोडिंग और यह कैसे काम करता है, से संबंधित प्रश्नों के उत्तर देता है, लेकिन मूल प्रश्न "क्या मुझे POST डेटा URL-एनकोड करना चाहिए?" जिसका उत्तर नहीं है।

URL एनकोडिंग के साथ अपने हाल के अनुभव से, मैं इस प्रश्न को और आगे बढ़ाना चाहूंगा। "क्या मुझे पीएसटी डेटा को यूआरएल-एनकोड करना चाहिए, जो कि जीईटी एचटीटीपी विधि के समान है। आम तौर पर, यदि कोई जानकारी भर दी जाती है, तो ब्राउजर पर HTML फॉर्म भर जाता है, और कुछ जानकारी प्राप्त कर लेता है, ब्राउजर URL एनकोडिंग कर देगा, लेकिन यदि कोई एप्लिकेशन वेब-सेवा को उजागर करता है और उम्मीद करता है डेटा पर URL-एन्कोडिंग करने के लिए उपभोक्ता, क्या यह आर्किटेक्चर और तकनीकी रूप से POST HTTP विधि से URL एनकोड करने के लिए सही है? "

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.