Importación de datos de servicios web: la nueva solicitud HTTP en JMP ® 14 (US 2018 231)
Nivel: Intermedio
Bryan Boone, JMP Desarrollador principal de software, SAS
Las entidades gubernamentales y privadas publican cada vez más sus datos en internet mediante servicios RESTful. JMP 14 incluye una nueva función llamada Solicitud HTTP , disponible a través de JSL, que permite acceder a estos servicios RESTful. Este documento describe qué son los servicios RESTful y ofrece varios ejemplos sobre cómo usar la Solicitud HTTP para importar nuevos datos a JMP.
¿Qué es REST?
REST, o transferencia de estado representacional, es una forma de proporcionar interoperabilidad entre sistemas informáticos en Internet. Un servicio RESTful es un servicio web que utiliza este paradigma. Una API RESTful es una interfaz de programación de aplicaciones (API) que utiliza solicitudes HTTP para obtener , publicar , colocar y eliminar datos para interactuar con el servicio RESTful.
El protocolo HTTP define un conjunto de métodos HTTP de solicitud para indicar la acción que un cliente desea que el servidor realice en un recurso. Estos son:
|
CONSEGUIR
|
Solicitar el recurso
|
|
CABEZA
|
Solicitar únicamente metadatos del recurso
|
|
CORREO
|
Solicitudes para aceptar el recurso
|
|
PONER
|
Solicitudes para almacenar o crear el recurso
|
|
BORRAR
|
Solicitudes para eliminar el recurso
|
|
PARCHE
|
Solicitud para modificar el estado de un recurso
|
Nueva terminología, actividades familiares
Puede que parezcan conceptos completamente nuevos, pero ya estás familiarizado con dos de los métodos de solicitud más comunes, CONSEGUIR y CORREO .
CONSEGUIR
CONSEGUIR
has two personalities.
La primera personalidad simplemente está ejecutando un recurso. Es decir, la intención es simplemente acceder a un recurso web. Esto se puede ver en la Figura 1. Aquí, el navegador accede a la página web. 
Figura 1. “ CONSEGUIR para un recurso web”
El segundo es el acceso a un recurso mediante CONSEGUIR , junto con lo que se conoce como cadena de consulta. Una cadena de consulta es un conjunto de pares clave-valor definidos por el recurso web y utilizados por el cliente para solicitar al servidor que filtre o modifique la solicitud CONSEGUIR utilizando estos parámetros. Esto se puede ver en la Figura 2. Aquí, el navegador solicita al servidor que modifique una solicitud CONSEGUIR mediante:
CORREO
CORREO , por otro lado, es más complejo. Un CORREO solicita al servidor que modifique o cree un recurso. Un CORREO suele contener un formulario HTML que, a su vez, contiene una colección de pares clave-valor de datos de caracteres y/o pares clave-valor de archivos. La Figura 3 muestra un ejemplo que registra a un usuario en Amazon. Aquí, los pares clave-valor son:
|
Correo electrónico
|
Su correo electrónico de inicio de sesión
|
|
Contraseña
|
Tu contraseña
|
El botón “Iniciar sesión” realiza la operación de CORREO
Figura 3. “Datos del formulario CORREO a un recurso web”
¿Por qué usarlo?
El protocolo HTTP nos permite pensar en las autopistas de la información como: «Las carreteras están pavimentadas, las señales de tráfico están instaladas y los puentes se han construido». El estándar ha permitido la formación de nuevas empresas de gestión de datos. Además, la adopción del estándar HTTP ha eliminado los silos de información que suelen encontrarse en las empresas consolidadas. Algunas de estas empresas incluyen:
|
Text-Processing.com (Datos de sentimiento)
|
Jenkins
|
|
Hay
|
El HUB
|
|
Oficina 365
|
Google
|
|
Buzón de entrega
|
Una unidad
|
|
AWS (Servicios web de Amazon)
|
Oficina del Censo de los Estados Unidos
|
|
EN
|
PubChem
|
|
El New York Times
|
Fitbit
|
|
Yahoo
|
Bitcoin
|
|
Cómics de Marvel
|
SAS
|
|
OpenAQ
|
JMP
|
Cómo usarlo
JSON
JSON (Notación de Objetos JavaScript) es un formato ligero de intercambio de datos. Se basa en un subconjunto del lenguaje de programación JavaScript. JSON es un formato de texto independiente del lenguaje, pero utiliza conceptos que la mayoría de los programadores ya conocen.
JSON se basa en dos estructuras:
- Una colección de pares nombre/valor. (diccionario, tabla hash, matriz asociativa, …)
- Una lista ordenada de valores. (matriz, vector, lista, ...)
Nueva terminología, actividades familiares (de nuevo)
JSL
JSL es el lenguaje de scripting preferido cuando se trata de JMP. JSON puede ser un término nuevo, pero JSL admite las dos estructuras de datos que JSON requiere.
Lista
Las listas son contenedores para almacenar elementos, como los siguientes:
- números
- variables
- cadenas de caracteres
- expresiones (por ejemplo, asignaciones o llamadas de función)
- matrices
- listas anidadas
Matriz asociativa
- Una matriz asociativa asigna claves únicas a valores que pueden no ser únicos. Una matriz asociativa también se denomina diccionario, mapa, mapa hash o tabla hash.
JSL también contiene dos funciones que son específicas del procesamiento de JSON.
Analizar JSON
- Convierte texto JSON en una matriz o lista asociativa según la estructura de los datos JSON.
Como expresión JSON
- Devuelve una representación JSON de la expresión.
Estas funciones permiten al escritor de scripts convertir sin problemas hacia y desde contenedores JSL y JSON.
Solicitud HTTP
Solicitud HTTP es una novedad en JMP 14. Originalmente, esta tecnología se creó para gestionar la interacción entre JMP y JMP Public. Pronto se observó que tenía otras aplicaciones además de la publicación de datos en JMP Public, por lo que se presentó en JSL como Solicitud HTTP .
Introducción a las solicitudes HTTP
Solicitud HTTP admite sin problemas los protocolos http y https y encapsula gran parte del comportamiento que esperarías de cURL.
cURL se utiliza en líneas de comandos o scripts para transferir datos. También se utiliza en coches, televisores, routers, impresoras, equipos de audio, teléfonos móviles, tabletas, decodificadores, reproductores multimedia y es la columna vertebral de la transferencia de datos por internet para miles de aplicaciones de software que afectan a miles de millones de personas a diario.
Más importante aún, se puede pensar en Solicitud HTTP como el nexo que une los recursos web con JSL. Es decir, Solicitud HTTP se comunica con un recurso web y permite al creador del script procesar las respuestas en JSL. La complejidad de JSL la controla el autor.
Los métodos HTTP más comunes que utiliza al interactuar con un recurso web son:
Uso de una solicitud HTTP en una acción GET
La acción CONSEGUIR es probablemente la acción HTTP de Solicitud más común. Es de solo lectura y permite importar datos a JMP.
Mensajes comunes para Solicitud HTTP :
-
"Método"
-
“URL”
-
“Cadena de consulta”
-
"Enviar"
Figure 4. “
Solicitud HTTP
CONSEGUIR
”
Las acciones de Solicitud HTTP CONSEGUIR suelen ir acompañadas de una cadena de consulta para enviar parámetros a un recurso web. La Figura 5 utiliza una Solicitud HTTP con una cadena de consulta . En JSL, una cadena de consulta es un array asociativo que asigna una clave a un valor de carácter o a una lista de valores de caracteres. Al ejecutar el script de la Figura 5, la URL se expandirá automáticamente a:
http://quotes.rest/qod.json?category=inspire
Figura 5. “ Solicitud HTTP CONSEGUIR utilizando una ' Cadena de consulta' ”
Uso de una solicitud HTTP en una acción POST
Las acciones de Solicitud HTTP CORREO suelen ser más complejas.
Mensajes comunes para Solicitud HTTP :
-
"Método"
-
“URL”
-
"Forma"
-
“JSON”
-
"Archivo"
-
"Gota"
-
"Enviar"
La Figura 6 muestra los datos de un formulario HTTP de Solicitud . En JSL, los datos de un formulario pueden tener dos atributos: "Campos" y/o "Archivos" . Ambos son matrices asociativas JSL que asignan una clave a un valor de carácter o a una lista de valores de caracteres. En el caso de los "Archivos" , el valor de carácter o la lista de valores de caracteres son los nombres de archivo que se desean agregar al formulario.
Figure 6. “
Solicitud HTTP
CORREO
using a
Forma
”
La Figura 7 muestra datos " JSON" de una Solicitud HTTP . En JSL, "JSON" puede ser una Matriz asociativa o datos de caracteres en formato JSON. Como JSON, Expr creará un objeto JSON bien definido para usar con Solicitud HTTP . Los datos JSON se envían como el cuerpo de la solicitud. 
Figure 7. “
Solicitud HTTP
CORREO
using ‘
JSON'
”
La Figura 8 muestra los datos de una solicitud HTTP " Archivo" . En JSL, "Archivo" es el nombre del archivo que se envía como cuerpo de la solicitud. 
Figure 8. “
Solicitud HTTP
CORREO
using ‘
Archivo'
”
Una última acción para los datos HTTP " Blob" de la Solicitud. En JSL, "Blob" es un dato binario que se envía como cuerpo de la solicitud. Esto significa que no es necesario escribir un archivo en el disco antes de enviarlo como parte de la solicitud.
El
CONSEGUIR
La acción es la solicitud más sencilla que se puede hacer mientras
CORREO
es la más compleja. La interacción entre
Solicitud HTTP
El recurso web siempre lo define el servidor. Si bien el protocolo HTTP es un estándar bien definido, los datos (y sus estructuras) se definen para cada recurso web. Es decir, la API de One Drive es diferente a la de Dropbox, aunque realizan funciones similares.
Devolver al remitente
Los datos de un mensaje HTTP de Solicitud " Enviar" pueden ser datos de caracteres, datos de blobs binarios o estar vacíos, según el recurso web. Comprobar si los datos devueltos están vacíos es el nivel más básico de análisis de datos (además de ninguno). Sin embargo, si necesita un análisis más detallado, puede usar " Si es una cadena" para comprobar si hay datos de caracteres.
Para una investigación más detallada, puede utilizar "Obtener tipo MIME" . Los tipos MIME comunes se encuentran en el artículo "Lista incompleta de tipos MIME" en la sección de Referencias del documento.
Por último, si es necesario, puede investigar los códigos de estado HTTP de bajo nivel de un recurso web utilizando estos mensajes:
|
“Tiene información”
|
100-199
|
|
“Tiene éxito”
|
200-299
|
|
“Tiene redirección”
|
300-399
|
|
“Tiene un error de cliente”
|
400-499
|
|
“Tiene un error de servidor”
|
500-599
|
|
“Tiene un error”
|
Tiene un error de cliente o de servidor
|
|
“Obtener estatus”
|
El código de estado HTTP
|
Las descripciones de los códigos de estado HTTP se pueden encontrar en el artículo Definiciones de códigos de estado en la sección Referencia del documento.
Dónde usarlo
Si bien Solicitud HTTP puede procesar datos de caracteres o datos de blobs binarios de cualquier recurso web, nos centraremos en los datos de caracteres de los servicios RESTful, es decir, los datos JSON.
Esto es dulce
PubChem es una de las nuevas empresas de gestión de datos, basada en el protocolo HTTP que utiliza REST. PubChem se fundó en 2004 como una fuente abierta de datos químicos en los Institutos Nacionales de la Salud (NIH). Cientos de fuentes de datos de instituciones como universidades, compañías farmacéuticas, agencias gubernamentales y proveedores de productos químicos se utilizan para actualizar los registros de PubChem mensualmente. Es la mayor colección de información química disponible públicamente.
PubChem desglosa sus consultas de datos en sustancias, compuestos y ensayos, etc. A partir de ahí, puede obtener una amplia gama de propiedades, descripciones, dosis y otras características de interés.
Lo leí como ingredientes de M&M. 
Figura 9. “Ingredientes simples de M&M”
Escribí un script JSL que creó una tabla de datos JMP con los ingredientes de los M&M's sin sabor para ver qué contienen. No me sorprendió que los ingredientes tuvieran una gran cantidad de colorantes artificiales.
Una representación de tabla de datos parcial JMP se ve así: 
Figura 10. “Tabla de datos de ingredientes de M&M parcialmente natural”
Cuando se ejecuta el script JSL, se utiliza Solicitud HTTP para recuperar la imagen de la sustancia o el compuesto, así como otras propiedades proporcionadas por el servicio RESTful de PubChem. 
Figura 11. “Tabla de datos de ingredientes de M&M parcialmente natural con datos de PubChem”
Las URL de servicios RESTful de interés son:
( [NOMBRE] es el nombre de la sustancia o compuesto que se encuentra en las Figuras 9 y 10.)
Para recuperar los datos de la imagen de un compuesto como la lactosa, la Solicitud HTTP se ve así: 
Figura 12. “ CONSEGUIR -ing la imagen de Lactosa de PubChem”

Figura 13. “
CONSEGUIR -ing y visualización de la imagen de Lactosa de PubChem”
La solicitud de Lactose utiliza el endpoint de PubChem para el compuesto. Se utilizan dos conceptos adicionales. El primero es "Encode URI" . La codificación URI, también conocida como "Percent Encoding", garantiza que la URL RESTful contenga solo caracteres ASCII (por suerte, Lactose sí los tiene). El segundo concepto es "Obtener el tipo MIME" . El resultado de este endpoint de PubChem son datos binarios de un blob (una imagen PNG). La comprobación "Obtener el tipo MIME" garantiza que el blob sea un PNG antes de usarlo con "New Image", ya que este endpoint devolverá datos de caracteres si no se encuentra ningún PNG.
Para recuperar el registro completo de Lactosa en datos JSON, la Solicitud HTTP se ve así:
Figura 14. “ CONSEGUIR -ing el registro completo de Lactosa desde PubChem”
El punto final definido por PubChem especifica que el sufijo /JSON indica que el servicio RESTful debe devolver datos JSON, por lo que no es necesario verificar el tipo MIME de "data" . Sin embargo, tenemos que procesar el JSON. Hay [al menos] dos maneras de procesar los " data" devueltos. La primera es usar "JSON To Data Table" . Esto intentará crear una tabla de datos JMP a partir de "data" . Para datos rectangulares o tabulares, esto funciona bien (y rápido). Sin embargo, no todos los servicios RESTful devuelven datos tabulares (PubChem es uno que no lo hace). La segunda forma de procesar los datos devueltos es "Parse JSON" . Esto crea una JSL Matriz asociativa . Esto significa que no tiene que analizar el JSON. Sin embargo, necesita saber cómo están estructurados los datos devueltos. Es decir, necesitará saber si es un par clave/valor o un par clave/valores. Esto no es tan difícil como parece, ya que puedes capturar el JSON sin procesar en el registro JMP y usar cualquier editor JSON para examinar su estructura.
Una visualización parcial de los datos JSON de lactosa se ve así: 
Figura 15. “Datos JSON parciales de lactosa de PubChem”
Este editor muestra una representación en paralelo de JSON sin procesar con su objeto JSON correspondiente. Al examinar los datos, un {..} en JSON se asemeja a una Matriz asociativa de JSL. De igual manera, al encontrar un [..], se asemeja a una Lista de JSL.
Usando esta técnica, puede modificar el script de registro completo que se muestra en la Figura 14 y usarlo para crear una tabla de datos JMP para las propiedades de la lactosa: 
Figura 16. “ CONSEGUIR -ing el registro completo de Lactosa de PubChem y haciendo “ props” una tabla de datos”
Este ejemplo utiliza Parse JSON para traducir el JSON sin procesar de PubChem a una Matriz asociativa JSL. Tras analizar la estructura de datos JSON, nos damos cuenta de que solo nos interesan los datos "props" en el JSON de Lactose. Podemos usar la navegación habitual de la Matriz asociativa JSL para recuperar la Lista JSL que se encuentra en "PC_Compounds". Solo necesitamos el primer elemento de la lista (ya que la mayoría de los " accesorios" están repetidos).
Los datos "props" son una matriz asociativa JSL, por lo que podemos usar "Como expresión JSON" para traducir "props" de nuevo a JSON y usarlos en JSON para la tabla de datos . El resultado se muestra en la Figura 17. 
Figura 17. “Tabla de datos de propiedades parciales de la lactosa”
Recuerda, Solicitud HTTP es simplemente el pegamento que une los recursos web con JSL. Una vez que tengas tus datos en JSL, puedes usarlo de forma simple o compleja, según tus necesidades.
Algo para maravillarse
En 2014, Marvel Comics creó un servicio RESTful que permite a los usuarios acceder a 70 años de información sobre cómics. La API de Marvel Comics solo está limitada por la imaginación del creador, así que, por supuesto, tuve que registrar una clave y usarla para ver qué encontraba. Escribí una función JSL marvel:API que usa varias columnas para explorar el Universo Marvel.
Siendo el fan de Deadpool que soy, llegué a una consulta inicial que creó esta tabla de datos: 
Figura 18. “Tabla de datos parciales de Deadpool”.
Esto reveló cuatro personajes diferentes de Deadpool en el universo de Marvel Comics. Me interesaba la identidad del primer personaje y seleccioné el controlador de eventos de clic de la serie que había creado. Dado el origen del clic, la función maravilla:API puede generar una nueva consulta a Marvel cuyo valor de retorno ilustra la intersección de Deadpool en el MCU. Limité los resultados a 50 filas; sin embargo, descubrí algunos resultados interesantes. Realicé un rápido análisis de distribución de " title" y "startYear" para ver cuándo la popularidad de Deadpool aumentó, disminuyó (y volvió a aumentar).
Figura 19. “Distribución parcial de Deadpool”.
La figura 19 muestra que en 2007 Deadpool pasó a formar parte de muchos títulos diferentes de Marvel Comics, entre ellos:
- Vengadores: La Iniciativa (2007-2010)
- Cable y Deadpool
- Guerra Civil: Universo X-Men.
El interés en Deadpool disminuyó nuevamente después de 2007, pero se recuperó (como se ve en el análisis) después de que Ryan Reynolds interpretó por primera vez al personaje en X-Men Origins: Wolverine (2009), renovando así el interés en el personaje, alcanzando un pico en 2011.
Entre 2012 y 2015, el universo de los cómics de Marvel explota con Deadpool Kills the Marvel Universe, un reinicio de Marvel.
Finalmente, no hubo sorpresas para el periodo 2016-2018. Fue entonces cuando se estrenaron las películas.
Peter de Deadpool 2 resume mejor la API de Marvel Comics: "Acabo de ver el anuncio y pensé que parecía divertido".
Convenciones utilizadas
El término servicio RESTful se utiliza cuando el recurso web está basado en REST.
El término recurso web es un término genérico que se utiliza cuando se implica un acceso web genérico.
Las acciones HTTP están en negrita
Los botones/controles de diálogo están “ entre comillas y en negrita”
Los hipervínculos están subrayados
Los objetos y funciones JSL están en cursiva
Los nombres de variables/columnas/mensajes JSL están “ entre comillas y en cursiva ”.
Referencias
Hawk, Sandro (16 de diciembre de 2011) REST recuperado de https://www.w3.org/2001/sw/wiki/REST
Definiciones de métodos de W3.org recuperadas de https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
W3.org
Definiciones de códigos de estado
retrieved
https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
Mozilla.org (13 de mayo de 2018) Métodos de solicitud HTTP recuperados de https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
JSON.org (diciembre de 2017) Presentación de JSON recuperado de https://www.json.org
JMP.com (12 de julio de 2018) Liza recuperado dehttps://www.jmp.com/support/help/14/lists.shtml
JMP.com (12 de julio de 2018) Trabajar con matrices asociativas recuperado de https://www.jmp.com/support/help/14/work-with-associative-arrays.shtml
Herramienta de línea de comandos CURL y biblioteca para transferir datos con URL recuperadas de https://curl.haxx.se/
W3.org (22 de enero de 2015) Asegurando la Web recuperado de https://www.w3.org/2001/tag/doc/web-https
W3.org (11 de junio de 2014) HTTP - Protocolo de transferencia de hipertexto recuperado de https://www.w3.org/Protocols/
Mozilla.org (3 de julio de 2018) Lista incompleta de tipos MIME recuperada de https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
PubChem.ncbi.nlm.nih.gov Acerca de PubChem recuperado de https://pubchemdocs.ncbi.nlm.nih.gov/
Ingredientes de MMs.com obtenidos de http://www.mms.com/us/nutrition
Referencia de codificación de URL HTML de W3Schools.com obtenida de https://www.w3schools.com/tags/ref_urlencode.asp
Portal para desarrolladores de Developer.marvel.com obtenido de https://developer.marvel.com/