двоичный параметр данных в cURL
Я должен отправить двоичный параметр данных через 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.
это код, который у меня есть:
$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);
вызов принят сервером, но он не распознает data-id:
нет свойства data-id, определенного в триггере 2010-10-01_15-15-53
есть идеи, что я упускаю?
2 ответов
сначала вам нужно преобразовать строку в поток.
Вы можете просто сделать это с помощью этого фрагмента кода.
$YourString = 'data-id=2010-10-01_15-15-53';
$stream = fopen('php://memory','r+');
fwrite($stream, $YourString );
$dataLength = ftell($stream);
rewind($stream);
затем иметь свой поток, вы можете отправить его с помощью curl.
$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 => $stream
CURLOPT_INFILESIZE => $dataLength
CURLOPT_UPLOAD => 1
почему вы хотите передать текст как двоичный?
--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)));
чтобы легко передавать двоичные данные через curl / php, проверьте это: https://stackoverflow.com/a/3086357/333061