PHP API getting empty JSON request in POST [duplicate] - php

This question already has answers here:
Reading JSON POST using PHP
(3 answers)
Closed 7 years ago.
I am trying to develop small API code in php, which will send POST request in json format using PHP curl (from client side). And at receiving side(at server side) I want to parse the request and process it. but at receiving side it gives me empty array in post field.
Below is my code
Client side:
<?php
$data = array("name" => "Hagrid", "age" => "36");
$data_string = json_encode($data);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, "xdata=".$data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);
echo $result = curl_exec($ch);
?>
At server side:
<?php
print_r($_POST);
?>
Blockquote
Array ( )
Blockquote
It always gives me empty POST array at server side.
Am I doing things wrong or is there another way to parse the request?
Please guide me.

You can use php://input read-only stream to access JSON post data instead of $_POST like this
<?php
$json = file_get_contents('php://input');
?>
It will give you POST data as is. You will be able to decode it using json_decode() later.
Example code -
<?php
$json = json_decode(file_get_contents('php://input'));
?>

You are setting wrong content length with the CURLOPT_HTTPHEADER header. Your overall post string is strlen("xdata=".$data_string) whereas you are using strlen($data_string).
Also, you are using application/x-www-form-urlencoded for posting, but mentioning the content type forcefully as application/json
So remove the following block from your code and you should be fine.
// Remove it
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);

Related

PHP Api Receiving JSON data

I am trying to make an API with PHP and JSON, however I am stuck on extracting the JSON on the receiving/API side of the request.
So I am doing this on the client end of my transaction:
$data = array("test" => "test");
$data_string = json_encode($data);
$ch = curl_init('https://..../api/v1/functions? key=TPO4X2yCobCJ633&aid=9&action=add');
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))
);
$return = curl_exec($ch);
But how do I receive and extract the POSTed data on the server (receiving) side of the transaction (inside my API)?
Summary:
What i mean is i have a client that is sending a JSON file to the API now i what i don't understand is how can i get the API side to see and extract/see the data
On the receiving side you need to read from the PHP input stream, then decode:
<?php
// read the incoming POST body (the JSON)
$input = file_get_contents('php://input');
// decode/unserialize it back into a PHP data structure
$data = json_decode($input);
// $data is now the same thing it was line 1 of your given sample code
If you wanted to be more succinct, you could obviously just nest those calls:
<?php
$data = json_decode(file_get_contents('php://input'));

How to send and receive data to/from an API using CURL?

I have to make an API. For this, I will receive the data from the mobile devices as JSON using POST. I have to work with this data and send the response back to the devices also as JSON.
But I don't know how to take the data that I will receive. I have tried to make some tests using CURL to see how can I take this data but the $_POST is always empty. Can you please tell me how to send the data as JSON format to the API using CURL and how can I receive this data so I can work with it and send it back as response?
These are my test files:
curl.php:
//set POST variables
$url = 'http://test.dev/test.php';
$data = array(
'fname' => 'Test',
'lname' => 'TestL',
'test' => array(
'first' => 'TestFirst',
'second' => 'TestSecond'
)
);
//open connection
$ch = curl_init($url);
$json_data = json_encode($data);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($json_data))
);
// execute post
$result = curl_exec($ch);
echo $result;
//close connection
curl_close($ch);
test.php:
var_dump($_POST);
The response that I get is:
array(0) { }
You need to pass the POST data as a URL query string or as an array, the problem is you post data in JSON format, but PHP does not parse JSON automatically, so the $_POST array is empty. If you want it, you need do the parsing yourself in the test.php:
$raw_post = file_get_contents("php://input");
$data = json_decode($raw_post, true);
print_r($data);
same questions: 1 2

Http post request with JSON String in PHP

Here is my code,
$url= 'http://dummyhost:8080/admin/EditSubscriber?jsonString={"sub_Id":3,"sub_Fname":"messi","sub_Lname":"lionel"}';
$data_string="";
$request = new HTTPRequest($url, HTTP_METH_POST);
$request->setRawPostData($data_string);
$request->send();
$response = $request->getResponseBody();
$response= json_decode($response, true);
at the end of url JSON string is concatenated according to server requirement
but in response there is nothing i get in response variable.
What is wrong with this as when i make this request using chrome extension it shows me the result updated. And when i use the $url= "http://dummyhost:8080/admin/ViewSubsriber?jsonString={"sub_Name":"messi","sub_Password":"password"}";
i get the desired result.
i've used curl as well'
i've used Curl as well like this
$ch = curl_init($url);
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_close($ch);
$json_result = json_decode($result, true);
but the same result i get that is nothing
If you have created JSON string at your own keep following things in mind:
Space in string might result in unnatural behavior from server so for each of the varible or atleast for strings use
urlecode(yourvariable);
then chek the string online wether the JSON string is valid or not like this
http://json.parser.online.fr/
Like Brant says use
$json = file_get_contents('php:://input');
for raw data instead of using the empty $data_string="";
Your posted variable, $data_string, is empty. You are using POST and sending empty data, but then also sending a query string. It seems you are mixing GET and POST methods here. You need to actually post your JSON string in the posted data.
If you are posting raw JSON string using application/JSON content type, the post data will need to be read from raw input like this
$json = file_get_contents('php:://input');
This is because $_POST is only automatically populated by PHP for form-encoded content types.
I would also recommend sticking with curl for such usage.

Send form values into JSON and php api using QT

I have written an API that I want to accept form values for the HTTP header POST.
Using PHP, I can make use of the API link using the following code:
$data = array(
"authorid" => $_POST['author'],
"filmid" => $_POST['film'],
"content" => "".$_POST['content']."",
"score" => $_POST['score']
);
$post = json_encode($data);
$ch = curl_init('http://www.website.co.uk//v1/review/');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
array(
'Content-Type: application/json',
'Content-Length: ' . strlen($post))
);
$result = curl_exec($ch);
echo $result;
I am however using the API in a QT application.
What is the best way to store the form values and when they are submitted, send the HTTP header request POST along with the array of data to the link I gave above.
Got no idea how to achieve this!
Thanks,
Luke.
There are tons of questions like this here, just browse through them and find what is closest to your situation. This shows how to do a POST request. Here is another one with JSON serializiation, just google "qt post qnetworkrequest json" and there should be tons of answers.

Type of "application/json" prevents post variables from being sent

I've found that if I try a PHP POST curl, the postvars are sent fine. Once I add the httpheader of content-type: application/json the postvars don't go across any more. I've tried the postvars as a JSON string and as a query string.
Showing some code:
$ch = curl_init();
$post = json_encode(array('p1' => 'blahblahblah', 'p2' => json_encode(array(4,5,6))));
$arr = array();
array_push($arr, 'Content-Type: application/json; charset=utf-8');
curl_setopt($ch, CURLOPT_HTTPHEADER, $arr);
curl_setopt($ch, CURLOPT_URL, 'https://example.com/file.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_exec($ch);
curl_close($ch);
A real HTTP Post, that gets broken into an array automagically by PHP must be formatted in name=value pairs, the best way to do this in PHP is using the http_build_query function.
http://ca2.php.net/manual/en/function.http-build-query.php
There is an example that works in the PHP Manual using curl:
http://ca2.php.net/manual/en/function.curl-exec.php#98628
What you're doing is a 'RAW' post, see this other question:
How to post JSON to PHP with curl
A quick snippet to get the RAW Json data.
<?php
print_r(json_decode(file_get_contents('php://input')));

Categories