2012-02-05 11 views
10

मैं PHP curl के माध्यम से किसी साइट पर लॉगिन करने का प्रयास कर रहा हूं और मुझे केवल "खराब अनुरोध" प्रतिक्रियाएं मिल रही हैं।PHP कर्ल सामग्री-लंबाई और सामग्री-प्रकार गलत

मैं मेजबान फ़ाइल के साथ चारों ओर खेला और अपने सर्वर पर सेट करें जो अनुरोध अपने ब्राउज़र हेडर भेजता है की जाँच करें और cURL द्वारा भेजे गए अनुरोध हेडर से तुलना करने में।

सब कुछ बराबर है, के अलावा:

ब्राउज़र:

Content-Type: application/x-www-form-urlencoded 
Content-Length: 51 

पीएचपी cURL:

Content-Length: 51, 359 
Content-Type: application/x-www-form-urlencoded; boundary=----------------------------5a377b7e6ba7 

मैं पहले से ही इस आदेश के साथ सेट करें कि मान, लेकिन यह अभी भी गलत हेडर भेजता है :

curl_setopt($this->hCurl, CURLOPT_HTTPHEADER, array(
    'Expect:', 
    'Content-Type: application/x-www-form-urlencoded', 
    'Content-Length: 51' 
)); 

उत्तर

31

आपको सामग्री-लंबाई स्वयं को सेट करने की आवश्यकता नहीं है। यदि आप एक HTTP पोस्ट भेजने के लिए curl का उपयोग करते हैं, तो यह आपके लिए सामग्री की लंबाई की गणना करेगा।

यदि आप CURLOPT_POSTFIELDS मान को सरणी के रूप में सेट करते हैं, तो यह स्वचालित रूप से multipart/form-data के रूप में अनुरोध सबमिट करेगा और सीमा का उपयोग करेगा। यदि आप एक स्ट्रिंग पास करते हैं, तो यह application/x-www-form-urlencoded का उपयोग करेगा, इसलिए सुनिश्चित करें कि आप urlencoded स्ट्रिंग को CURLOPT_POSTFIELDS पर पास करें और एक सरणी नहीं है क्योंकि आप फॉर्म-urlencoded चाहते हैं।

आप की जरूरत है ऐसा करने के लिए किया जा:

$data = 'name=' . urlencode($value) . '&name2=' . urlencode($value2); 
curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $data); 

// NOT 

$dataArray = array('name' => 'value', 'name2' => 'value2'); 
curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $dataArray); 

या तो मामले में, आप सामग्री की लंबाई निर्धारित करने की आवश्यकता नहीं है, लेकिन आप पहली विधि का उपयोग करने के लिए फार्म पर application/x-www-form-urlencoded एन्कोडिंग निकलना है।

अगर वह मदद नहीं करता है, सभी कोड कर्ल अनुरोध, स्थापित करने के लिए प्रासंगिक पोस्ट (सभी विकल्प, और डेटा आप इसे करने के गुजर रहे हैं) और कहा कि समस्या का समाधान में मदद मिलेगी।

संपादित करें:

जोड़ा एक उदाहरण मैं (मैं लॉगिन विफल हो) कि काम करता है के साथ आया है।

<?php 

$URL_HOME = 'http://ilocalis.com/'; 
$LOGIN_URL = 'https://ilocalis.com/login.php'; 

$ch = curl_init($URL_HOME); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

$home = curl_exec($ch); 

//echo $home; 

$post = array('username' => 'drew', 'password' => 'testing 123'); 
$query = http_build_query($post); 

curl_setopt($ch, CURLOPT_URL, $LOGIN_URL); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $query); 

$login = curl_exec($ch); 

echo $login; 
+1

आपकी टिप्पणी के लिए धन्यवाद, मुझे नहीं पता था कि एक सरणी पास करने और स्ट्रिंग को पार करने के बीच एक अंतर है। लेकिन http_build_query ($ सरणी) भी काम करना चाहिए, है ना? वैसे भी - दुर्भाग्यवश, यह या तो काम नहीं किया। जब मैं सामग्री-लंबाई स्वयं निर्दिष्ट नहीं करता हूं, तो पृष्ठ "HTTP त्रुटि 411 लंबाई आवश्यक" त्रुटि लौटा रहा है। मैं http://ilocalis.com/ पर लॉग इन करने का प्रयास कर रहा हूं (https://ilocalis.com/login.php पर पोस्ट करना) - यदि आप इसे स्वयं आज़माएं, तो आपको खाते की आवश्यकता नहीं है क्योंकि मैं भी पृष्ठ लोड करने के उस बिंदु पर न आएं और जांच करें कि दिए गए प्रमाण-पत्र सही थे या नहीं ... धन्यवाद! – Simon

+0

चूंकि सामग्री की लंबाई सेट नहीं की गई थी, इसलिए मुझे आश्चर्य है कि अनुरोध विधि पोस्ट नहीं है, या शायद कुछ अन्य विकल्प उस पर ओवरराइड कर रहा है। किसी भी मामले में, मैंने एक कामकाजी उदाहरण के साथ पोस्ट को अद्यतन किया। उम्मीद है कि यह आपको सही रास्ते पर ले जाएगा। यह 2 अलग-अलग अनुरोध करने के लिए 1 कर्ल ऑब्जेक्ट का उपयोग करता है। नोट, यदि आपको फिर से एक GET क्वेरी बनाने की आवश्यकता है, तो आपको CURLOPT_POST को 0 – drew010

+0

पर सेट करना होगा। आप। इसलिए। बहुत। मैंने पेड़ों के लिए जंगल नहीं देखा। मैंने curlopt_customrequest को "POST" पर सेट किया क्योंकि मैं curlopt_postfields में एक सरणी पास करता था ..... जैसा कि आपने पहले ही उल्लेख किया है, एक स्ट्रिंग का उपयोग करने के साथ इसे काम करना चाहिए, लेकिन मैं गोपनीय रूप से कस्टम चीज को हटाने के लिए भूल गया .. यह छोटी चीजें हैं जो सनकी हमारे प्रोग्रामर से बाहर निकलते हैं जब हमें नहीं मिलता कि यह क्यों काम नहीं करेगा ..;) – Simon