I am using the following code to send and retrieve data from my Web API
//data
$data = array("Id_Empresa" => 1);
try {
$ch = curl_init($url);
$data_string = json_encode($data);
if (FALSE === $ch)
throw new Exception('failed to initialize');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)));
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
var_dump($data);
$json = json_decode($data);
foreach ($json->msg as $item) {
echo "$item->Nombre, $item->Descripcion" . PHP_EOL;
}
// ...process $output now
} catch(Exception $e) {
trigger_error(sprintf(
'Curl failed with error #%d: %s',
$e->getCode(), $e->getMessage()),
E_USER_ERROR);
}
this is what I get in response
{"ok":true,"msg":[{"Nombre":"Carnicerias","Descripcion":"Comercio al por menor de carnes rojas","H_Open":"01:00:00","H_Close":"02:00:00"}]}bool(true)
I am trying to access the JSON with the following code (Because it worked for me on a similar request):
$json = json_decode($data);
foreach ($json->msg as $item) {
echo "$item->Nombre, $item->Descripcion" . PHP_EOL;
}
But as you can see the variable $data stopped being a JSON and became a bool(true).
Does anyone know how I can access the JSON msj or why the $data variable changed from JSON to bool?
CodePudding user response:
The return values section of the PHP manual for curl_exec
says
Returns true on success or false on failure. However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, false on failure.
Maybe it could be more specific - that option must be set to true
. See the definition of the option in the curl_setopt
documentation:
true to return the transfer as a string of the return value of curl_exec() instead of outputting it directly.
So, you're seeing the JSON response because it's being output directly by curl_exec
, then bool(true)
because curl_exec
has returned true
to the $data
variable you're dumping.
Set CURLOPT_RETURNTRANSFER
to true
instead to get what you're expecting.