WebService

Richard, buen día
Me puedes orientar como ofrecer un webservice en siu-toba, ya que en toba_usuarios vi dicha opción.
El caso es el siguiente
Debo ofrecer un servicio en un proyecto toba (encuesta), de tal forma que:

  1. Recibo un nro de identificación de un sistema externo
  2. lo recibo.
  3. ejecuto un sql con dicho dato
  4. Retorno una respuesta con varios datos.

Quedo atento,
Cordial Saludo

Hola Jhon,

los WS Rest los servimos haciendo uso de esta libreria y la forma en que los definimos depende basicamente de ella.

En Toba solo hay un par de cuestiones puntuales respecto de la ubicacion y el manejo de los usuarios de la misma.
Eso lo fuimos dejando aqui

Ten en cuenta que el trabajo de Toba llega hasta la configuracion de la libreria y luego le cede el control a ella, por lo que efectivamente dentro del WS no vas a poder utilizar las funciones del framework.

Saludos

Richard, gracias por responder y nos puedes colaborar con sacarlo adelante con el ejempo de toba_referencia, para tomarlo como base

En el ejemplo de toba referencia (requiere curl y Guzzle), ya se encuentran en php/3ros/curl y php/vendor/guzzlehtml

Todavía estamos en toba 2.7

al probar en toba referencia en los eventos (GET/PERSONA y los demás), muestra un error

POST /toba_referencia/php/rest/personas HTTP/1.1 Host: localhost User-Agent: Guzzle/5.1.0 curl/7.59.0 PHP/5.6.40 Content-Length: 49 {“nombre”:“jhon”,“fecha_nacimiento”:“2020-09-01”} HTTP/1.1 404 Not Found Date: Tue, 01 Sep 2020 20:32:38 GMT Server: Apache/2.4.37 (Win64) PHP/5.6.40 Content-Length: 316 Content-Type: text/html; charset=iso-8859-1
Not Found

The requested URL /toba_referencia/rest/personas was not found on this server.

Y en el evento de Versión API, muestra el siguiente error.
cURL error 7: Failed to connect to localhost port 443: Connection refused

Se adecuaron los archivos respectivos que indican(adjuntos), por favor revisas si hay se encuentra la falla

Gracias y cordial saludo


rest.rar (1.05 KB)

Hola Jhon,

Requiere la extension CURL de PHP, no la libreria en un directorio… se puede usar sin ella pero es mejor tenerla para no tener que tocar cosas en php.ini.

al probar en toba referencia en los eventos (GET/PERSONA y los demás), muestra un error

POST /toba_referencia/php/rest/personas HTTP/1.1 Host: localhost User-Agent: Guzzle/5.1.0 curl/7.59.0 PHP/5.6.40 Content-Length: 49 {“nombre”:“jhon”,“fecha_nacimiento”:“2020-09-01”} HTTP/1.1 404 Not Found Date: Tue, 01 Sep 2020 20:32:38 GMT Server: Apache/2.4.37 (Win64) PHP/5.6.40 Content-Length: 316 Content-Type: text/html; charset=iso-8859-1
Not Found

The requested URL /toba_referencia/rest/personas was not found on this server.


Te hago una consulta, esta prueba la estas reaizando desde dentro del proyecto toba_referencia?.. en dicho caso esta activo el modulo de rewrite? si pudieras pegarme el contenido de la configuracion del alias para toba_referencia seria genial, todo apunta a que no esta encontrando la forma de llegar.

Y en el evento de Versión API, muestra el siguiente error. cURL error 7: Failed to connect to localhost port 443: Connection refused
Si, esto puede ser ya que dicho pedido se hacia por https en lugar de http... para modificarlo tendrias que editar directamente el archivo fuente, no vale la pena.
Se adecuaron los archivos respectivos que indican(adjuntos), por favor revisas si hay se encuentra la falla

Jhon, el archivo que subiste me llega roto… si pudieras subir los archivos ini nomas seria mejor… son dos, el cliente.ini donde consta las URLs y servidor.ini… el de usuarios no lo necesito ya que las credenciales de los usuarios no son importantes.

Saludos

Ingeniero, mil gracias por responder

Te conceptualizo el caso primero: Se compró un sistema de alarmas HikVision que detecta la persona y su temperatura, para controlar su entrada, pero nos toca crear una alarma dependiendo de una encuesta covid que el personal debe diligencia antes de ingresar realizada en toba, cuando se envía la encuesta se debe enviar a la terminal HikVision un json con (identificacion, fecha, puntos, si_realiza), para que cuando la persona que no la realize se le active dicha alarma.

cuando la persona presiona ENVIAR en donde debo enviar los datos a dicha termina y ahí es donde necesito el REST, para el envío.

Depronto también me puedes orientar si hay otra solución?

La prueba la realizo, ejecutando directamente desde toba referencia, por SOAP y POSTMAN igual NO encuentra la ruta

La extension curl.dll se encuentra descomentada y tiene el ext, pero guzzle investigando solo es libreria y no tiene extensión

  1. Cómo activo el módulo rewrite, y donde se encuentra, si es el de toba.conf, ya se encuentra en ON

  2. Como no se permite subir archivos.ini, se los copio acá mismo

2.1. EN EL ARCHIVO C:\proyectos\toba_2_7\instalacion\i__desarrollo\p__toba_referencia\rest\servidor.ini
DESCOMENTO LOS QUE CREO QUE SON NECERARIOS

autenticacion = ‘digest’
;;
;;Opciones que recibe la librería - > rest/rest.php
;;
[settings]
formato_respuesta = json
;url_protegida = /.*/

///////////////////////////////////////////////////////////////////////
2.2. EN EL ARCHIVO C:\proyectos\toba_2_7\instalacion\i__desarrollo\p__toba_referencia\rest\rest_localhost\cliente.ini
;DESCOMENTO LOS QUE CREO QUE SON NECERARIOS

[conexion]
;;Recuerde dejar una barra (/) al finalizar la URL
to = “https://toba_referencia/rest/”
auth_tipo = ‘digest’
auth_usuario = toba
auth_password = toba

;Parametros para auth_tipo = ssl
;cert_file=/path_al_certificado
;cert_pwd=PASSWORDDECERT
;key_file=/path_de_clave_privada
;ca_cert=/path_al_certificado_CA

///////////////////////////////////////////////
3. En el archivo toba.conf esto es lo que tiene con respecto toba_referencia para el ejmplo

#Proyecto: toba_referencia
Alias /toba_referencia/2.7 “C:/proyectos/toba_2_7/proyectos/toba_referencia/www”
<Directory “C:/proyectos/toba_2_7/proyectos/toba_referencia/www/”>
SetEnv TOBA_DIR “C:/proyectos/toba_2_7”
SetEnv TOBA_PROYECTO “toba_referencia”
SetEnv TOBA_INSTALACION_DIR “C:/proyectos/toba_2_7/instalacion”
SetEnv TOBA_INSTANCIA “desarrollo”
DirectoryIndex aplicacion.php

	AllowOverride None
	<IfModule !mod_authz_core.c>
		Order allow,deny
		Allow from all
	</IfModule>
	<IfModule mod_authz_core.c>
		Require all granted
	</IfModule>

	#API REST
	RewriteEngine On
	RewriteBase /toba_referencia/2.7
	Options FollowSymLinks SymLinksIfOwnerMatch
  	RewriteRule ^rest/(.*)$ rest.php/$1 [PT,L,QSA]
	RewriteRule ^rest$      rest.php/   [PT,L,QSA]
	SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</Directory>

//En cuanto al botón API, ya modifique el https:// por http y lleva bien hasta el mensaje de la versión con
toba::notificacion()->agregar('Version de la API rest: '. toba::escaper()->escapeHtml($version->__toString()), ‘info’);

Disculpa mi desconocimiento sobre el tema, en lugar de dicha noficación para ya enviar los data por json, bastaría con armar el json y enviarlo con json_decode($respuesta)
Quedo atento
Cordial Saludo

Hola Jhon,

la pregunta es… la interaccion es desde el sistema en Toba hacia el aparato HikVision o viceversa?.. quien inicia la interaccion?.

  • Si la interaccion la inicias desde Toba hacia el aparato… lo unico que necesitas es guzzle.

  • Si el aparato consulta al sistema en Toba… entonces si necesitas toda la parte de rest.

En este segundo caso, tienes que hacer coincidir el tipo de autenticacion ademas de usr/pwd y obviamente la url tiene que ser funcional.

La extension curl.dll se encuentra descomentada y tiene el ext, pero guzzle investigando solo es libreria y no tiene extensión
  1. Cómo activo el módulo rewrite, y donde se encuentra, si es el de toba.conf, ya se encuentra en ON

Guzzle usa internamente la extension curl (en lugar de fopen) y el modulo rewrite es de Apache, no de Toba.
autenticacion = 'digest' ;; ;;Opciones que recibe la librería - > rest/rest.php ;; [settings] formato_respuesta = json [b];url_protegida = /.*/[/b] //Este valor tambien va descomentado, indica que parte del api debe estar resguardada
[conexion] ;;Recuerde dejar una barra (/) al finalizar la URL to = [b]"https://toba_referencia/rest/"[/b] //Aca debe ir una url valida que coincida con la declarada en toba.conf
Este cambio solo te sirve para navegar los ejemplos de toba_referencia, o dicho de otra manera.. solo para cuando usas la parte cliente.
Disculpa mi desconocimiento sobre el tema, en lugar de dicha noficación para ya enviar los data por json, bastaría con armar el json y enviarlo con json_decode($respuesta)
Jhon, me preocupa que no estes internalizando algunas cuestiones tanto de Toba (y su manejo particular) como de Web en general (mod rewrite) en el apuro por hacer funcionar esto. Los ejemplos de toba_referencia te pueden bastar para realizar lo que necesitas.. pero tienes que tomarte el tiempo para analizar que parte es el cliente, que parte es la que sirve el WS y como, etc.. sin eso solo te vas a frustrar.

Saludos

Ingeniero, es claro cuando es primera vez es complicado

Ya solvente la mayoría de inconvenientes en toba referencia, me queda solo el del error al presionar EL GET y POST

ERROR: GET /rest/personas HTTP/1.1 Host: toba_referencia User-Agent: Guzzle/5.1.0 curl/7.59.0 PHP/5.6.40

Como lo puedo solucionar ?

Gracias y Cordial saludo

Hola Jhon,

si el error sigue siendo que no encuentra la URL, debes revisar la configuracion de Apache, yo miraria que no se esten superponiendo alias, etc… si viniera por otro lugar el error deberia ser distinto.
Un detalle, dentro de la carpeta (instalacion/i__nombre_instancia/p__toba_referencia/rest/logs) deberias tener un listado de archivos de logs donde se explique que paso si es que fuera otro el problema.

Saludos

Ingeniero, gracias por responder

En el rest como puedo lograr una conexión indefinida, ya que necesitamos ir a la terminal seguido para detectar que persona ingresa y recibir dichos datos, para almacenar en nuestra base de datos ? me dicen que es un equivalente en C# a la funciò “StartHttpLongLink”

   //Este evento desde rest de toba referencia responde con OK y recibe los datos
function evt__UserInfo()
{
	$url = "http://172.0.0.31/ISAPI/AccessControl/UserInfo/";		
	$opciones = array('to' => $url);
	$cliente = toba::servicio_web_rest('rest_localhost', $opciones);
	$resp = $cliente->guzzle()->get('Count');
	$respuesta = rest_decode($resp->json());
	$this->debug($resp);
}

//Este rest lo requerimos con conexion indefinida, por lo tanto individual no responde
function evt__alertStream()
{   echo "en alertStream conectar con una conexion indefinida

";
$url = “http://172.0.0.31/ISAPI/Event/notification/”;
$opciones = array(‘to’ => $url);
$cliente = toba::servicio_web_rest(‘rest_localhost’, $opciones);
$resp = $cliente->guzzle()->get(‘alertStream’);
$respuesta = rest_decode($resp->json());
$this->debug($resp);
}

Gracias y cordial Saludo

Hola Jhon,

segun entiendo lo que necesitas es una conexion permanente, cosa que en REST no existe como tal porque subyace el modelo web… lo unico que se me ocurre es que puedas jugar con el timeout de la conexion para que se quede esperando una respuesta… pero eso te va a bloquear efectivamente esa sesion hasta que responda el otro punto.

Para ello tienes que actuar directamente sobre el cliente Guzzle mediante su API (esto ya escapa a Toba) , para accederlo lo unico que tienes que hacer es invocar hasta este punto:


$guzzle = $cliente->guzzle();

Cuidado con la documentacion de Guzzle, normalmente tienen publicada la ultima version… como tu estas trabajando con una version vieja deberas buscar explicitamente la documentacion para esa version, ya que su API fue cambiando con el tiempo.

Saludos

Ingeniero, buenas tardes
Una ayuda más, como estoy tratando en un CURL normal de enviar el dato recibido del ws a una tabla o un archivo de texto, pero NO los almacena, cuando es un ws individual guarda bien el registro, peor con la implementación de persistente (Connection: Keep-Alive) no hemos podido, sabes como puedo lograrlo?
Ni siquiera con un print_r vemos que llega, en wirehark el proceso de comunicación lo muestra bien con el estado 200.

Cordial Saludo

function evt__prueba()
{
/$url = “http://172.0.0.31/ISAPI/AccessControl/UserInfo/”;
$opciones = array(‘to’ => $url);
$cliente = toba::servicio_web_rest(‘rest_localhost’, $opciones);
$resp = $cliente->guzzle()->get(‘Count’);
$respuesta = rest_decode($resp->json());
$this->debug($resp);
print_r($respuesta);
/
$host = “http://172.0.0.31/ISAPI/Event/notification/alertStream”;

		$conexion = curl_init();

		$username= "admin";
		$pass= "ucm2020@";

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

		curl_setopt($conexion,CURLOPT_HTTPAUTH,CURLAUTH_DIGEST);
		curl_setopt($conexion, CURLOPT_USERPWD,"$username:$pass");
		

		//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);
		
		$file=fopen("archivo.txt","w");
		fwrite($file, $datos);
		fclose($file);

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

		//if ($resultado['status'] == 'OK') {
			$fecha = quote(date('Y-m-d'));
			$sql = "INSERT INTO prueba (fecha, estado, nombre)VALUES($fecha, 'OK', 'PROBANDO');";
			toba::db('toba_referencia')->consultar($sql);
			//return $resultado;
		//}
		//print_r($resultado);
		//curl_close($conexion);
		//return $resultado;
}

Hola Jhon,

no puedo debuggear tu codigo, menos aun cuando no conozco la API del aparato… lo ideal seria que se comunicaran con el proveedor del mismo para consultarle sobre la misma y como operar con ella.

Por otro lado (y esto es pura especulacion), siendo que es una API REST… que responda vacio cuando no hay eventos que reportar sigue siendo una respuesta y por ello es que no puedes ver nada pero el status es 200, ciertamente parece mas coherente eso a que quede con una conexion persistente hasta que se reporten eventos.

Creo que no tienen otra opcion que realizar el chequeo cada cierto intervalo de tiempo y procesar los eventos cuando se les informen, sean 1 o varios.

Saludos

Inge, un favor o quien tenga la respuesta.

En un proyecto web desarrollado en toba,
en el conf de la página de inicio estamos refrescando cada cierto tiempo, para dar tiempo de consumir un servicio.

function conf (){
$recargar_segundos = 10;
echo “”;
echo “”;
echo “”;
}

La pregunta es cuando se refresca la página del proyecto; se hace una nueva conexión a la bd de postgres creado como fuente o dicha conexión es permanente.

Es para solucionar un problema de tiempos de segundos que necesitamos reducir

Quedo atento,
Cordial Saludo

Hola Jhon,

cada pedido de pagina implica una nueva conexion a la bd, las conexiones en PHP duran un pedido de paigna… cuando muere el proceso, muere la conexion tambien.

Saludos

Ingeniero, gracias por la pronta ayuda
Hay alguna forma de manter persistente la conexión a la postgres, para evitar la reconexión dado que hay se estan perdiendo algún tiempo que se desea disminuir.

O hay alguna forma como una especie de bucle en lugar de refrescar la página ?

O cómo manejar una programación por hilos, es posible ? algún ejemplo ?

podría en lugar de refrescar, utilizar lo siguiente ? no se requiere mostrar nada, solo que dentro consumo y almaceno en la BD del negocio

function conf () {
while (TRUE) {
INSTURCCIONES_CONSUMIR_SERVICIO;
sleep (2);
}
}

Gracias y cordial saludo