Puneeth Bedre
Puneeth Bedre

Reputation: 41

cURL post with PHP failing

Using Postman, I have been able to successfully create an API call to retrieve information from the webserver.

However, I have been unsuccessful in doing the same with PHP. Following are a few screenshots from Postman which I am trying to replicate in PHP.

enter image description here enter image description here

This is my PHP code -

$filters = array("1234", "28");
$selectors = array("Brand", "Name");

$body = array('Filter' => array('SKU'=>$filters, 'OutputSelector' => $selectors));

$url = "https://xyz.neto.com.au/do/WS/NetoAPI";

$method = "POST";
$headers = array(
    "NETOAPI_ACTION: GetItem",
    "NETOAPI_KEY: xxxxxxx",
    "Accept: application/json",
    "NETOAPI_USERNAME: puneeth"     
);    

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($ch);
$err = curl_error($ch);

curl_close($ch);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}

P.S I have deliberately fudged the url and key.

I am trying to follow instructions as outlined here - https://developers.neto.com.au/documentation/engineers/api-documentation/products/getitem

Upvotes: 1

Views: 1683

Answers (1)

josemmo
josemmo

Reputation: 7073

Few things that might be preventing your code from working:

1. Array to string conversion

You have declared the body of the request as an array in $body. You need to JSON-encode it before passing it to cURL:

$body = array('Filter' => array('SKU'=>$filters, 'OutputSelector' => $selectors));
$bodyJSON = json_encode($body);
[...]
curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyJSON);

2. HTTPS request

If you're getting an empty response, you'll also need to configure cURL for SSL communication. A quick fix for this is to ignore the remote server certificate validity:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

Although this works, see this answer for a better solution.

3. Missing Content-Type

When sending raw postfields, some servers need to know what type of data you're sending. This is done by setting a Content-Type header:

$headers = array(
    "Content-Type: application/json",
    [...]     
);

Upvotes: 2

Related Questions