2009-08-04 14 views
63

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

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

मैं क्या याद आ रही है:

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

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

+3

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

+8

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

उत्तर

28

हल: समस्या यहाँ निहित है:

मैं दोनों _CUSTOMREQUEST और _POST के माध्यम से POST सेट और _CUSTOMREQUESTPOST के रूप में कायम है, जबकि _POST_HTTPGET करने लगे। सर्वर सही होने की _CUSTOMREQUEST से हैडर ग्रहण किया और एक 411.

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

सुनिश्चित करें कि आप एक जीईटी अनुरोध करते समय अपने यूआरएल के अंत में अपनी क्वेरी स्ट्रिंग डाल रहे हैं। (अतिरिक्त बल) CURLOPT_HTTPGET के लिए curl_setopt() docs से

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

// Set query data here with the 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); 
$content = trim(curl_exec($ch)); 
curl_close($ch); 
print $content; 
 
With a POST you pass the data via the CURLOPT_POSTFIELDS option instead 
of passing it in the 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); 

// Set request method to POST 
curl_setopt($ch, CURLOPT_POST, 1); 

// Set query data here with CURLOPT_POSTFIELDS 
curl_setopt($ch, CURLOPT_POSTFIELDS, $qry_str); 

$content = trim(curl_exec($ch)); 
curl_close($ch); 
print $content; 

नोट:

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

+0

यह 51 सेकंड का टाइमआउट सेट करने का एक बहुत बुरा तरीका है! –

+0

अच्छा पकड़ @ जैकगोसेन! –

39

साथ वापस आ गया curl_exec बुला ($ curl_handle) डिफ़ॉल्ट रूप से

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

कर्ल अनुरोध करने से पहले इस जोड़े मिलता है, आप है GET CURL अनुरोध करने के लिए कोई विकल्प सेट करने की आवश्यकता नहीं है।

+0

इस तरह से इस तरह से नहीं ... कर्ल स्वचालित रूप से पोस्ट करने की कोशिश कर रहा है। –

संबंधित मुद्दे