How to use PHP CURL function to do the same request? - php

Here is my curl commaad line .
curl -u 'username:password' -X GET -H 'Accept: application/json' -H 'Content-Type: application/xml' -d '<request><layout>1</layout><filtermode>category</filtermode><filtervalue>115399046</filtervalue><limit>1</limit><start></start><sortfield></sortfield><sortdir></sortdir></request>' https://example.com/contacts
I use curl command line. It works for me. Now, I need do it in PHP.
The hard part is: The server accept GET request, but need a xml string in request body. I have tried to change GET to POST, the server did NOT return the correct message.
<?php
$ch = curl_init();
$credentials = "user:pass";
$data = 'xml string';
$page = "/contacts";
$headers = array( "GET ".$page." HTTP/1.0", "Content-type: application/xml", "Accept: application/json", "Authorization: Basic " . base64_encode($credentials) );
curl_setopt($ch, CURLOPT_URL, 'example.com/contacts');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$ret = curl_exec($ch);
?>

You can't put the GET line in $header, that causes an invalid header to be sent. The PHP equivalent of -X GET is:
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");

Related

Converting command cURL to PHP - Stuck with passing POSTFIELD data

In an attempt to replicate the following cURL:
curl -X POST --header 'Content-Type: multipart/form-data' --header 'Accept: application/json' --header 'Authorization: Bearer XXXXXXXXXX-XXXXXXXXXXX' 'https://XXXXXXXXX.XXX.com/api/v3/assets/76c860cd184ae4adfa105d46135c9b27.json' -F 'name=fileupdate99.pdf' -F 'description=curlviaphp'
The purpose of the call is to update the two fields (name & description) at this specific end point.
I used https://incarnate.github.io/curl-to-php/ to get the bulk of the conversion. However, I appear to be stuck on passing the data.
From what I can tell, it looks like the -F flag is expected (also used to upload files) and I can't make a swap to -d (I tried running call in the command line and -d wasn't accepted).
<?php
$subdomain = "XXXXXXXX";
$name = "fileupdate4.pdf";
$description = "curlviaphp";
$auth = "XXXXXXXXXX-XXXXXXXXXXX";
$asset = "76c860cd184ae4adfa105d46135c9b27";
$ch = curl_init();
$curlurl = "https://" . $subdomain . ".XXX.com/api/v3/assets/" . $asset . ".json' ";
$variables = array(
"name" => $name,
"description" => $description,
);
curl_setopt($ch, CURLOPT_URL, $curlurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $variables);
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = "Content-Type: multipart/form-data";
$headers[] = "Accept: application/json";
$headers[] = "Authorization: Bearer " . $auth;
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo "Error:" . curl_error($ch);
}
curl_close($ch);
echo $result;
?>
When I execute, the code runs and I get a blank page (no return and no change on the receiving end).
What am I missing?

How to properly set headers for a json request through curl

I am new at API´s, Curl and Json. I need to link my appilcation with the an API.
The API I want to connect with has a CURL example which is this:
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X GET https://www.api.com -u 'user:token'
I have made some research and I make a request like this:
$url = "https://www.api.com";
$headers = array(
-H "Accept: application/json",
-H "Content-type: application/json"
-u 'Authorization: Basic '. base64_encode("user:token") // <---
);
//initializing curl object
$curl = curl_init();
//adding fields to the curl object to enter the site
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate');
//executing the curl call and getting data back
$json = curl_exec($curl);
curl_close($curl); // close the connection
//echo $json;
return $json;
I get the Json request but I still don´t understand the example the API gives. I even don´t know if I am setting well the Curl.
can someone explain to me how can I interpret the Curl example if I doing it well ?
This is not valid PHP syntax:
$headers = array(
-H "Accept: application/json",
-H "Content-type: application/json"
-u 'Authorization: Basic '. base64_encode("user:token") // <---
);
You should use this instead:
$headers = array(
'Accept: application/json',
'Content-type: application/json',
);
And for the auth, use this:
curl_setopt($curl, CURLOPT_USERPWD, $username . ':' . $password);

Post the data with header in curl not working in php?

I'm trying to create the box app users using PHP. The curl for create user as follows, and it is working on terminal
curl https://api.box.com/2.0/users \
-H "Authorization: Bearer <Access token>" \
-d '{"name": "New User", "is_platform_access_only": true}' \
-X POST
Same thing I have tried with php But it is giving the following error
{"type":"error","status":400,"code":"invalid_request_parameters","help_url":"http:\/\/developers.box.com\/docs\/#errors","message":"Invalid input parameters in request","request_id":"6688622675982fb5339a37"}
The following one I have tried
$developer_token = "TOKEN" ;
$access_token_url = "https://api.box.com/2.0/users";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $access_token_url);
//Adding Parameters
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
'name'=>'NEW USER',
'is_platform_access_only'=>'true',
));
//Adding Header
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer '.$developer_token
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response1 = curl_exec($ch);
If I remove the Post parameters, and run with only headers it is give the result of users. But with post it is throws error.
I have rise the same question in Perl tag with Perl code. There I got answer by user #melpomene.
We should encode the data as JSON. It is working,
Then the final code is
$data = array(name=>SOMENAME,is_platform_access_only=>true);
$data = json_encode($data);
$header = array("Authorization: Bearer <TOKEN>");
$ch = curl_init("https://api.box.com/2.0/users/");
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response1 = curl_exec($ch);
curl_close($ch);

how Can i post data to an url using curl and json?

i want to use api of a website for send notification to my app
and the website help is not good :/
website said you should write in header of request tokan code and some setting
how can i post json data to this website with php ?
with these header
"Authorization: Token 7fb1………………………………29b464c "
"Content-Type: application/json"
"Accept: application/json"
and the url is from help text of website
curl -X POST "https://panel.pushe.co/api/v1/notifications/"
please help me#_#
Use something like this:
$ curl -X POST -i -H "Content-Type: application/json" -H "Authorization: TOKEN <YOUR_TOKEN>" https://panel.pushe.co/api/v1/notifications/
php example from here
$data = array("name" => "Hagrid", "age" => "36");
$data_string = json_encode($data);
$ch = curl_init('http://api.local/rest/users');
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/json',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);

Curl -H flag in php

I have to make a call to an API and I have the terminal command that works but I can't seem to make it work with php (I get 403 forbidden error). This is the call that works:
curl -X GET -H "mail: mail#api.com" -H "password: XXX" "http://api.com/rest/v1"
This is what I have in PHP so far:
$url = "http://api.com/rest/v1";
$headers = array(
"Content-type: application/json",
"Accept: application/json",
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
$auth = array('mail: mail#api.com', 'password: XXX');
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($auth));
$data = curl_exec($ch);
if (curl_errno($ch)) {
print "Error: " . curl_error($ch);
} else {
// Show me the result
var_dump($data);
curl_close($ch);
}
The var_dump shows bool(true) but I also get the 403 error message. I also tried adding the email/password in the headers but didn't work. Like this (and removing the CURLOPT_POSTFIELDS line):
$headers = array(
"Content-type: application/json",
"Accept: application/json",
'mail: mail#api.com',
'password: XXX'
);
-H is a header for the curl command line, so why are you setting them as the postfields?
Seems like it should be:
$headers = array('mail: mail#api.com', 'password: XXX');
This should be the same as your CLI command above. If this doesn't work, check the output of curl_exec() to see what the server is responding.

Categories