Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

data-binary parameter in cURL

I have to send data-binary parameter through cURL in php.
This is the command: curl -D - -u user:password -X PUT -H "Content-Type: text/plain" --data-binary "data-id=2010-10-01_15-15-53" https://someurl. In the console this works, now I have to do it in php.

This is the code I have:

    $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);

the call is accepted by the server, but it doesn't recognize the data-id parameter:

No data-id property defined in trigger 2010-10-01_15-15-53

Any idea what I'm missing?

like image 323
OSdave Avatar asked Jun 27 '13 13:06

OSdave


People also ask

What is data binary in curl?

--data-binary is a curl SPECIFIC flag for curl itself. it has nothing to do with HTTP web services call specifically, but it's how you "POST" data to the call in the HTTP BODY instead of in the header WHEN using curl.

Is binary data allowed in GET method?

When a GET method returns binary data, the Swagger document that is generated by IBM® Cúram Social Program Management specifies the Response Content type as anything other than application/json. This response indicates that binary content and not JSON content is provided in the response.

How do you send a POST request on curl?

To make a POST request with Curl, you can run the Curl command-line tool with the -d or --data command-line option and pass the data as the second argument. Curl will automatically select the HTTP POST method and application/x-www-form-urlencoded content type for the transmitted data.

What is curl-- data?

cURL, which stands for client URL, is a command line tool that developers use to transfer data to and from a server. At the most fundamental, cURL lets you talk to a server by specifying the location (in the form of a URL) and the data you want to send.


1 Answers

You need to convert your string to stream first.

You can simply do it with this piece of code.

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

Then having your stream, you can send it using 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/>');

This should work. The lines that help you are highlighted below:

CURLOPT_INFILE => $stream

CURLOPT_INFILESIZE => $dataLength

CURLOPT_UPLOAD => 1

like image 103
Wojciech Jakubas Avatar answered Sep 30 '22 16:09

Wojciech Jakubas