2012-04-30 11 views
8

Ive से अलग शरीर एक एक कोडकर्ल अनुरोध - एक हैडर

$ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HEADER, 1);   
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
    $ret = curl_exec($ch); 
    $responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 

मिला अब मैं हेडर के बिना $ सेवानिवृत्त से शरीर को निकालने के लिए चाहते हैं। कोई विचार यह कैसे करना है?

उत्तर

18

कैसे इस बारे में:

list($headers, $content) = explode("\r\n\r\n", $ret, 2); 

... जो आप $ सामग्री चर में अपने अनुरोध की शरीर देना चाहिए?

+8

यह HTTP/1.1 में विफल रहता है। 100 शीर्षलेख मौजूद हैं। – sivann

+5

आप 'curl_setopt ($ ch, CURLOPT_HTTPHEADER, सरणी (' अपेक्षा: ') के साथ जारी-शीर्षलेख को हटा सकते हैं); '। –

+3

यह तब भी अमान्य है जब CURLOPT_FOLLOWLOCATION का उपयोग किया जाता है और 301 या 302 रीडायरेक्ट वाला पता प्राप्त किया जाता है। –

32

raina77ow की प्रतिक्रिया अच्छी है। टिप्पणियों से ऐसा लगता है कि ऐसी कुछ स्थितियां हैं जो "विस्फोट" को काम नहीं करने का कारण बनती हैं। मुझे एक ऐसा तरीका मिला जो मेरे लिए बेहतर काम करता है और सोचा कि मैं साझा करूंगा।

curl_getinfo ($ ch, CURLINFO_HEADER_SIZE) को कॉल करके आप प्रतिक्रिया शीर्षलेख की लंबाई प्राप्त कर सकते हैं। तो मैंने निम्नलिखित किया:

// Original Code 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1);   
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
$ret = curl_exec($ch); 
$responseCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

// Added Code 
$header_len = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
$header = substr($ret, 0, $header_len); 
$body = substr($ret, $header_len); 

// Back to Original Code 
curl_close($ch); 

यह मेरे लिए बहुत अच्छा काम कर रहा है। मुझे आशा है कि यह किसी और की मदद करेगा।

+0

सही काम कर रहा है! – BornToDrink

+0

ऐसा लगता है कि 'CURLOPT_BINARYTRANSFER' अब और कुछ नहीं करता है। [यह SO सवाल देखें] (http://stackoverflow.com/questions/6007363/what-does-curlopt-binarytranfer-exactly-mean) – jxmallett

+0

सही उत्तर ... आखिर में मुझे उन बुरी स्क्रिप्ट से बचाया गया है जो अभी विभाजित हैं '\ n \ n' – leedch

1

this thread में @Geoffrey उत्कृष्ट जवाब पर रेखाचित्र ...

इस सूत्र की पेशकश की अन्य समाधान के कुछ नहीं इस सही ढंग से कर रहे हैं। जब CURLOPT_FOLLOWLOCATION या जब सर्वर एक 100 कोड के साथ प्रतिक्रिया पर है \r\n\r\n पर

  • विभाजन विश्वसनीय नहीं है।
  • CURLINFO_HEADER_SIZE के माध्यम से हेडर के आकार का पता लगाना हमेशा विश्वसनीय नहीं होता है, खासकर जब प्रॉक्सी का उपयोग किया जाता है या कुछ पुनर्निर्देशन परिदृश्यों में होता है।

हेडर प्राप्त करने का सबसे विश्वसनीय तरीका CURLOPT_HEADERFUNCTION का उपयोग कर रहा है। फिर आप curl_setopt($ch, CURLOPT_HEADER, 1); हटा सकते हैं और आपका शरीर कोई हेडर नहीं रखेगा।

यहां PHP बंद करने का उपयोग करके इसे करने का एक बहुत ही साफ तरीका है। यह सर्वर और HTTP संस्करणों में लगातार हैंडलिंग के लिए सभी शीर्षकों को लोअरकेस में परिवर्तित करता है।

$ch = curl_init(); 
$headers = []; 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// Run the following function for each header received 
// Note: Does NOT handle multiple instances of the same header. Later one will overwrite. 
//  Consider handling that scenario if you need it. 
curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $header) use (&$headers) { 
    $len = strlen($header); 
    $header = explode(':', $header, 2); 
    if (count($header) >= 2) 
     $headers[strtolower(trim($header[0]))] = trim($header[1]); 
    return $len; 
}); 

$data = curl_exec($ch); 
print_r($headers); 
+1

द्वारा यह एक टिप्पणी होनी चाहिए, जवाब नहीं। यदि यह एक डुप्लिकेट प्रश्न है, [बंद करने के लिए वोट दें] (http://stackoverflow.com/help/privileges/close-questions) जैसे। यदि नहीं, तो इस विशिष्ट प्रश्न का उत्तर तैयार करें। –