2013-06-27 2 views
6

Мне нужно отправить двоичный параметр данных через cURL в php.
Это команда: 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.data-binary parameter в 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); 

вызов принят сервером, но он не признает данных ID параметр:

Нет данных ID имущество, определенное в триггере 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, вы увидите, что она устанавливает содержимое как обычный текст и передает идентификатор данных как двоичный файл. Я только что попробовал вашу рекомендацию с помощью POST, но затем вызов не принимается сервером. – OSdave