How to add --data-urlencode to PHP cURL - php

I have collection on postman and it is working fine. But now, I am trying to convert this PHP cURL
curl --location --request POST 'https://test.url.com' \
--header 'Content-Type: application/x-www-form-urlencode' \
--header 'Authorization: Basic 1234567890' \
--data-urlencode 'abc_id=123456' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=req-auth/all'
Here is my code:
$headers = [
"Authorization: Basic 1234567890",
"Content-Type: application/x-www-form-urlencode"
];
$data = [
"abc_id" => '123456',
"grant_type" => 'client_credentials',
"scope" => 'req-auth/all',
];
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 0,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($data)
));
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($curl);
$errno = curl_errno($curl);
curl_close($curl);
print_r($response);
I tried this code but it is not working on my end How to include 'data-urlencode' using php curl library

Related

How to translate curl arguments to php-curl?

(i've seen SOME version of this question so many times, hoping to make a thread with a comprihensive-ish list of answers)
for example, what is the php-curl translation of:
curl -v https://api-m.sandbox.paypal.com/v1/oauth2/token \
-H "Accept: application/json" \
-H "Accept-Language: en_US" \
-u "client_id:secret" \
-d "grant_type=client_credentials"
-v translates to
curl_setopt($ch,CURLOPT_VERBOSE, 1);
PS! by default, curl sends this data to stderr, and stderr is usually visible when running curl from the terminal, but when running php-curl behind a webserver ala nginx/apache, it's not uncommon that stderr is linked to *the web-server's errorlog*, hence the VERBOSE log may arrive in the server error log, rather than the browser. a quickfix to this would be to set a custom CURLOPT_STDERR, ala:
$php_output_handle = fopen("php://output", "wb");
curl_setopt_array($ch, array(
CURLOPT_VERBOSE => 1,
CURLOPT_STDERR => $php_output_handle
));
but because of php garbage collection, when using this quickfix, keep in mind that it will break if php garabge collector closes $php_output_handle before the last curl_exec() call to the same handle.. it's usually not a problem, but it can happen.
.. moving on,
https://api-m.sandbox.paypal.com/v1/oauth2/token translates to:
curl_setopt($ch,CURLOPT_URL, 'https://api-m.sandbox.paypal.com/v1/oauth2/token');
and
-H "Accept: application/json" \
-H "Accept-Language: en_US" \
translates to
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Accept: application/json",
"Accept-Language: en_US"
));
and -u "client_id:secret" translates to:
curl_setopt($ch,CURLOPT_USERPWD, "client_id:secret");
and -d "grant_type=client_credentials" (aka --data) translates to:
curl_setopt_array($ch, array(
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => http_build_query(array(
"grant_type" => "client_credentials"
))
));
hence the full translation is:
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_VERBOSE => 1,
CURLOPT_URL => 'https://api-m.sandbox.paypal.com/v1/oauth2/token',
CURLOPT_HTTPHEADER => array(
"Accept: application/json",
"Accept-Language: en_US"
),
CURLOPT_USERPWD => 'client_id:secret',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => http_build_query(array(
"grant_type" => "client_credentials"
))
));
curl_exec($ch);
what is the translation of curl -F grant_type=client_credentials ?
it's:
curl_setopt_array($ch, array(
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array(
"grant_type" => "client_credentials"
)
));
what about uploading files, what's the translation of curl -F file=#file/path/to/upload.ext ?
it's:
curl_setopt_array($ch, array(
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array(
"file" => new CURLFile("filepath/to/upload.ext")
)
));
what's the translation of --location ? it's
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
how to upload JSON? like this:
curl_setopt_array($ch, array(
CURLOPT_HTTPHEADER => array(
"Content-Type: application/json"
),
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => json_encode(array(
"whatever_key" => "whatever_data"
))
));
-X PUT translates to
curl_setopt($ch,CURLOPT_PUT,1);
as for --upload-file , there are several ways to do it,
if you're dealing with small files which easily fits in ram, the easiest way to do it would be:
curl_setopt_array($ch, array(
CURLOPT_PUT => 1,
CURLOPT_POSTFIELDS => file_get_contents($file)
));
but if you need to support big files which you don't want to put in RAM,
$file = "file.ext";
$file_handle = fopen($file,"rb");
$file_size = filesize($file);
curl_setopt_array($ch, array(
CURLOPT_UPLOAD => 1,
CURLOPT_INFILESIZE=>$file_size,
CURLOPT_INFILE=>$file_handle
));

Not getting expected PHP cURL response

I have the following PHP code:
<?php
$data = array("client_id" => "sipgate-app-web", "grant_type" => "password", "username" => "my_username", "password" => "my_password");
$data_string = json_encode($data);
$ch = curl_init('https://api.sipgate.com/login/sipgate-apps/protocol/openid-connect/token');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Accept: application/json'
));
$result = curl_exec($ch);
echo $result;
?>
Unfortunately, I'm not getting the expected response. The response I'm receiving is:
{"error":"invalid_request","error_description":"Missing form
parameter: grant_type"}
When using an online cURL tool like https://onlinecurl.com with the same data (URL, header, data) as in my cURL PHP code, I'm getting the right response. This means, there's something wrong with my PHP code. I'm not getting any error in the PHP error log.
The manual says I have to use the following cURL code:
curl \
--request POST \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json' \
--data-urlencode "client_id=sipgate-app-web" \
--data-urlencode "grant_type=password" \
--data-urlencode "username=my_username" \
--data-urlencode "password=my_password" \
https://api.sipgate.com/login/sipgate-apps/protocol/openid-connect/token
Since I'm new to cURL, after googling a lot, I have no idea what I'm doing wrong.
Can anybody help me?
EDIT: You can test my PHP code above as it is. You should get the following response, if the code is working:
{"error":"invalid_grant","error_description":"Invalid user
credentials"}
As per the manual, your request needs to have the Content-Type of application/x-www-form-urlencoded which looks like this:
key1=value1&key2=value2
Thus you need to convert your array into such a string either manually or with http_build_query, like so:
$data_string = http_build_query( $data );
I am consuming one of the API using following PHP CURL, Give this a try and pass your credentials i.e username and password in "your username" and "your password".
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.sipgate.com/login/sipgate-apps/protocol/openid-
connect/token",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS =>"{\r\n\client_id:\"sipgate-app-
web\",\r\n\tgrant_type\"password\",\r\n\tusername:\"your
username\",\r\n\tpassword:\"your password\"\r\n}",
CURLOPT_HTTPHEADER => array(
"Accept: application/json",
"Content-Type: application/json"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
} ?>

Convert a CURL command to PHP Curl

I Have the following command I can run in PHP and it works as expected:
$params = [
'file' => $xmlLocalPath,
'type' => 'mismo',
'file_type' => $xmlFile['file_type'],
'filename' => $xmlFile['file_name']
];
$cmd =
'curl -X POST ' . $this->outboundBaseURL . 'document \
-H "Accept: application/json" \
-H "Authorization: Bearer ' . $this->token . '" \
-H "Cache-Control: no-cache" \
-H "Content-Type: multipart/form-data" \
-F "file=#' . $params['file'] . ';type=' . $params['file_type'] . '" \
-F "type=' . $params['type'] . '" \
-F "filename=' . $params['filename'] . '"';
exec($cmd, $result);
I need to get this to work using PHP's curl library, but I can't get it to work quite right. I'm on PHP 5.6, and here's what I have right now:
$params = [
'file' => $xmlLocalPath,
'type' => 'mismo',
'file_type' => $xmlFile['file_type'],
'filename' => $xmlFile['file_name']
];
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => $this->outboundBaseURL . 'document',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 60,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $params,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'Authorization: Bearer ' . $this->token,
'Cache-Control: no-cache',
'Content-Type: multipart/form-data'
]
]);
curl_setopt($ch, CURLINFO_HEADER_OUT, true); // enable tracking
$response = curl_exec($ch);
$err = curl_error($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
I know the issue has to be with POSTFIELDS, and the file in particular, but I'm not show how to give PHP CURL the parameters in a proper way such that the file and other parameters will send just as the do in the raw curl call. I understand that the "#" method is deprecated in PHP Curl and I've also tried using curl_file_create with the local file with no success
Try adding one more parameter:
CURLOPT_POST => 1

PHP curl requests with 404, curl request itself works fine

I have a curl request:
curl -X PUT \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--header "x-api-token: API_TOKEN" \
--header "x-api-user: API_USER" \
--data '{"connection_id":"533905657015830359"}' \
"https://someserver/origination/numbers/%2B17032638425"
that works fine from the command line. when i try run this with a php script it fails with a 404 in the verbose response.
$url = "https://someServer/origination/numbers/%2B17032638425";
$postdata = json_encode(array('connection_id'=>'533905657015830359'));
$ch = curl_init($url);
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_VERBOSE => TRUE,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => $postdata
));
$headers = ['Content-Type: application/json','Accept: application/json','x-api-user: SOME-USER','x-api-token: SOME-TOKEN'];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
I am doing anything blindingly wrong here with the php request?
Correct me if i'm wrong, but it seems to me you are using a PUT request in your shell CURL and a POST request in the PHP version. The two HTTP methods, while quite close in their meaning, are not generally managed in the same way by API endpoints.

Image upload in PHP error - type required

I'm trying for days to upload an image through PHP and OAuth2 to App.net.
Below is the PHP I'm using - it results in this error:
"error_message":"Bad Request: 'type': Required."
<?php
function sendPost()
{
$postData = array(
'type' => 'com.example.upload',
);
$ch = curl_init('https://alpha-api.app.net/stream/0/files');
$headers = array('Authorization: Bearer '.'0123456789',
'Content-Disposition: form-data; name="content"; filename="http://www.example.com/pics/test.jpg";type=image/jpeg',
'Content-Type: image/jpeg',
);
curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $postData
));
$response = curl_exec($ch);
}
sendPost();
?>
This is their cURL example from the API documentation:
curl -k -H 'Authorization: BEARER ...' https://alpha-api.app.net/stream/0/files -X POST -F 'type=com.example.test' -F "content=#filename.png;type=image/png" -F "derived_key1=#derived_file1.png;type=image/png" -F "derived_key2=#derived_file2.png;type=image/png;filename=overridden.png"
What type is required and what do I need to change to make it work?
Any feedback is really appreciated. Thank you.
You need to do these following changes
$headers = array(
'Authorization: Bearer '.'0123456789'
);
$postData = array('type' => 'com.example.upload', 'content' => '#/roor/test.png');
Also use this as you are using https
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);

Categories