Solicitud REST al Agente de servicios web desde PHP

Objetivo

JSON
El manejo de JSON en el lenguaje de PHP se puede hacer mediante la definición de un objeto el cual se convertirá después en un JSON o el más fácil usando arreglos los cuales tendrán un comportamiento dependiendo de cómo se haga se definición del arreglo.
Arreglos Asociativos
En este tipo de arreglo cada elemento se compone de una clave y un valor, por lo tanto cada clave dentro del arreglo debe ser única, mientras que el valor se puede repetir en diferentes llaves, este tipo de arreglo servirá para definir el tipo de dato JSONObject; ejemplo:
Arreglo asociativo Representación en JSON
array( "España"=>"Madrid",
"Francia"=>"París",
"Inglaterra"=>"Londres",
"Italia"=>"Roma",
"Portugal"=>"Lisboa",
"Alemania"=>"Berlín"
)
{ "España": "Madrid", "Francia": "París", "Inglaterra": "Londres", "Italia": "Roma", "Portugal": "Lisboa", "Alemania": "Berlín" }
Arreglo Indexado
También conocido como vectores o listas es la forma más simple de definir un arreglo en PHP, en esta podemos guardar varios datos o variables agrupados formando una lista en el cual el índice será un número que no hay que definir, este tipo de arreglo servirá para definir el tipo de dato JSONArray; ejemplo:
Arreglo indexado Representación en JSON
array(
"foo",
12345,
true,
"hello",
"world"
)
{ "name": " foo ", "num": 100, "balance": 1000.21, "Italia": true }
Json_decode
Función implementada desde la versión de PHP 5.2.0 que decodifica un String convirtiéndolo en un Array o en un objeto (previamente definido), como parámetro obligatorio recibe un String con el JSON a decodificar. Esta función sólo trabaja con cadenas codificadas en UTF-8. Si el valor que se quiere convertir a un JSON no es válido esta función retornará null. Ejemplo:
Aplicación del json_decode Resultado de json_decode
$json= '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json, true));
?>
array(5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) }
Json_encode
Función implementada desde la versión de PHP 5.2.0 la cual retorna una cadena con la representación de un JSON; para esto la función recibe un Array asociativo o un objeto con sus atributos ya definidos, si la conversión es correcta retornará el string pero en caso de presentarse algún error retornará FALSE. Ejemplo:
Aplicación del json_encode Resultado de json_encode
$arr = array('a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
'e' => 5);
echo json_encode($arr);
?>
{"a":1,"b":2,"c":3,"d":4,"e":5}
Request
stream_context_create
Función disponible desde la versión de PHP 4.3.0 permite crear un contexto de flujo con cualquier opción que se envié en el parámetro options. Es decir, esta función permitirá definir cómo será el contexto de una petición, permitiendo definir el protocolo por el cual se hará la petición (HTTP, FTP, HTTPS, SSL), verbo con el cual se realizará la solicitud (POST, GET, PUT, DELETE), hasta la definición de cabeceras y contenido que enviará la misma. Ejemplo:
Código de PHP Resultado
$opts = array(
'http'=>array('method'=>"GET",'header'=>array("Accept-language: es", "Cookie: foo=bar","Custom-Header: value")
)
);
$context = stream_context_create($opts);
Este código crea el contexto para una petición GET a través de HTTP que espera su respuesta en español y envía en los header la variable cookie que representa “foo=bar” y un header personalizado con su respectivo valor.
$options = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-type:
application/JSON"
"Content-Length: ".strlen($data)
“content” => $data
)
);
$context = context_create_stream($options)
Este flujo de contexto es para una petición HTTP por método post que envía un JSON en su content y en la cabecera indica el tipo de dato que está enviando y el tamaño del mismo.
file_get_contents
Disponible desde la versión de PHP 4.3.0 permite obtener un recurso publicado en una URL, el recurso obtenido será entregado en formato String, esta opción es la recomendada para transmitir un recurso a una cadena, puesto que usa técnicas de mapeado de memoria para mejorar el rendimiento de las solicitudes. Esta función recibe como parámetro la ubicación del archivo y el contexto con el cual se realizará la petición. Ejemplo:
Código PHP Descripción del código
$option = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n”.
"Cookie: foo=bar\r\n"
)
);
$ctx = stream_context_create($option);
$str_recurso = file_get_contents('http://www.example.com/', false, $ctx);
?>
Primero se crea el contexto de la solicitud, en el cual se indica que será una petición HTTP por el verbo GET, ya una vez definido el contexto se procede a realizar la solicitud a la URL del recurso con la función file_get_contents en la cual se envía la URL y el contexto previamente definido, de esta manera la variable $str_recurso tomará el valor representado en string del recurso.
Ejemplo funcional
El siguiente ejemplo realiza una petición que muestra el listado de terceros obtenidos de un agente de servicios web de ContaPyme (ASW) en una tabla HTML. Para esto primero se debe hacer GetAuth contra el agente para obtener el KeyAgent con el cual se realizará la solicitud de listado de terceros.
requestPOST
Esta función recibe como parámetro la URL a la cual se realizará la solicitud POST y el JSON que se enviará en la petición, la función obtendrá el String de la petición y convertirá este en un JSON el cual retornará.
function requestPOST($url, $data) {
   //Se crea el Objeto de configuración
   $options = array(
      'http' => array(
         //Se adiciona especifica que la petición es JSON
         'header' => "Content-type: application/json",
         //Se especifica el verbo de la solicitud
         'method' => 'POST',
         //Se adiciona el JSON al content en forma de string
         'content' => json_encode($data)
      )
   );
   //Se crea el contexto con las opciones definidas
   $context = stream_context_create($options);
   //Se solicita el recurso a la URL con el contexto definido
   $result = file_get_contents($url, false, $context);
   //Se verifica que la respuesta sea correcta
   if ($result != FALSE) {
      //Se convierte el String del resultado a un JSON
      $JResult = json_decode($result);
      //Se verifica si el JSON es invalido
      if ($JResult == null) {
         //Se define un JSON vacio cuando no hay result
         $JResult = json_decode("{}");
      }
   } else {
      //Se define un JSON vacio cuando no hay conexión
      $JResult = json_decode("{}");
   }
   //Se retorna la respuesta
   return $JResult;
}
getKeyAgent
Esta función construirá el JSON necesario para la autenticación contra el Agente de servicios web (ASW), paso seguido realizará la solicitud, y retornará el KeyAgente entregado por el servidor.
function getKeyAgent() {
   $keyAgente = "";
   $urlGetAuth = 'http://local.insoft.co:9000/datasnap/rest/TBasicoGeneral/"GetAuth"/';
   $JSONParameter = array(
      "email" => "pruebas.api@contapyme.com",
      "password" => "e10adc3949ba59abbe56e057f20f883e",
      "idmaquina" => "1",
   );
   $JSONSend = array('_parameters' => array(
      json_encode($JSONParameter),
      "0",
      "1001",
      "0"
   ));
   $JResult = requestPOST($urlGetAuth, $JSONSend);
   $arrTemp = $JResult->{"result"};
   if (($arrTemp != null) and ( count($arrTemp) > 0)) {
      $objTemp = $arrTemp[0];
      if (($objTemp != null)) {
         $objTemp = $objTemp->{"respuesta"};
         if (($objTemp != null)) {
            $objTemp = $objTemp->{"datos"};
            if (($objTemp != null)) {
               $keyAgente = $objTemp->{"keyagente"};
            }
         }
      }
   }
   return $keyAgente;
}
getListaTerceros
Esta función recibe el key Agente obtenido anteriormente y construye el JSON para realizar la petición de obtener el listado de terceros, como resultado esta función retornara un arreglo indexado con el listado de terceros.
function getListaTerceros($keyAgent) {
   $urlGetAuth = 'http://local.insoft.co:9000/datasnap/rest/TCatTerceros/"GetListaTerceros"/';
   $JSONParameter = array(
      "datospagina" => array(
         "cantidadregistros" => "99",
         "pagina" => "1"
      ),
      "camposderetorno" => array("init", "ntercero", "napellido")
   );
   $JSONSend = array('_parameters' => array(
      json_encode($JSONParameter),
      $keyAgent,
      "1001",
      "0"
   ));
   $JResult = requestPOST($urlGetAuth, $JSONSend);
   $arrTemp = $JResult->{"result"};
   if (($arrTemp != null) and ( count($arrTemp) > 0)) {
      $objTemp = $arrTemp[0];
      if (($objTemp != null)) {
         $objTemp = $objTemp->{"respuesta"};
         if (($objTemp != null)) {
            $arrTemp = $objTemp->{"datos"};
         }
      }
   }
   return $arrTemp;
}
Implementación de las funciones
En la implementación de las funciones previas, lo primero que se hace es construir el encabezado de la tabla, paso seguido se obtiene el keyAgent que se necesitara para obtener información del ASW, una vez se tenga el KeyAgent se solicita el listado de terceros con el mismo y se recorre el arreglo para generar el HTML donde este será visible.
$table = "<tr>
   <td> <b> Código <b> <td>
   <td> <b> Nombre <b> <td>
   <td> <b> Apellido <b> <td>
<tr>";
$sKey = getKeyAgent();
if ($sKey != "") {
   $Arrterceros = getListaTerceros($sKey);
    for ($i = 0; $i < count($Arrterceros); ++$i) {
      $s = " <tr>
         <td>" . $Arrterceros[$i]->{"init"} . "<td>
         <td>" . $Arrterceros[$i]->{"ntercero"} . "<td>
         <td>" . $Arrterceros[$i]->{"napellido"} . "<td>
    <tr>";
      $table = $table . $s;
   }
}
echo "<table> border='1' style=' table-layout: fixed;width: 100%;border: 3px solid purple;'>" . $table . "<table>";
?>
Resultado de la implementación
©2016 InSoft Todos los derechos reservados.