Reputation: 99
I'm trying to make an API through PHP cURL and my client side (form submission) is receiving data from the API. It is just not posting it to the API.
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type= application/json"));
curl_setopt($ch, CURLOPT_POST, true);
// execute the request and store the return value.
$message = curl_exec($ch);
echo 'Message returned from API is:' . $message;
This is the code to receive the message from the API. It is returning a message so hopefully no errors there.
This is the API code (below):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>The API</title>
</head>
<body>
<?php
//date, job number, customer, worksite, duties performed, total hours spent, type of hours
$date = $_POST['date'];
$jobnumber = $_POST['jobnumber'];
$customer = $_POST['customer'];
$worksite = $_POST['worksite'];
$duties = $_POST['duties'];
$hours = $_POST['hours'];
$hourtype = $_POST['hourtype'];
$username = $_POST['username'];
$ok = true;
$error ;
//validate the inputs
if (empty($date)) {
$ok = false;
$error .= "Date field empty, ";
}
if (empty($jobnumber)) {
$ok = false;
$error .= "Job Number field empty, ";
}
if (empty($customer)) {
$ok = false;
$error .= "Customer field empty, ";
}
if (empty($worksite)) {
$ok = false;
$error .= "Worksite field empty, ";
}
if (empty($duties)) {
$ok = false;
$error .= "Duties field empty, ";
}
if (empty($hours)) {
$ok = false;
$error .= "Hours field empty, ";
}
if (empty($hourtype)) {
$ok = false;
$error .= "Hour type not specified, ";
}
$data = $date . ', ' . $jobnumber . ', ' . $customer . ', ' . $worksite . ', ' . $duties . ', ' . $hours . ', ' . $hourtype;
echo $data;
?>
</body>
</html>
My submit page is returning:
"Message returned from API is: , , , , , ,"
What am I doing wrong?
Upvotes: 3
Views: 3467
Reputation: 12867
Stupid me somehow had this for the curl job:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
...
));
See the arbitrary Content-Type
header that I set for the POST, which is obviously not right. It's preventing curl to set the right Content-Type
which should be application/x-www-form-urlencoded
.
Removed 'Content-Type: application/json'
and the destination URL was successfully receiving the POST data.
Upvotes: 0
Reputation: 23660
You seem to be passing in an array to cURL.
$data = array( 'date' => $date, 'jobnumber' => $jobnumber, 'customer' => $customer, 'worksite' => $worksite, 'duties' => $duties, 'hours' => $hours, 'hourtype' => $hourtype, 'username' => $username );
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
Instead, build a query string for cURL to work with like this:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
The reason is because if you pass in an array, the Content-type
header is automatically set to multipart/form-data
, but you want application/x-www-form-urlencoded
so you can access the POSTed information through the global $_POST
.
Upvotes: 2