Hacer post a api externa

Buen día comunidad, soy de la UTN de Buenos Aires, actualmente usamos Guarani 3.16.2.

Necesito comunicarme con un sitema interno de la facultad para pasar datos de personas, esto lo hago mediante una API que me exponen usando curl.


private function makeQuery($url, $method = null, $datosParaGuardar = null)    {
    $host = $this->urlBase . $url;

    $conexion = curl_init();
    curl_setopt($conexion, CURLOPT_URL, $host);
    curl_setopt($conexion, CURLOPT_VERBOSE, 0);
    curl_setopt($conexion, CURLOPT_RETURNTRANSFER, 1);

    if($method == "POST") {
        curl_setopt($conexion, CURLOPT_POST, true);
        curl_setopt($conexion, CURLOPT_HTTPHEADER, array(
                'Content-Type:application/json; charset=utf-8',
                'Connection: Keep-Alive'));
        curl_setopt($conexion, CURLOPT_POSTFIELDS, $datosParaGuardar);
    }

    $datos = curl_exec($conexion);
    $status = curl_getinfo($conexion, CURLINFO_HTTP_CODE);

    $resultado = [
        "status" => $status,
        "datos" => json_decode($datos, true) ? json_decode($datos, true) : $datos
    ];

    curl_close($conexion);
    return $resultado;
}

Tengo un problema cuando tengo que hacer un POST y en los datos hay caracteres especiales (tildes, ñ, etc).

Para transformar un array a json tengo que encodearlos en UTF-8, eso lo hago con array_a_utf8, pero a los caracteres especiales quedan en formato unicode (por ejemplo \u0062, esto pasa aunque ponga el flag JSON_UNESCAPED_UNICODE en el json_encode) y no me sirve que se mandarlo así.

Si decodeo el json los campos se ven bien, si caracteres en unicode, pero cuando hago el POST los datos no salen, no llega nada al sistema externo. Probé con POSTMAN usando el mismo json y ahí si le llegan datos, osea que el problema está solo cuando hago el post desde php.

Alguién sabe cómo puedo hacer? Gracias.

PD: Ya estuve googleando en stack overflow y demás lugares pero las respuestas que me dan no me sirvieron

Buenas tardes Enzo, probaste cambiarle el changeset en la línea donde está el context type.Probaste con alguna aplicación como Postman ver si eso te da también el problema de los caracteres espaciales?
Saludos.

Hola José,
Probé con Postman usando el mismo json con carateres especiales y no tengo problemas. Acabo de probar cambiando el charset y no funciona

Buenas Enzo. A ver si entiendo bien, vos lo que estás haciendo que desde un sistema externo se consuma la api de gestión? Como estás haciendo el post?
Estuve probando un post con el ejemplo que enviaste, lo único que cambie es que en el array resultado use lo siguiente:


$resultado = [
        "status" => $status,
        "datos" => rest_decode($datos)
    ];

Con eso me funciono el tema de los caracteres.

Saludos.

Hola Enzo,

esos caracteres salen codificados de dicha manera luego de aplicar array_a_utf8, no es algo que agregue el json_encode y por lo tanto no creo que el modificador tenga algun tipo de incidencia.

Respecto del POST… en mi experiencia tuve que cambiar


curl_setopt($conexion, CURLOPT_POST, true);

por


curl_setopt($conexion, CURLOPT_CUSTOMREQUEST, 'POST');

de otra forma siempre tenia problemas con los envios, yo probaria con este cambio primero y luego revisaria lo del json_encode.

Saludos