{"id":2439,"date":"2022-12-12T14:56:13","date_gmt":"2022-12-12T13:56:13","guid":{"rendered":"https:\/\/www.armonie.group\/servicios-web-en-ibm-i\/"},"modified":"2023-10-03T11:09:05","modified_gmt":"2023-10-03T09:09:05","slug":"servicios-web-en-ibm-i","status":"publish","type":"post","link":"https:\/\/www.armonie.group\/es\/servicios-web-en-ibm-i\/","title":{"rendered":"Servicios web en IBM i"},"content":{"rendered":"[et_pb_section fb_built=\u00bb1&#8243; _builder_version=\u00bb4.14.8&#8243; background_color=\u00bb#0c8dc9&#8243; global_colors_info=\u00bb{}\u00bb][et_pb_row _builder_version=\u00bb3.25&#8243; background_size=\u00bbinitial\u00bb background_position=\u00bbtop_left\u00bb background_repeat=\u00bbrepeat\u00bb global_colors_info=\u00bb{}\u00bb][et_pb_column type=\u00bb4_4&#8243; _builder_version=\u00bb3.25&#8243; custom_padding=\u00bb|||\u00bb global_colors_info=\u00bb{}\u00bb custom_padding__hover=\u00bb|||\u00bb][et_pb_text _builder_version=\u00bb4.14.8&#8243; text_font_size=\u00bb20px\u00bb header_font=\u00bbPoppins|700|||||||\u00bb header_text_align=\u00bbcenter\u00bb header_text_color=\u00bb#FFFFFF\u00bb header_font_size=\u00bb43px\u00bb header_2_font=\u00bbPoppins||||||||\u00bb header_2_text_align=\u00bbcenter\u00bb header_2_text_color=\u00bb#01013A\u00bb background_color=\u00bbRGBA(255,255,255,0)\u00bb background_size=\u00bbinitial\u00bb background_position=\u00bbtop_left\u00bb background_repeat=\u00bbrepeat\u00bb custom_margin=\u00bb||-16px||false|false\u00bb custom_padding=\u00bb30px|30px||30px|false|false\u00bb global_colors_info=\u00bb{}\u00bb]<h2><b>Blog ID-INFO<\/b><\/h2>\n<p><strong><\/strong><\/p>[\/et_pb_text][et_pb_text _builder_version=\u00bb4.14.8&#8243; text_font_size=\u00bb20px\u00bb header_font=\u00bbPoppins|700|||||||\u00bb header_text_align=\u00bbcenter\u00bb header_text_color=\u00bb#FFFFFF\u00bb header_font_size=\u00bb43px\u00bb background_color=\u00bbRGBA(255,255,255,0)\u00bb background_size=\u00bbinitial\u00bb background_position=\u00bbtop_left\u00bb background_repeat=\u00bbrepeat\u00bb custom_padding=\u00bb30px|30px|30px|30px|false|false\u00bb hover_enabled=\u00bb0&#8243; global_colors_info=\u00bb{}\u00bb sticky_enabled=\u00bb0&#8243;]<h2 class=\"post_link\">Servicios web en IBM i<\/h2>\n<p><strong><!-- \/wp:post-content --><\/strong><\/p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\u00bb1&#8243; _builder_version=\u00bb3.22&#8243; global_colors_info=\u00bb{}\u00bb][et_pb_row _builder_version=\u00bb3.25&#8243; background_size=\u00bbinitial\u00bb background_position=\u00bbtop_left\u00bb background_repeat=\u00bbrepeat\u00bb global_colors_info=\u00bb{}\u00bb][et_pb_column type=\u00bb4_4&#8243; _builder_version=\u00bb3.25&#8243; custom_padding=\u00bb|||\u00bb global_colors_info=\u00bb{}\u00bb custom_padding__hover=\u00bb|||\u00bb][et_pb_text _builder_version=\u00bb4.14.8&#8243; text_text_color=\u00bb#000000&#8243; text_font_size=\u00bb13px\u00bb text_line_height=\u00bb1.4em\u00bb background_color=\u00bbrgba(13,189,224,0.39)\u00bb background_size=\u00bbinitial\u00bb background_position=\u00bbtop_left\u00bb background_repeat=\u00bbrepeat\u00bb custom_padding=\u00bb30px|30px|30px|30px|false|false\u00bb hover_enabled=\u00bb0&#8243; global_colors_info=\u00bb{}\u00bb sticky_enabled=\u00bb0&#8243;]<p class=\"wsc_post_summary\"><strong>Probablemente haya o\u00eddo hablar de los servicios web, pero \u00bfqu\u00e9 son exactamente?<\/strong><\/p>\n<div class=\"wsc_post_content\">\n<p><strong>Si consulta su buscador favorito, aprender\u00e1 que un servicio web es un protocolo de interfaz que permite a dos aplicaciones hablar entre s\u00ed. Se basan en tecnolog\u00edas web para permitir que dos aplicaciones, que pueden ser completamente distintas, intercambien informaci\u00f3n.<\/strong><\/p>\n<p><strong>Por ello, los servicios web se utilizan a menudo en entornos distribuidos donde muchas aplicaciones heterog\u00e9neas necesitan comunicarse entre s\u00ed. Adem\u00e1s, estas herramientas se hacen eco de los principios de la arquitectura orientada a servicios (SOA), cada vez m\u00e1s presentes en nuestros sistemas de informaci\u00f3n y que nos permiten ser mucho m\u00e1s flexibles en cuanto a las soluciones que podemos aportar.<\/strong><\/p>\n<\/div>\n<p><strong><!-- \/wp:paragraph --><\/strong><\/p>[\/et_pb_text][et_pb_text _builder_version=\u00bb4.14.8&#8243; _module_preset=\u00bbdefault\u00bb text_text_color=\u00bb#000000&#8243; header_2_font=\u00bbPoppins||||||||\u00bb header_2_text_color=\u00bb#000000&#8243; header_3_font=\u00bbPoppins|300|||||||\u00bb header_3_text_color=\u00bb#000000&#8243; hover_enabled=\u00bb0&#8243; global_colors_info=\u00bb{}\u00bb sticky_enabled=\u00bb0&#8243;]<p>Los servicios web actuales se basan en el Protocolo de Transferencia de Hipertexto (HTPP) para transmitir informaci\u00f3n. El uso de esta norma tiene la enorme ventaja de evitar un gran n\u00famero de problemas de conectividad entre nuestras dos aplicaciones.<\/p>\n<p>Los servicios web se basan en intercambios cliente\/servidor. En la pr\u00e1ctica, la aplicaci\u00f3n que proporciona el servicio (a menudo denominada \u00abexponer el servicio\u00bb) est\u00e1 a la escucha de las solicitudes de los clientes. El servidor interpreta la solicitud, la procesa y env\u00eda la respuesta a la aplicaci\u00f3n cliente de forma que \u00e9sta pueda entenderla.<\/p>\n<p>&nbsp;<\/p>\n<p>Existen dos familias principales de servicios web:  <\/p>\n<ul>\n<li>Servicios web SOAP: Protocolo simple de acceso a objetos<\/li>\n<li>Servicios web REST: transferencia de estado representacional<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Los primeros se basan en el protocolo del mismo nombre. Existe desde hace mucho tiempo: la versi\u00f3n inicial definida por Microsoft e iBM data de hace 23 a\u00f1os, y luego se convirti\u00f3 en est\u00e1ndar a ra\u00edz de una recomendaci\u00f3n del W3C. El protocolo se basa totalmente en el lenguaje XML para describir formalmente los intercambios entre los clientes y el servidor. Este formalismo (a trav\u00e9s de documentos XML llamados WSDL) tiene la ventaja de proporcionar documentaci\u00f3n impl\u00edcita cuando se utiliza este tipo de servicio. Por desgracia, esta familia adolece de algunos inconvenientes: el lenguaje XML es especialmente prolijo, por lo que utilizar este tipo de servicio web puede complicarse r\u00e1pidamente. Por otro lado, el formalismo implica que los clientes y el servidor est\u00e1n fuertemente acoplados, lo cual, en un enfoque SOA en el que siempre buscamos una mayor flexibilidad, no es necesariamente deseable.<\/p>\n<p>&nbsp;<\/p>\n<p>Estos inconvenientes propiciaron la aparici\u00f3n de la familia REST de servicios web. Se basan en los conceptos arquitect\u00f3nicos utilizados en la web para manipular recursos remotos en forma de texto. A diferencia de los servicios web SOAP, la familia de servicios web REST no se limita al formato XML para intercambiar informaci\u00f3n entre aplicaciones cliente\/servidor: ahora se utilizan habitualmente formatos como JSON. Para manipular recursos remotos, estos servicios web utilizan m\u00e9todos http : POST, GET, PUT, DELETE, &#8230; que se hacen eco del modelo de desarrollo CRUD, lo que explica que estos servicios web se utilicen frecuentemente para construir API (Application Programming Interface) completas para interactuar con los elementos de una aplicaci\u00f3n.  <\/p>\n<p>&nbsp;<\/p>\n<p>Pero, \u00bfqu\u00e9 pasa con nuestro IBM i? \u00bfPuede encajar tambi\u00e9n en estos entornos distribuidos?<\/p>\n<p>&nbsp;<\/p>\n<p>Perm\u00edtame tranquilizarle de entrada: nuestra plataforma favorita dispone de una enorme variedad de herramientas para exponer o consumir servicios web. Como muchas otras plataformas, podemos implantar estos servicios de diversas formas y ponerlos a disposici\u00f3n de nuestros distintos clientes.<\/p>\n<p>&nbsp;<\/p>\n<p>Para ilustrar nuestro punto de vista, tomemos una aplicaci\u00f3n existente desarrollada en RPGIV.<\/p>\n<p>&nbsp;<\/p>\n<p>Para ello, vamos a empezar por crear un entorno con algunas tablas y datos. Afortunadamente para nosotros, IBM nos ha proporcionado un procedimiento almacenado SQL de una sola l\u00ednea para este fin:<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p><strong>LLAMAR A QSYS.CREATE_SQL_SAMPLE(&#8216;RHDB&#8217;);<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>As\u00ed que abramos nuestra herramienta de ejecuci\u00f3n de scripts SQL en ACS y empecemos.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/1_1.jpg\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Como habr\u00e1s adivinado por el nombre de la colecci\u00f3n que hemos creado, vamos a trabajar con datos de recursos humanos.<\/p>\n<p>&nbsp;<\/p>\n<p>Un vistazo r\u00e1pido en el explorador de bases de datos nos muestra las tablas que se han creado.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/2_1.jpg\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Veamos la tabla EMPLEADO y escribamos un peque\u00f1o programa para recuperar informaci\u00f3n sobre un empleado.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/3fff.jpg\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Supongamos que tenemos un programa de servicio que extrae informaci\u00f3n sobre un empleado.<\/p>\n<pre><code>      \/if not defined(IMPORT_PROTOTYPES)<\/code> <code>        ctl-opt option ( *nodebugio : *srcstmt )<\/code> <code>          debug<\/code> <code>          nomain<\/code> <code>          pgminfo<\/code><code>(<\/code><code>*PCML<\/code><code> <\/code><code>:<\/code><code> <\/code><code>*MODULE<\/code><code>);<\/code> <code>      * Parametres SQL.<\/code> <code>        exec sql<\/code> <code>          set option commit <\/code><code>=<\/code><code> <\/code><code>*none,<\/code> <code>                     closqlcsr<\/code><code> =<\/code><code> *endmod<\/code><code>;<\/code><code>\n\n<\/code><code>      *======================================================================= *<\/code> <code>      *                                                                        *<\/code> <code>      * ATTENTION :                                                            *<\/code> <code>      *                                                                        *<\/code> <code>      * ---------------------------------------------------------------------- *<\/code> <code>      * FONCTION     : Module RH.                                              *<\/code> <code>      * DESCRIPTION  : Manipulation don\u00e9nes du personnel.                      *<\/code> <code>      *                                                                        *<\/code> <code>      * Creation ... : 25\/10\/2021   par  L. KIEFFER (Notos-Id Info)            *<\/code> <code>      * ---------------------------------------------------------------------- *<\/code> <code>      * Modification :                                                         *<\/code> <code>      * JJ\/MM\/AAAA - XXXXXX XXXXXXX - XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.     *<\/code> <code>      *                                                                        *\n      * ---------------------------------------------------------------------- *<\/code> <code>      \/endif<\/code> <code>      *----------------------------------------------------------------------<\/code> <code>      * Prototype verification sous systeme.<\/code> <code>      * ---------------------------------------------------------------------<\/code> <code>        \/\/ Information employ\u00e9.<\/code> <code>        dcl-ds MODULERH_employe template qualified;<\/code> <code>           prenom varchar(12);<\/code> <code>           nom varchar(15);<\/code> <code>           service varchar(36);<\/code> <code>        end-ds;<\/code> <code>        \/\/ Recherche d'un employ\u00e9.<\/code> <code>        dcl-pr MODULERH_rchEmp;<\/code> <code>          iNumEmp char( 6 ) const;<\/code> <code>          oInfEmp likeds ( MODULERH_employe );<\/code> <code>          oErrHTTP int(5);<\/code> <code>          oErrMsg varchar(40);<\/code> <code>        end-pr<\/code><code>;<\/code> <code>      * Fin des elements exportes.<\/code> <code>      \/if defined(IMPORT_PROTOTYPES)<\/code> <code>      \/eof<\/code> <code>      \/endif<\/code> <code>      *----------------------------------------------------------------------<\/code> <code>      * Declarations globales<\/code> <code>      * ---------------------------------------------------------------------<\/code> <code>      \/\/ ---------------------------------------------------------------------<\/code> <code>      \/\/ Recherche d'employ\u00e9.<\/code> <code>      \/\/ ---------------------------------------------------------------------<\/code> <code>        dcl-proc MODULERH_rchEmp export;<\/code> <code>          dcl-pi *n;<\/code> <code>            iNumEmp char( 6 ) const;<\/code> <code>            oInfEmp likeds ( MODULERH_employe );<\/code> <code>            oErrHTTP int(5);<\/code> <code>            oErrMsg varchar(40);<\/code> <code>          end-pi<\/code><code>;<\/code> <code>          \/\/ Recherche de l'employ\u00e9.<\/code> <code>          exec sql<\/code> <code>            Select FIRSTNME, LASTNAME, DEPTNAME<\/code> <code>            into :oInfEmp.prenom, :oInfEmp.nom, :oInfEmp.service<\/code> <code>            From EMPLOYEE<\/code> <code>            Join DEPARTMENT on DEPTNO = WORKDEPT<\/code> <code>            Where EMPNO = :iNumEmp;<\/code> <code>          if sqlCode &lt; 0;<\/code> <code>            oErrHTTP = 500;<\/code> <code>            oErrMsg = 'Erreur recherche de l''employ\u00e9.';<\/code> <code>            return;<\/code> <code>          endif;<\/code> <code>          if sqlCode = 100;<\/code> <code>            oErrHTTP = 404;<\/code> <code>            oErrMsg = 'Employ\u00e9 inconnu.';<\/code> <code>            return;<\/code> <code>          endif;<\/code> <code>          \/\/ Tout s'est bien pass\u00e9.<\/code> <code>          oErrHTTP = 200;<\/code> <code>          oErrMsg = *blanks;<\/code> <code>          return;<\/code> <code>        end-proc;<\/code><code>\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>F\u00edjate en las instrucciones resaltadas, a las que volveremos m\u00e1s adelante cuando expliquemos nuestro servicio web.<\/p>\n<p>&nbsp;<\/p>\n<p>Para continuar, necesitaremos un servidor de servicios web en el que se alojar\u00e1n nuestros servicios. Afortunadamente para nosotros, IBM proporciona uno en IBM i: IWS (Integrated Web Services server).<\/p>\n<p>Para acceder a ella, utilice la siguiente URL: http: <a href=\"http:\/\/mon_ibm_i:2001\/HTTPAdmin\">\/\/mon_ibm_i:2001\/HTTPAdmin<\/a><\/p>\n<p>Donde mi_ibm_i es la direcci\u00f3n IP de su partici\u00f3n o su nombre DNS.<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<p><strong>ADVERTENCIA <\/strong>: Si la p\u00e1gina no se muestra, probablemente se deba a que la aplicaci\u00f3n de administraci\u00f3n web no se ha iniciado correctamente.<\/p>\n<p>Ejecute el siguiente comando en una l\u00ednea de comandos 5250:<\/p>\n<p>&nbsp;<\/p>\n<p><strong>STRTCPSVR SERVIDOR(*HTTP) HTTPSVR(*ADMIN)<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Identif\u00edquese utilizando un perfil con derechos <strong>*IOSYSCFG<\/strong>.<\/p>\n<p><strong><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/Image%2044.jpg\" alt=\"\"><\/strong><\/p>\n<p>En la nueva p\u00e1gina que aparece, haga clic en el enlace \u00abCrear servidor de servicios web\u00bb y d\u00e9jese guiar por el asistente.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image%2055.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Ponga a su servidor el nombre que desee. Por defecto, se crear\u00e1 una instancia de Apache.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image%2066.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Seleccione los puertos utilizados por el servidor.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image%2077.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Puedes personalizar el trabajo del servidor proporcion\u00e1ndole un jobd espec\u00edfico.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image88.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Tambi\u00e9n puede elegir el perfil de usuario utilizado por el trabajo de servidor. Recuerde definirlo claramente. Una buena idea es establecer este perfil en el perfil de propietario de la base de datos que va a manipular. Tenga en cuenta que si elige el usuario por defecto QWSERVICE, deber\u00e1 asignarle una contrase\u00f1a.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image99.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Por \u00faltimo, confirme la creaci\u00f3n del servidor pulsando el bot\u00f3n \u00abFinalizar\u00bb.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image%20100.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Ahora que tenemos un servidor, hablemos de nuestro primer servicio. Para ello, seleccione el servidor que ha creado anteriormente y haga clic en el enlace \u00abGestionar servicio desplegado\u00bb.<\/p>\n<p>Haga clic en el bot\u00f3n \u00abGestionar servicio desplegado\u00bb. A continuaci\u00f3n, haga clic en el bot\u00f3n \u00abDesplegar\u00bb.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/111.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>La primera p\u00e1gina del asistente le permite seleccionar el ejecutable que implementa su servicio. Desde V7.3, tambi\u00e9n puede utilizar el lenguaje sql para implementar el servicio.<\/p>\n<p>Para las implementaciones RPG IV, s\u00f3lo se pueden seleccionar componentes ejecutables (programas y programas de servicio). En nuestro caso, elijamos nuestro programa de servicio MODULERH.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image222.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>La siguiente pantalla nos permitir\u00e1 elegir un nombre de recurso. En nuestro caso, lo llamaremos \u00abemployes\u00bb porque estamos manipulando datos de empleados.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/333.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>La siguiente p\u00e1gina nos permite restringir el acceso al servicio web a un puerto seguro (v\u00eda SSL). Como no hemos asegurado nuestro servidor http, respondemos \u00abNo\u00bb.<\/p>\n<p>Tambi\u00e9n podemos solicitar autenticaci\u00f3n para este servicio web.<\/p>\n<p>En este caso, s\u00f3lo est\u00e1 disponible la autenticaci\u00f3n \u00abb\u00e1sica\u00bb. En este caso, el cliente deber\u00e1 proporcionar un usuario y una contrase\u00f1a v\u00e1lidos en el sistema en la cabecera http \u00abAutorizaci\u00f3n\u00bb.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image444.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>El siguiente paso en el caso de programas de servicio le permitir\u00e1 seleccionar el procedimiento exportado que implementa el servicio (en este caso modulerh_rchemp).<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image555.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>A continuaci\u00f3n, el asistente le preguntar\u00e1 c\u00f3mo notificar al cliente que el servicio se ha realizado seg\u00fan lo previsto o con alg\u00fan error. Aqu\u00ed puede cambiar los c\u00f3digos de retorno y los mensajes de error predeterminados.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/image666.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>La p\u00e1gina siguiente es la m\u00e1s importante. Describe c\u00f3mo acceder\u00e1n los clientes a su servicio.<\/p>\n<p>Podemos definir :<\/p>\n<ul>\n<li>El verbo http utilizado (en este caso GET)<\/li>\n<li>El modelo de url utilizado para el acceso  <\/li>\n<\/ul>\n<p>Esto nos permite definir d\u00f3nde se colocan nuestros par\u00e1metros cuando se suministran directamente en la URL. La sintaxis a utilizar es:<strong> \/{nom_parametre}<\/strong><\/p>\n<p>Tenga en cuenta que tambi\u00e9n puede a\u00f1adir una expresi\u00f3n regular a la sintaxis para comprobar la validez del par\u00e1metro introducido (aqu\u00ed \\d+ para una cadena num\u00e9rica de al menos un d\u00edgito).<\/p>\n<ul>\n<li>Una variable de salida utilizada para devolver el c\u00f3digo http (debe definirse como un entero en el RPG que implementa el servicio).<\/li>\n<li>Variable de salida alfanum\u00e9rica que sustituye al mensaje de error por defecto.<\/li>\n<li>Los tipos de datos aceptados como entrada (*Todos corresponden a todos los tipos gestionados: xml, json, datos de formulario, etc. =&gt; en este caso, el cliente debe especificar qu\u00e9 tipo de informaci\u00f3n est\u00e1 proporcionando para que el servidor la entienda).<\/li>\n<li>Tipos de datos devueltos: la herramienta puede devolver datos en formato xml o json. Una vez m\u00e1s, si el servidor puede proporcionar ambos, el cliente tendr\u00e1 que especificar cu\u00e1l prefiere.<\/li>\n<li>C\u00f3mo se presentan los datos de entrada y salida: encapsulados o por nombre.<\/li>\n<\/ul>\n<p>Por \u00faltimo, esta pantalla permite indicar de d\u00f3nde se recuperar\u00e1n los par\u00e1metros de entrada. En nuestro caso la url utilizando el identificador num (recuerda que es el definido en la plantilla url).<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/777.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>La siguiente pantalla le permitir\u00e1 definir un usuario espec\u00edfico para ejecutar este servicio web. El perfil de servidor general debe tener acceso a este perfil de servicio web espec\u00edfico.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/888.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>La siguiente pantalla se utiliza para definir las bibliotecas que se a\u00f1adir\u00e1n al entorno de ejecuci\u00f3n.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/999.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>La pen\u00faltima pantalla permite configurar los elementos que se pasar\u00e1n al programa que implementa el servicio.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/1000.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>La \u00faltima pantalla resume la informaci\u00f3n introducida. Haga clic en el bot\u00f3n \u00abFinalizar\u00bb para desplegar e iniciar el servicio web.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/1010.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Pero, \u00bfc\u00f3mo probar nuestro famoso servicio web?<\/p>\n<p>Como el servicio web utiliza el verbo GET, un simple navegador nos permitir\u00e1 probarlo.<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/2020.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Para casos m\u00e1s complejos, puede recurrir a herramientas m\u00e1s completas como :  <\/p>\n<ul>\n<li>CURL (si no te importan las l\u00edneas de comandos): te permite configurar completamente tu petici\u00f3n (autenticaci\u00f3n, cabeceras http, etc.).<\/li>\n<li>PostMan: herramienta gr\u00e1fica tan completa como CURL.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Un ejemplo r\u00e1pido usando PostMan: a\u00f1adimos una cabecera http indicando que s\u00f3lo queremos JSON para la respuesta (recuerda que nuestro servicio web puede proporcionar xml o json).<\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.notos.fr\/Portals\/0\/3030.png\" alt=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>Y eso es todo, la &#8216;R&#8217; de nuestra API CRUD est\u00e1 ahora en su lugar, todo lo que queda es crear los otros procedimientos que implementan las funciones que faltan. No olvides la importancia de los verbos http a la hora de configurar todo esto:<\/p>\n<p>C =&gt; POST<\/p>\n<p>R =&gt; LEER<\/p>\n<p>U =&gt; PUT<\/p>\n<p>Y D =&gt; DELETE.<\/p>\n<p>&nbsp;<\/p>\n<p>Espero que este post haya aclarado un poco el tema. Esperamos verle la pr\u00f3xima vez, cuando podamos ponernos en la piel del cliente y no en la del servidor.  <\/p>\n<p>&nbsp;<\/p>\n<p><strong>\u00bfTiene alguna pregunta sobre los servicios web o su plataforma IBM i? P\u00f3ngase en <a href=\"https:\/\/www.idinfo.eu\/CONTACT\" target=\"-blank\" rel=\"noopener\">contacto<\/a> con nosotros en el 01 88 32 12 34 o a trav\u00e9s del <a href=\"https:\/\/www.idinfo.eu\/CONTACT\" target=\"-blank\" rel=\"noopener\">formulario de contacto<\/a>.<\/strong><\/p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section]<!-- \/wp:freeform -->","protected":false},"excerpt":{"rendered":"<p>Blog ID-INFO Servicios web en IBM i Probablemente haya o\u00eddo hablar de los servicios web, pero \u00bfqu\u00e9 son exactamente? Si consulta su buscador favorito, aprender\u00e1 que un servicio web es un protocolo de interfaz que permite a dos aplicaciones hablar entre s\u00ed. Se basan en tecnolog\u00edas web para permitir que dos aplicaciones, que pueden ser [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":2307,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[119,133],"tags":[142,125,123,141,127,124,139,126,143,140],"class_list":["post-2439","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-noticias","category-notos-es","tag-aplicacion","tag-as-400-es","tag-as400-es","tag-desarrollador","tag-ibm-power-es","tag-ibmi-es","tag-servicio-web","tag-servidor-de-potencia","tag-sistema-de-informacion","tag-sviluppo-es"],"_links":{"self":[{"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/posts\/2439","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/comments?post=2439"}],"version-history":[{"count":1,"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/posts\/2439\/revisions"}],"predecessor-version":[{"id":2450,"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/posts\/2439\/revisions\/2450"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/media\/2307"}],"wp:attachment":[{"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/media?parent=2439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/categories?post=2439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.armonie.group\/es\/wp-json\/wp\/v2\/tags?post=2439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}