curl

2013-06-27 8 views
6

में डेटा-बाइनरी पैरामीटर मुझे php में curl के माध्यम से डेटा-बाइनरी पैरामीटर भेजना होगा।
यह आदेश है: curl -D - -u user:password -X PUT -H "Content-Type: text/plain" --data-binary "data-id=2010-10-01_15-15-53" https://someurl। कंसोल में यह काम करता है, अब मुझे इसे php में करना है।curl

इस कोड को मेरे पास है:

$this->_curl = curl_init(); 
    curl_setopt($this->_curl, CURLOPT_USERPWD, $this->_loginUser . ":" . $this->_loginPassword); 
    curl_setopt($this->_curl, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($this->_curl, CURLOPT_HEADER, 1); 
    curl_setopt($this->_curl, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($this->_curl, CURLOPT_TIMEOUT, 30); 
    curl_setopt($this->_curl, CURLOPT_URL, $this->_serviceUrl);//https://someurl 
    curl_setopt($this->_curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain')); 
    curl_setopt($this->_curl, CURLOPT_CUSTOMREQUEST, 'PUT'); 
    curl_setopt($this->_curl, CURLOPT_POSTFIELDS, array('data-id' => $dataId));//d'2010-10-01_15-15-53' 

    $response = curl_exec($this->_curl); 
    //$response = HTTP/1.1 201 Created 
    curl_close($this->_curl); 

कॉल सर्वर द्वारा स्वीकार किया जाता है, लेकिन यह डेटा-आईडी पैरामीटर को नहीं पहचानता है:

कोई डेटा-आईडी ट्रिगर में परिभाषित संपत्ति 2010-10-01_15-15-53

कोई विचार जो मुझे याद आ रहा है?

+0

आप इस समझ से बाहर था> ? – NCoder

+0

@NCoder nope :( – OSdave

+0

मुझे लगता है कि यह surescripts एकीकरण के लिए है। क्या आपके पास CURL/PHP के साथ मूल अनुरोध भेजने और प्राप्त करने के लिए उनके साथ मूल कनेक्शन सेटअप है? – NCoder

उत्तर

4

आप करने के लिए अपने स्ट्रिंग बदलने की आवश्यकता स्ट्रीम पहले

आप इसे कोड के इस टुकड़े से बस कर सकते हैं।

$YourString = 'data-id=2010-10-01_15-15-53'; 
$stream = fopen('php://memory','r+'); 
fwrite($stream, $YourString); 
$dataLength = ftell($stream); 
rewind($stream); 

फिर अपनी स्ट्रीम रखने के बाद, आप इसे कर्ल का उपयोग करके भेज सकते हैं।

$curl = curl_init(); 
curl_setopt_array($curl, 
     array(CURLOPT_CUSTOMREQUEST => 'PUT' 
     , CURLOPT_URL => 'https://someurl' 
     , CURLOPT_HTTPHEADER => array(
      'Content-Type: text/plain' 
     ) 
     , CURLOPT_RETURNTRANSFER => 1      // means output will be a return value from curl_exec() instead of simply echoed 
     , CURLOPT_TIMEOUT => 15       // max seconds to wait 
     , CURLOPT_FOLLOWLOCATION => 0      // don't follow any Location headers, use only the CURLOPT_URL, this is for security 
     , CURLOPT_FAILONERROR => 0      // do not fail verbosely fi the http_code is an error, this is for security 
     , CURLOPT_SSL_VERIFYPEER => 1      // do verify the SSL of CURLOPT_URL, this is for security 
     , CURLOPT_VERBOSE => 0       // don't output verbosely to stderr, this is for security 
     , CURLOPT_INFILE => $stream 
     , CURLOPT_INFILESIZE => $dataLength 
     , CURLOPT_UPLOAD => 1 
     )); 

$response = curl_exec($curl); 
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
curl_close($curl); 
echo($response.'<br/>'); 
echo($http_code.'<br/>'); 

यह काम करना चाहिए। लाइनों है कि आप मदद कर नीचे हाइलाइट किया जाता है:

CURLOPT_INFILE => $ धारा

CURLOPT_INFILESIZE => $ dataLength

CURLOPT_UPLOAD = 1

0

आप बाइनरी के रूप में पास टेक्स्ट सादा क्यों चाहते हैं?

--data-binary "data-id=2010-10-01_15-15-53" 

इस पंक्ति में आप कहते हैं कि तुम सादा पाठ, द्विआधारी नहीं हस्तांतरण चाहते हैं:

curl_setopt($this->_curl, CURLOPT_HTTPHEADER, array('Content-Type: text/plain')); 

किसी भी मामले मुझे लगता है कि अपने मुख्य समस्या PUT विधि का उपयोग करने के लिए है में। (https://stackoverflow.com/a/8054241/333061)

मैं तुम्हें इस तरह से POST विधि का उपयोग करने के लिए सलाह देते हैं:

curl_setopt($this->_curl, CURLOPT_HTTPHEADER, array(
    'Accept: */*', 
    'Connection: Keep-Alive', 
    // this allows you transfer binary data through POST 
    'Content-type: multipart/form-data' 
    )); 
curl_setopt($this->_curl, CURLOPT_POST, 1); 
curl_setopt($this->_curl, CURLOPT_POSTFIELDS, 
    http_build_query(array('data-id' => $dataId))); 

आसानी से कर्ल/php के माध्यम से बाइनरी डेटा ट्रांसफर करने के लिए, इस जाँच: https://stackoverflow.com/a/3086357/333061

+0

बाइनरी के रूप में पाठ और PUT विधि वह सेवा है जिसे मैं संचार कर रहा हूं इसकी आवश्यकता के साथ: यदि आप कमांड को देखते हैं तो मैं php-ize करने की कोशिश कर रहा हूं, आप देखेंगे कि यह सामग्री को सादा पाठ के रूप में सेट करता है और डेटा-आईडी को द्विआधारी के रूप में पास करता है। मैंने अभी पोस्ट के साथ आपकी सिफारिश की है लेकिन फिर कॉल है सर्वर द्वारा स्वीकार नहीं किया गया है – OSdave