PHP CURL में POST से GET में कैसे स्विच करें


83

मैंने पिछले पोस्ट अनुरोध से प्राप्त अनुरोध पर स्विच करने का प्रयास किया है। जो इसके गेट हो जाता है, लेकिन अंततः एक पोस्ट करता है।

मैंने PHP में निम्नलिखित की कोशिश की:

curl_setopt($curl_handle, CURLOPT_POSTFIELDS, null);
curl_setopt($curl_handle, CURLOPT_POST, FALSE);
curl_setopt($curl_handle, CURLOPT_HTTPGET, TRUE);

मैं क्या खो रहा हूँ?

अतिरिक्त जानकारी: मेरे पास पहले से ही एक कनेक्शन है जो एक POST अनुरोध करने के लिए सेटअप है। यह सफलतापूर्वक पूरा हो जाता है, लेकिन बाद में जब मैं कनेक्शन का पुन: उपयोग करने की कोशिश करता हूं और इसके बाद के सेटटॉप्स का उपयोग करके जीईटी को वापस स्विच करता हूं, तब भी यह अधूरा POST हेडर के साथ आंतरिक रूप से POST करता है। समस्या यह है कि यह एक GET कर रहा है पर विश्वास करता है, लेकिन सामग्री-लंबाई पैरामीटर के बिना एक POST हेडर डालना समाप्त करता है और कनेक्शन 411 ERROR witha विफल रहता है।


3
अनुरोध प्राप्त करें के साथ सावधान रहें। Google उनके साथ मज़े करता है। ;)
NotMe

10
@ क्रिस - एक दोस्त ने पाया कि जब उसने एक साइट का निर्माण किया था, जो कि जीईटी अनुरोधों के माध्यम से उपयोगकर्ता द्वारा योगदान की गई सामग्री को बनाने में कठिन थी। Googlebot ने पूर्वानुमानित परिणामों के साथ सभी 'डिलीट' लिंक का खुशी-खुशी पालन किया।
मेरेडिथ एल पैटरसन

जवाबों:


109

सुनिश्चित करें कि आप GET अनुरोध करते समय अपने क्वेरी स्ट्रिंग को अपने URL के अंत में रख रहे हैं।

$ qry_str = "; x = 10 & y = 20";
$ ch = curl_init ();

// यहाँ URL के साथ क्वेरी डेटा सेट करें
curl_setopt ($ ch, CURLOPT_URL, 'http://example.com/test.php'। $ qry_str); 

curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ ch, CURLOPT_TIMEOUT, 3);
$ सामग्री = ट्रिम (curl_exec ($ ch));
curl_close ($ ch);
$ सामग्री प्रिंट करें;
एक POST के साथ आप इसके बजाय CURLOPT_POSTFIELDS विकल्प के माध्यम से डेटा पास करते हैं 
इसे CURLOPT__URL में पास करना।
-------------------------------------------------- -----------------------

$ qry_str = "x = 10 & y = 20";
curl_setopt ($ ch, CURLOPT_URL, 'http://example.com/test.php');  
curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ ch, CURLOPT_TIMEOUT, 3);

// POST के लिए अनुरोध विधि सेट करें
curl_setopt ($ ch, CURLOPT_POST, 1);

// CURLOPT_POSTFIELDS के साथ यहां क्वेरी डेटा सेट करें
curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ qry_str);

$ सामग्री = ट्रिम (curl_exec ($ ch));
curl_close ($ ch);
$ सामग्री प्रिंट करें;

(जोर दिया) के लिए curl_setopt()डॉक्स से नोट करें CURLOPT_HTTPGET:

[ GET को HTTP अनुरोध विधि को रीसेटTRUE करने के लिए CURLOPT_HTTPGET के बराबर सेट करें] । चूंकि GET डिफ़ॉल्ट है, यह केवल तभी आवश्यक है जब अनुरोध विधि को बदल दिया गया हो।


3
51 सेकंड के टाइमआउट को सेट करने के लिए यह एक बहुत बुरा तरीका है!
जैक गूसेन

@JackGoossen को अच्छा कैच!
आरसी।

55

Curl_exec ($ curl_handle) कॉल करने से पहले इसे जोड़ें

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET');

39

हल: समस्या यहाँ है:

मैं सेट POSTदोनों के माध्यम से _CUSTOMREQUESTऔर _POSTऔर _CUSTOMREQUESTके रूप में कायम POSTहै, जबकि _POSTपर स्विच किया _HTTPGET। सर्वर ने हेडर _CUSTOMREQUESTको सही माना और 411 के साथ वापस आ गया।

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'POST');

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