La conexión de tus aplicaciones php con WebServices REST te permitirá ampliar tus capacidades apoyándote en servicios de grandes compañías.
Los detalles específicos dependen de las definiciones que haya realizado el productor del servicio pero, para no encontrarte con sorpresas, es buena idea tener claras las bases.
Repasemos los conceptos comunes a todo Servicio Web REST.
Qué es un webservice
Un webservice (o servicio web) es una forma de integrar aplicaciones web.
Básicamente se trata de un servidor que expone parte de su funcionalidad para que sus clientes (que generalmente son otros servidores de diferentes aplicaciones) puedan utilizarlas.
Las principales ventajas de usar web services son:
- La posibilidad de valernos de la capacidad instalada (¡y mantenida!) por terceros
- La facilidad para extender la funcionalidad de nuestra aplicación (Basta con realizar las llamadas al servicio web que deseamos)
La principal desventaja de usar este enfoque es que dependemos de servicios de terceros que, salvo en casos muy puntuales, no podemos controlar.
Ejemplos de webservices:
- Autenticación de usuarios vía Facebook, Google, Twitter, etc…
- Generación de mapas en tiempo real
- Consulta de cotizaciones de acciones
Qué es RESTful
RESTful es un modelo arquitectónico de software que plantea una suerte de volver a las fuentes.
Su filosofía se basa en el poder del protocolo HTTP (Subyacente en toda aplicación web), el cual incluye los conceptos de verbo (GET, POST, DELETE, PUT), recurso, código de errores (404, 500, etc…) y demás elementos que, en teoría al menos, deberían alcanzar para modelar cualquier tipo de interacción cliente-servidor.
Es muy común que en una aplicación RESTful los objetos o entidades del modelo de datos sean expuestos casi directamente, teniendo una URL específica para cada uno de ellos.
Por ejemplo, en una aplicación diseñada para una institución educativa sería esperable encontrarse con una URL de tipo:
http://miescuela.com/alumnos
Al realizar una petición de tipo GET a esta URL se esperará recibir información de los alumnos de esa institución.
A su vez, una URL del tipo:
http://miescuela.com/alumnos/14
Debería darme información del alumno cuyo id es 14.
Existe mucha controversia respecto de qué es una API RESTful y qué no lo es…
Sin entrar en mayor detalle, la idea es que, para consumir un servicio web basado en REST sólo se requiere conocer su URL (De nuevo, esto es en teoría… en la práctica se utilizan varias formas de modificación del pedido, como ser el envío de headers y demás).
Siendo que se trata de un servicio RESTful, la comunicación entre cliente y servidor es sencilla (A diferencia de lo que es un WebService SOAP), se trata simplemente de enviar un pedido HTTP y procesar su respuesta.
Cómo realizar peticiones REST con PHP
Existen varias opciones disponibles, veamos las más comúnmente utilizadas:
cURL
La librería cURL permite realizar peticiones a servidores remotos.
Si bien funciona, es un método de bastante bajo nivel, con sus pros y sus contras.
Volviendo al ejemplo que te comentaba antes, una forma de hacer la llamada sería esta:
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://miescuela.com/alumnos"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $res = curl_exec($ch); curl_close($ch);
En la variable $res
quedará la respuesta del webservice (Asumiendo por supuesto que no haya habido ningún problema de conexión, transferencia, etc…).
file_get_contents
Una opción alternativa (y generalmente más conveniente) es el uso de la función file_get_contents.
Esta función recibe como parámetro el nombre del archivo que se quiere leer y devuelve todo su contenido como un string.
Si bien el uso normal de la función es la lectura de archivos locales, php en realidad entiende a los archivos como flujos. Por lo tanto, si está todo bien configurado, una URL puede usarse como nombre de un flujo.
De este modo nos ahorramos muchas de las complicaciones propias de tratar con una interface de más bajo nivel (y, obviamente, perdemos cierto control, pero generalmente no es necesario hilar tan fino).
El ejemplo sería:
<?php $res = file_get_contents("http://miescuela.com/alumnos");
Cómo se procesan los resultados
Los resultados se procesan de acuerdo al formato de la respuesta.
Usualmente los Servicios Web devuelven XML o JSON (Existen otras posibilidades, claro, pero estas son las más comunes).
En el caso de tratarse de un XML, lo mejor es usar la biblioteca SimpleXML, si se trata de json, con json_decode será suficiente.
Si se trata de otro formato habrá que estudiar el caso puntual, pero en última instancia, siempre se trata de procesar un string…
Ejemplo de consumor de un WebService REST con PHP
MercadoLibre tiene una API RESTful que permite interactuar con el sitio de forma simple.
Veamos un ejemplo de una llamada de acceso público: la que nos da información básica de un usuario.
La URL que se utiliza es https://api.mercadolibre.com/users/USERID/
Por ejemplo https://api.mercadolibre.com/users/226384143/
retorna:
{ "id": 226384143, "nickname": "TETE9928972", "registration_date": "2016-08-25T11:36:00.000-04:00", "country_id": "AR", "address": { "city": "Palermo", "state": "AR-C" }, "user_type": "normal", "tags": [ "normal", "test_user", "user_info_verified" ], "logo": null, "points": 100, "site_id": "MLA", "permalink": "http://perfil.mercadolibre.com.ar/TETE9928972", "seller_reputation": { "level_id": null, "power_seller_status": null, "transactions": { "canceled": 0, "completed": 0, "period": "historic", "ratings": { "negative": 0, "neutral": 0, "positive": 0 }, "total": 0 } }, "buyer_reputation": { "tags": [] }, "status": { "site_status": "active" } }
Un string JSON.
El código completo para obtener esta información con php es:
<?php echo file_get_contents('https://api.mercadolibre.com/users/226384143/');
Claro que si quisiéramos hacer algo con esta información sería más conveniente hacer algo como:
<?php $data = json_decode( file_get_contents('https://api.mercadolibre.com/users/226384143/'), true ); echo $data['nickname'];
¡Listo! Ya estás en condiciones de integrar cualquier WebService RESTful en tu aplicación.
Más información sobre WebServices con PHP
Como te decía al comienzo, otro protocolo muy utilizado a la hora de conectar aplicaciones a través de Servicios Web es SOAP. Este protocolo es bastante más complejo que RESTful, principalmente porque se basa en intercambios de XML con un formato bastante particular.
Puedes intentar leer e interpretar estos XML por tus propios medios aunque lo más recomendable es utilizar las herramientas que PHP ofrece para ello.
De hecho, si te enfrentas a WebServices de basados en SOAP php tiene un soporte nativo muy completo.
- Cómo agregar una página de error 500 en un proyecto PHP - 31/10/2024
- ¿Cuántos contenedoresnecesita tu php? - 28/10/2024
- Cuál es el mejor framework PHP para hacer APIs REST - 25/10/2024
Mauro, como estas? vi que un comentario preguntaba acerca de la api de mercado libre. https://api.mercadolibre.com/sites/MLA/search?category=MLA1055 . Salen los resultados de todos los productos de la aplicacion, algo asi :
«paging»: {
«total»: 46935,
«offset»: 0,
«limit»: 50,
«primary_results»: 1000
usando el filtro &offset= puedo ver pero solamente dentro de los 1000 primeros resultados. Sabras como hacer para ver el resto?
Hola Ignacio:
¿Cómo estás? Me temo que eso es algo muy específico de la API de MercadoLibre. Tendrías que consultar la documentación oficial o directamente pedir ayuda a su soporte técnico.
Saludos,
Tengo un arreglo de la siguiente forma, como podria accederlo registro por registro.
AC-611
ACER-007
MOUSE PAD ACTECK CONFORT DE TELA CON REPOSA MUÑECA DE GEL NEGRO MODELO MG-1000
ACCESORIOS
ACTECK
1 ANIO
AC
-3
110.37
Pesos
http://www.grupocva.com/detalle_articulo/1120.jpg
26
AC-7005
AC-919098
GABINETE HDD 2.5 SATA IN. ACTECK USB 2.0 COLOR NEGRO AC-919098
CÓMPUTOACCESORIOS
ACTECK
1 ANIO
AC
13
103.33
Pesos
http://www.grupocva.com/detalle_articulo/10100084.jpg
83
Hola Eduardo:
No me queda muy clara la estructura de tu arreglo. ¿De dónde has obtenido esos datos? ¿Podrías mostrar algo de código?
disculpe y como tomar los valores si su ejemplo lo utilice para buscar articulos, para poder sacar el de resultados
{
«site_id»: «MLA»,
«query»: «Motorola G6»,
«paging»: {
«total»: 916,
«offset»: 0,
«limit»: 50,
«primary_results»: 916
},
«results»: [
{
«id»: «MLA810645375»,
«site_id»: «MLA»,
«title»: «Motorola G6 Plus 64 Gb Nimbus»,
«seller»: {
«id»: 143125485,
«power_seller_status»: «platinum»,
«car_dealer»: false,
«real_estate_agency»: false,
«tags»: []
},
cuando imprimo solo puedo traer el site_id y la query pero por ejemplo el paging no me sale como hacerle para que me muestre ese, y todo lo demas que esta hacia abajo?
Hola Luis:
Gracias por tu consulta. Ese texto que estás mostrando es json. Si utilizas la función json_decode podrás transformarlo en un arreglo de php y, luego, buscar los datos que necesites.
En tu caso sería algo como
$arreglo['paging']
. El detalle es que paging es, a su vez, un arreglo, con lo cual, para mostrarlo deberás usar algo diferente deecho
,var_dump
oprint_r
por ejemplo.Otra opción sería buscar directamente algún elemento dentro de paging, en tal caso sería algo como
$arreglo['paging']['total']
.Saludos,
Buenas tardes, esta genial la info.
Tengo un problema y es que acabo de terminar la universidad, y no enseñaron como hacer esto.
Donde trabajo me pidieron hacer una webservice que actúe como un conector entre 2 bases de datos, básicamente extraer datos específicos de algunos productos y actualizarlos en la otra base de datos.
Me gustaría saber como es posible realizar esta operación, llevo días buscando info, y como que no cuadran que lo que busco.
Espero puedan responder mi consulta
Desde ya muchas gracias.
Hola David:
Es un poco complejo el escenario que planteas, hay mucho por analizar para dar una respuesta adecuada. En principio deberías pensar si vas a usar un servicio Rest (Yo lo recomendaría) o un SOAP.
Por otro lado, imagino que tienes acceso a ambas aplicaciones, ¿correcto?
Lo que deberías hacer pues es armar un servidor del lado de la aplicación que debe recibir la información y un cliente que la envíe del otro.
Te recomiendo usar json como formato de los intercambios para hacer simple la comunicación y algún mecanismo de seguridad como ser agregar algún encabezado especial, una lista de IPs aceptables o similar.
Saludos,
Agrego un link a un video que armé como respuesta a esta pregunta: https://www.youtube.com/watch?v=sjbnMXPJWQM
Hola Mauro excelente articulo muy claro y con las pruebas de concepto funcionando, mi consulta es como desarrollo un api rest estilo https://dominio/directorio/parametro?token=XXXXXXXX me refiero al metodo de autenticacion por token gracias de antemano.
En general los token se envían a través de encabezados, depende mucho de cómo quieras implementar la seguridad.
Podés usar tokens generados por tu aplicación, algún tipo de autenticación de terceros (Tipo OAuth) o incluso algo como JWT (jwt.io).
Te recomiendo investigar un poco también sobre HMAC.
Exitos!
Muchas Gracias por responder tomare tus recomendaciones
Hola.
Muy buena tu página y la ayuda que brindas te felicito!!. Si es posible consultar…tengo un problema con una página web que al rescatar los datos de un cliente, si entran al mismo tiempo al portal los 2 clientes, se muestran los datos de forma cruzada, es decir al cliente A le muestra las facturas del cliente B y viceversa.
El portal está hecho en php y rescatamos los datos de SAP mediante Odata y no se me ocurre que pueda ser,me puedes dar una opinión por favor.
De antemano muchas gracias.
Hola Oscar!
Muchas gracias por tus palabras 🙂
Que raro lo que comentas. En principio lo único que se me ocurre preguntar es cómo identificas al cliente del lado del portal y cómo realizas la consulta en SAP.
Si cada sesión lleva su propio identificador no deberías tener ese problema.
Hola Mauro… Que tal?
Consulta:
¿Cómo puedo llamar un método de un ws enviándole un parámetro json?
Gracias de antemano.
Un saludo
Jorge
Hola Jorge!
Pues depende un poco de lo que haya del otro lado, es decir, cómo espera el servidor recibir tal parámetro. La primera pregunta es: ¿se trata de un webservice Rest o SOAP?
En cualquiera de los casos, un json no es más que un string… puedes usar la función json_encode para generarlo a partir de un arreglo de php.
Exitos!
como envio parametros a travez de file_get_contest?
por ejemplo si hago un login tengo que enviar a la api el usuario y la contraseña para rwecibir una respuesta no?
Saludos
Hola Gabriel!
Depende un poco de lo que esté esperando el servicio al que te quieres conectar.
Un login podría hacerse utilizando autenticación HTTP básica, en cuyo caso simplemente deberías anteponer las credenciales a la URL del archivo que deseas abrir, algo como:
$resultado = file_get_contents("http://usuario:password@dominio.com/web_service");
Si se trata de autenticación a través de encabezados deberías utilizar el tercer parámetro de la función ($context) en conjunto con stream_context_create para especificar los datos en cuestión.
Exitos!
Gracias Totales. Pase horas buscando esta info de mercado pago y lo resolvistes en dos lineas !!!!!!!
Para la consulta del json en el segundo nivel use esto:
$impneto = $data[‘transaction_details’][‘net_received_amount’];
Y ya dicho sea de paso la info del sitio es escasa y confusa. (la de MP)
gracias de nuevo.
Daniel
Gracias por tu comentario Daniel!
Me alegra haberte ayudado!
Lamentablemente no puedo editar la info del sitio de MP 🙂
Saludos!
Amigo, excelente ayuda, soy nuevo en php, necesito tomar el valor del dolar de esta web https://s3.amazonaws.com/dolartoday/data.json como puedo hacerlo en Php…De antemano gracias desde venezuela…Saludos
Hola Miguel!
Para tomar el valor necesitas analizar el json que devuelve esa página.
Nota que tienes una sección que dice:
"USD": {
"transferencia": 2509032.82,
"transfer_cucuta": 2509032.82,
"efectivo": 87750.00,
"efectivo_real": 87750.00,
"efectivo_cucuta": 87750.00,
"promedio": 2509032.82,
"promedio_real": 2381793.65,
"cencoex": 129000300.49,
"sicad1": 2192725.17,
"sicad2": 2381793.65,
"bitcoin_ref": 2192725.17,
"localbitcoin_ref": 2192725.17,
"dolartoday": 2509032.82
},
Hay muchos valores posibles, deberías mirar cuál es el que buscas.
En todo caso, puedes tomar los datos usando algo como:
$datos = file_get_contents('https://s3.amazonaws.com/dolartoday/data.json');
$array = json_decode($datos, true);
$valor = $array['USD']['dolartoday'];
Saludos!
Amigo, excelente, gracias por tu pronta respuesta, yo estaba haciendo algo parecido, pero cuando uso algo como
$datos = file_get_contents(‘https://s3.amazonaws.com/dolartoday/data.json’);
$array = json_decode($datos, true);
$valor = $array[‘USD’][‘dolartoday’];
y al final var_dump($valor) me muestra NULL…en la pantalla
uso el var_dump porque no me muestra ninguno de los datos usando la nomenclatura
$valor = $array[‘USD’][‘dolartoday’]; con esto estoy tranado de ver el contenido del array asociativo pero nada…Saludos y gracias de antemano…
Eso es raro… habría que ver si lo que está retornando ese sitio es efectivamente json bien formado.
Si pruebas:
json_decode($datos,true,512,JSON_THROW_ON_ERROR)
Notarás que te da un error.
Tal vez te sirva usar:
$datos = json_decode(file_get_contents('data.json'),true,512,JSON_INVALID_UTF8_SUBSTITUTE|JSON_THROW_ON_ERROR)
En su lugar.
Exitos!
Gracias nuevamente, pero no funciona, sigue arrojando Null, yo tomo el resultado de https://s3.amazonaws.com/dolartoday/data.json y eso lo subo a json validator y me dice que es un json válido, de hecho despues de $datos = file_get_contents(‘https://s3.amazonaws.com/dolartoday/data.json’); si hago var_dump a $datos me muestra el array…string(2628) «{ «_antibloqueo»: { «mobile»: «https://dolartoday.com», «video»: «», «corto_alternativo»: «https://bit.ly/venezuela911», «enable_iads»: «», «enable_admobbanners»: «ca-app-pub-8212448379596570/1946229161», «enable_admobinterstitials»: «», «alternativo»: «68747470733a2f2f64327874647432303130383539632e636c6f756466726f6e64742e6e6574», «alternativo2»: «68747470733a2f2f64327874647432303130383539632e636c6f756466726f6e64742e6e6574», «notifications»: «https://d3c134ru0r3b0g.cloudfront.net», «resource_id»: «33504 A» }, «_labels»: { «a»: «DOLARTODAY», «a1»: «CUCUTA (EFECTIVO)», «b»: «CUCUTA», «c»: «DOLAR BCV», «d»: «DOLAR BITCOIN», «e»: «PETRO» }, «_timestamp»: { «epoch»: «1618671609», «fecha»: «Abril 17, 2021 11:00 AM», «fecha_corta»: «Abr 17, 2021», «fecha_corta2»: «Abr 2021», «fecha_nice»: «Abril 17, 2021», «dia»: «S�bado», «dia_corta»: «S�b» }, «USD»: { «transferencia»: 2509032.82, «transfer_cucuta»: 2509032.82, «efectivo»: 87750.00, «efectivo_real»: 87750.00, «efectivo_cucuta»: 87750.00, «promedio»: 2509032.82, «promedio_real»: 2381793.65, «cencoex»: 129000300.49, «sicad1»: 2240965.55, «sicad2»: 2381793.65, «bitcoin_ref»: 2240965.55, «localbitcoin_ref»: 2240965.55, «dolartoday»: 2509032.82 }, «EUR»: { «transferencia»: 2734845.77, «transfer_cucuta»: 2734845.77, «efectivo»: 95647.50, «efectivo_real»: 95647.50, «efectivo_cucuta»: 95647.50, «promedio»: 2734845.77, «promedio_real»: 2596155.08, «cencoex»: 140610327.53, «sicad1»: 2442652.45, «sicad2»: 2596155.08, «dolartoday»: 2734845.77 }, «COL»: { «efectivo»: 0.0400, «transfer»: 0.0400, «compra»: 0.0400, «venta»: 0.04 }, «GOLD»: { «rate»: 1400 }, «USDVEF»: { «rate»: 1 }, «USDCOL»: { «setfxsell»: 3510.00, «setfxbuy»: 3030.00, «rate»: 4080.00, «ratecash»: 3196.00, «ratetrm»: 3510.00, «trmfactor»: 0.2, «trmfactorcash»: 0.06 }, «EURUSD»: { «rate»: 1.09 }, «BCV»: { «fecha»: «1522123200», «fecha_nice»: «Marzo 27, 2018», «liquidez»: «328.319.818.517», «reservas»: «9.444.000» }, «MISC»: { «petroleo»: «57,83», «reservas»: «9,4» } }»
pero si lo uso con la variable de json_decode, me arroja Null….que locura…
Gracias de antemano por tu tiempo…
Probaste lo que te sugerí? Yo lo hice ye funciona ok.. será tu versión de php?
deseo consumir esta api
https://dniruc.apisperu.com/api/v1/dni/47286496?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6ImouY2hlY2FAb3V0bG9vay5lcyJ9._3Ub0nT_t9Yhu9DNWJt9IBMshu0cAM1xhKosYWVI8Vg
y mostrar en un index de forma ordenada como podría hacer disculpen
Hola Juan:
Pues a priori parece que la API responde con un json… puedes usar un simple:
<?php
$response = file_get_contents('https://es.gravatar.com/userimage/19138993/4eebd238db487f97a6ae78f55c9bbf08.jpeg');
$array = json_decode($reponse, true);
Y luego mostrar el contenido del array como quieras. ¿Qué es lo que quieres ordenar?
O mejor dicho, ¿cómo esperas que se vea la salida?
Si necesito introducir una clave para acceder, cómo lo puedo poner?
Me marca este error
failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error
Hola Mike:
Eso depende de cómo lo requiera el servicio al que te estás queriendo conectar.
Una forma simple es ponerlo dentro de la URL:
http://usuario:contraseña@dominio.com/webservice
También depende un poco del cliente que estés usando… si compartes algo de código podré chequearlo.
Hola, estoy intentando consumir un servicio api rest. Al hacerlo con file_get_contents, me dá este error: Warning: file_get_contents(https://api.bitso.com/v3/ticker?book=xrp_mxn): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in G:\servidores\wamp\www\api-rest-generica\rest.php on line 64. Al hacerlo con curl me dá este error: SSL: certificate subject name ‘xx.este.cu’ does not match target host name ‘api.bitso.com’. Ayuda por favor. Saludos.
Hola Yoislán,
Gracias por tu pregunta. Para empezar, te diría que intentes abrir esa url usando tu navegador.
Lo probé usando Google Chrome y no tuve problemas, de hecho, esto es lo que veo:
{"success":true,"payload":{"high":"14.9700","last":"13.7322","created_at":"2020-11-25T18:34:55+00:00","book":"xrp_mxn","volume":"15824078.79321127","vwap":"13.6811958448","low":"12.3431","ask":"13.7540","bid":"13.7215","change_24":"0.0465"}}
Por otra parte, si lo intento con cURL me da error 400 así que sospecho que hay algún tipo de chequeo de User-Agent del lado del servidor.
Por el error que te da el cURL parece que tienes un problema de certificados en tu servidor…
Gracias por la respuesta, ya resolví, a la verdad el código lo tengo bien y los dos métodos me funcionan bien, pero la empresa no tiene definido esos proxy, o sea, es un problema de proxy, que cuando le doy un nombre externo no lo entiende porque no los tiene configurados y me lanza esos errores. Lo hice local y me funcionó perfectamente. Gracias por la respuesta amigo. Saludos.
De nada! Me alegro que lo hayas podido resolver!
Hola si, es la primera vez que voy a trabajar con un web service, el de Andesmar, de Argentina. Me pasan la documentacion en donde figura el envio de parametros para obtener un xml con los datos. Habla por ejempolde un «Nombre del método: SeguimientoGuiasCorp» y un objeto logueo con los siguientes parámetros string usuario, strig clave, string numero de cliente. Como se estructura el envio de esos datos?
Hola Fernando, gracias por tu pregunta 🙂
La forma de enviar esos parámetros depende de la definición del WebService.
La primera pregunta a contestar es: ¿es un WebService REST o SOAP?
Por lo que comentas parece más SOAP que REST… te recomiendo que leas este artículo y este otro.
Saludos!
Muchas gracias por tu respuesta!! Voy por alli.
Estoy haciendo un proyeto con php laravel, composer, tengo un link o boton (como sea es el mismo efecto) en donde tengo un articulo, pero al darle click, quiero que me retorne un valor mediante svc?wsdl, es posible?
Hola Jorge:
Gracias por tu pregunta. No estoy seguro de lo que quieres hacer, a qué te refieres con «svc?wsdl»?
Saludos,
Saludos!
Me salvaste la vida. En un proyecto, implementé un autoload personal y no me percaté que necesitaba consumir una api de un tercero que usaba composer para manejar sus clases; cuando seguí las indicaciones del tercero me topé conque tenía ahora dos autoload y por consecuencia, errores por todos lados al llamar a las clases. Pero, separé ese api y lo use como un WS usando la forma que recomiendas y ha funcionado de forma excelente.
Me ahorré el tener que reescribir todo el proyecto, y mira que ya llevo un buen rato con eso. Aunque sé que debo de usar composer para la próxima desde el principio.
Éxito y gracias de nuevo!
Oh, pues muchas gracias por tu comentario, me alegro de haberte ayudado 🙂
Un detalle que podría servirte en el futuro es usar la función spl_autoload_register en lugar de __autoload.
Con esta función puedes «apilar» tu autoload a la par del de alguna librería.
O bien puedes construir tus propias clases siguiendo los estándares PSR para aprovechar el autoload de composer.
Exitos!
Gracias Mchojrin. Una duda y espero poder ser claro. En los comentarios ya nos explicaste cómo enviar datos de autenticación en las cabeceras como el ApiKEY, Tokens, etc mediante el contexto de la petición, pero si aparte del encabezado, necesitamos enviar también parámetros en la petición POST para que el API gestioné estos parámetros con su lógica interna y nos devuelva una respuesta, ¿cómo lo haríamos?
Doy un ejemplo esperando aterrizar mi consulta. Estamos consumiendo un API que permite crear registros de automóviles y el método expuesto de dicha API requiere ciertos parámetros con tipos de datos específicos, parafraseando un poco el API que estamos consumiendo nos dice, si quieres crear un modelo de auto nuevo en mi sistema necesito que consumas el metodo https://dummy.host.es/automovilles/crearNuevoAuto y necesito que me envies estos 3 parámetros, nombreFabricante – string, anioFabricacion -int, tipoCarroceria – int. Cómo podemos enviar esos parámetros en la petición usando file_get_contents o cURL ¿se puede con cualquiera o debemos optar por algún método específico en un caso así?
Es un ejemplo muy básico pero vale para cualquier integración que se nos ocurra y sería de mucha duda tu perspectiva al respecto.
De antemano muchas gracias. Es un excelente artículo.
sería de mucha ayuda no duda, disculpas.
Hola!
Si se trata de una petición POST no te va a servir file_get_contents. Podrás usar cURL o alguna otra librería (Guzzle por ejemplo).
Exactamente cómo hacerlo depende de lo que esté esperando la API… Puedes usar el POST crudo o simular un formulario, depende de cómo esté diseñada la API.
Saludos!
Hola ¿Cómo estás ? te agradecería inmensamente si pudieras ayudarme con esta consulta , ¿Cómo puedo ingresar los datos que trae el api rest en los options de un select para un formulario en php ?
Hola Lina!
¿Cómo estás? Gracias por tu pregunta 🙂
En esencia no es muy diferente de lo que harías si tuvieras los datos guardados en una base local, se trata pues de:
La dificultad que podrías encontrar depende de cuál sea exactamente la respuesta que obtendrás de la llamada a la API.
Si se trata de un json puedes usar json_decode (más detalles puedes encontrar en aquí).
Si es XML te conviene usar SimpleXMLElement.
Espero haberte ayudado, cualquier otra duda me puedes dejar otro comentario 🙂
Hola, Estoy tratando de conectarme a una api de una plataforma ( o pagina, no me queda claro) llamada Zoho, lo estoy haciendo (vale aclararlo creo) con PHP. mi problema es que no consigo hacer la peticion GET, que debo hacerlo para que entonces logre obtener el codigo en la url que me llega de ese pedido, para luego enviar un POST con ese codigo obtenido y de ese modo, obtener en esta segunda URL otro codigo distinto. (En caso de haberme expresado correctamente) Como puedo hacer para automatizar una llamada GET a una pagina?
Como puedo configurar los parámetros que debo enviar?
Hola Luciano!
Conozco la plataforma Zoho aunque nunca me ha tocado usarla programáticamente así que desconozco los detalles específicos de su API.
Sería bueno si pudieras dar más detalles acerca de por qué no consigues hacer la petición GET… ¿recibes algún error? ¿No conoces las librerías que podrías utilizar? ¿Qué es exactamente lo que te impide realizar la petición?
En principio puedes hacer una petición GET usando cURL, file_get_contents o alguna librería más elaborada como Guzzle… todo dependerá de tu necesidad.
Respecto de los parámetros, una petición GET a un webservice es igual a una petición GET cualquiera… es decir, necesitas formar un string que contenta los parámetros codificados como una URL (separando la URL del primero mediante un caracter «?» y luego cada parámetro adicional mediante «&»).
Estoy desarrollando una web de reservas de ciertos locales. La idea es que puedan reservar desde mi web en otros locales de tal manera que , en mi web, salgan los datos actualizados de las reservas de ese local. ¿Cómo lo implemento? ¿Necesito que el local(que tienen web) me proporciones una API Rest?. Ayúdame por favor.
Gracias
Hola:
Si los locales tienen una API REST (O pueden desarrollarla) puede ser una buena solución. Lo importante es que tengas un modo de mantener todo sincronizado… Si los locales son todos tuyos podrías tener una única base de datos centralizada a la que todos accedan mediante alguna conexión segura o algún tipo de middleware con el que todos se comuniquen… habría que ver un poco más el contexto.
El punto es que necesitarás algún mecanismo para consultar las reservas que se hicieron en cada local y para «inyectar» tus propias reservas en cada uno.
Esto puede resolverse bien con algúna API (Sea REST, SOAP u otra)
como podria consumir el servicio si deseo insertar datos
Hola Marcos:
Gracias por tu pregunta! Todo depende de cómo esté armada la API a la que te estás conectando. Puede ser que requiera que le envíes json, tal vez XML o tal vez usa algún otro mecanismo de recepción de parámetros…
En todo caso, lo que seguramente tendrás que hacer será realizar un POST al servidor.
Saludos
hola amigo aun no he consumido ninguna api rest y quiero aprender a hacerlo desde cero me puedes ayudar en algo de como empezar etc algun tutorial o algo , uso php , gracias
Hola David!
Pues puedes ver mi libro sobre WebServices.
Si tienes alguna duda simplemente pregunta 😉
Hola, tengo que integrar un token que se genera cada 15 minutos para validar el acceso al webservice, como puedo integrarlo?
Pues eso depende de la especificación del webservice al que te estés queriendo conectar… ¿Quién genera el token? ¿Cómo lo obtienes? ¿Cómo lo envías? Con esas respuestas podrás ver el código que debes escribir.
Este es el codigo que genera el token,
«http://191.98.194.210/casospropiosapi2/token»,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => «»,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => «POST»,
CURLOPT_POSTFIELDS => «username=uXXXXXX&password=XXXXXXXX&grant_type=password&undefined=»,
CURLOPT_HTTPHEADER => array(
«Content-Type: application/x-www-form-urlencoded»,
«Postman-Token: af6dfe86-d223-4926-bdf6-8f357c4b3b33»,
«cache-control: no-cache»
),
));
$atoken = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo «cURL Error #:» . $err;
} else {
echo $atoken;
}
?>
Se ve algo asi:
{«access_token»:»x-kuOcfpZAAV-MaNqbWU3n25dNKlRuuK6JHYVpXb1gxnzsAj8KwLlAorpLMFeZNQ4MCwe4Sd2-YvSLLQqoLBo4fehYJuQasXupv9MYcMZYa5XgdRqcWYZjVp9omnqh0h3iapVwbsUlyelYH1QiXyHMMIqFvwns7vwUZOmkRMef4PX2soLe7pUHuq10N5BryWR2EcLFFepbsq-KerhoRlMD_SguvoCBC-ajxdvZQlqZIr4um1brbT_Tf6MpZjgoC9fuqR-WfjQzG4cSnSENv6ukFQo7FiaAxbP19qwYdij-fHNT2hhcOnT_7vPZtqfX_A»,»token_type»:»bearer»,»expires_in»:599}
Luego de generarlo, lo tengo que usar para usar la api:
«http://191.98.194.210/casospropiosapi2/api/casasdisponibles/authenticate»,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => «»,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => «GET»,
CURLOPT_POSTFIELDS => «username=usuario_web&password=snY8SOUEHxQxyCbFd0rDgQ%3D%3D&grant_type=password&undefined=»,
CURLOPT_HTTPHEADER => array(
«Authorization: bearer AQUI COPIO TODO EL CODIGO QUE SE GENERA ANTERIOMENTE «,
«Postman-Token: d09935ae-dcbb-44c2-b662-4b0f8fb26007»,
«cache-control: no-cache»
),
));
$respuesta = curl_exec($casas);
$err = curl_error($casas);
curl_close($casas);
if ($err) {
echo «cURL Error #:» . $err;
} else {
echo $respuesta;
}
?>
No sé si estoy entendiendo bien tu duda… por lo que veo el código de obtener y enviar el token lo tienes resuelto…
Lo que imagino que te está complicando la historia es lo del vencimiento cada 15 minutos, ¿es así? En tal caso lo que podrías hacer es guardar el token actual en un archivo de texto (en algún directorio seguro) y leerlo cada vez que tienes que enviar un nuevo pedido.
Paralelamente podrías tener un cronjob corriendo cada 15 minutos para generar un nuevo token y guardarlo en ese mismo archivo para que esté disponible para el próximo pedido.
Excelente el aporte, te felicito. Agradezco si me puedes ayudar a resolver mi inconveniente. Estoy haciendo pruebas desde mi localhost, consumo los datos perfecto, una vez publicado mi proyecto, se recibe codigo 404. inclusive hago pruebas con postman y fiddler, todas con codigo 200 Ok,
Muchas gracias Sergio! Me alegro que te haya servido :). ¿Cómo es eso de «una vez publicado»? ¿Te refieres a cuando lo subes a un hosting?
Lo que deberías verificar primero que nada es si desde la máquina donde estás realizando las pruebas tienes conectividad al servidor al que estás tratando de acceder… imagino que sí porque si te responde con un 404 eso quiere decir que hay un webserver del otro lado…
Otra cosa que puede pasar es que el webserver esté mal configurado y, por lo tanto, no esté dirigiendo correctamente las peticiones hacia tu webserver.
Genial Mchojrin, muy claro y simple! Te consulto, como hacer para leer respuesta del tipo «ok 200» porque esto viene en el encabezado del mensaje. Muchas gracias! PD ya me suscribí!
Gracias NachoV! Si necesitás ver los encabezados del mensaje no te va a servir file_get_contents, si no cURL… aunque no va a ser una tarea sencilla…
Acá tenés un ejemplo que te puede ayudar: https://beamtic.com/curl-response-headers.
Saludos!
Hola, muchas gracias por el post. Queda claro como consumir un WS pero quisiera saber como generar un Web Service yo similar al de Mercado Libre el cual devuelve la info de un usuario si existe ese ID. Quisiera saber como generarlo para que alguien pueda ejecutar una consulta a mi base de datos enviando, por ejemplo, el DNI de una persona y yo devolverle los datos de la misma en caso de existir.
Hola:
Gracias por tu consulta. Lo puedes leer en https://academy.leewayweb.com/como-exponer-un-webservice-rest-con-php/
Saludos
Hola buen día buen POST, como puedo mandar el API Key y API Secret ?
Hola Luis:
Muchas gracias por tu comentario. El modo de enviar la API Key y el API secret dependen de cómo los espera recibir el servicio al que quieres conectarte.
Usualmente esos datos se envían a través de encabezados HTTP, deberías hacer algo como:
curl_setopt($ch, CURLOPT_HTTPHEADER, [
‘X-API-Key: AAAAEEEECCCCCC’,
‘X-API-Secret: Th1S1sSup3rS3cr3t’
]);
Antes de enviar la petición cURL o, si vas a usar file_get_contents:
$opts = [
«http» => [
«method» => «GET»,
«header» => «X-API-Key: AAAAEEEECCCCCC\r\nX-API-Secret: Th1S1sSup3rS3cr3t\r\n»
]
];
$context = stream_context_create($opts);
$file = file_get_contents($serviceURL, false, $context);
Hola, soy nuevo desarrollando, he leído sobre web services pero no lo tengo muy claro, Actualmente estoy desarrollando un app que hace reservaciones. El avance que tengo es el registro y login comunico los datos en una web services en php y bd en mysql. Para hacer la reservación me dicen que tiene que ser en tiempo real ya que el administrador debe ver la solicitud de reservación apenas la genere el cliente, la consulta es si hago el código respectivo para guardar la reservación mediante web service que tengo, esta acción no es en tiempo real?. Que tendría que implementar para que el administrador vea la solicitud en tiempo real. Apreciaría mucho su respuesta y muchas gracias!
Hola Miguel:
Para empezar te diría que no te vuelvas muy loco :). El término «tiempo real» suele estar mal utilizado (Te dejo acá una referencia a la definición formal: https://es.wikipedia.org/wiki/Sistema_de_tiempo_real). En tu caso, imagino que un retraso de 5 minutos no va a cambiarle la vida a nadie (Y para tiempos computacionales ¡5 minutos es un montón de tiempo!).
Respecto de la pregunta, es un poco difícil de responder sin ver el contexto así que haré algunos supuestos:
– Asumiendo que el administrador tiene acceso a la misma aplicación donde se realizan las reservas, algo que podrías hacer es utilizar un mecanismo de polling (https://es.wikipedia.org/wiki/Polling) que se comunique desde el frontend con un webservice que tengas en tu servidor. Este WS debería chequear en la base de datos las reservas generadas desde la última consulta y retornar esos datos (Probablemente como json). Con esa información, desde el frontend podrías mostrar algún popup y listo.
Otra opción similar es usar push notifications (https://blog.embluemail.com/como-funciona-push-notifications/).
– Si el administrador no tiene acceso a la aplicación deberás enviarle las notificaciones de alguna otra forma (Por mail, sms, whatsapp, etc…). En este caso sería importante que la notificación se dispare apenas se recibe la reserva en tu sistema.
– Si el administrador tiene su propia aplicación (Un CRM por ejemplo), seguramente requiera que tu aplicación exponga alguna API a través de la cuál el pueda integrar su sistema y ver las reservas como le sea más conveniente.
Creo que con eso tienes para entretenerte un rato 🙂
Hola! Gracias por el artículo. A quien me pueda ayudar: Crees que esta es la mejor forma para que mi App móvil Android/iOS rescate datos de mi base de datos en mi servidor? Planeo usar Ionic para la App. Gracias!
Hola!
Gracias por tu comentario :). No conozco mucho de Ionic pero imagino que se podrá consumir un RESTful webservice de modo similar.
En este artículo explico cómo hacerlo utilizando PHP.
Lo que deberías hacer es que tu aplicación Android se comunique con un backend y el backend sea el que rescate los datos de tu base.
Ese backend lo puedes desarrollar en PHP sin problemas y luego exponer los datos rescatados a través de un servicio REST para que lo consuma tu app. Puedes ver cómo hacer eso en este artículo: https://academy.leewayweb.com/como-exponer-un-webservice-rest-con-php/
Saludos!
Gracias, excelente información. (El final del Post super, dispuestos a ayudar).
Gracias Jorge! No olvides compartir ?