{"id":28081,"date":"2024-06-10T11:19:30","date_gmt":"2024-06-10T09:19:30","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=28081"},"modified":"2024-06-11T18:22:08","modified_gmt":"2024-06-11T16:22:08","slug":"bruno-vs-postman-la-batalla-de-las-api","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/","title":{"rendered":"Bruno vs Postman: La Batalla de las API"},"content":{"rendered":"\n<p>Bruno es un cliente de API de c\u00f3digo abierto que, desde hace alg\u00fan tiempo, se est\u00e1 difundiendo r\u00e1pidamente, ganando terreno frente al popular\u00edsimo Postman.<\/p>\n\n\n\n<p>Se trata de un proyecto que quiere crecer con el apoyo de su propia comunidad, sin la participaci\u00f3n de empresas externas (excepto como patrocinadores) y, sobre todo, con la firme voluntad de no dejarse adquirir. En resumen, quieren caminar por sus propios medios, manteniendo su propia identidad, aceptando ayudas externas, pero sin permitir ninguna interferencia en la gesti\u00f3n del proyecto.<\/p>\n\n\n\n<p>En estos tiempos, es sin duda una noble intenci\u00f3n, esperemos que dure.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-por-que-bruno\">\u00bfPor qu\u00e9 Bruno?<\/h3>\n\n\n\n<p>Para m\u00ed, Postman siempre ha sido sin\u00f3nimo de &#8220;fiabilidad&#8221; y &#8220;costumbre&#8221;. A pesar de algunos peque\u00f1os detalles (como no poder modificar las solicitudes si no es a trav\u00e9s de su interfaz), siempre ha cumplido con mis necesidades. Mi caracter\u00edstica pereza ha hecho el resto: todas mis colecciones han estado all\u00ed desde tiempos inmemoriales, y la idea de reorganizarlas en otro lugar siempre me ha puesto la piel de gallina.<\/p>\n\n\n\n<p>Todo era perfecto hasta que me encontr\u00e9 en la necesidad de compartir &#8220;seriamente&#8221; mis solicitudes con el equipo para una colaboraci\u00f3n efectiva. Entre los costos de la suscripci\u00f3n y la gesti\u00f3n compartida de las llamadas, que requiere frecuentes variaciones al inicio, mi perplejidad crec\u00eda diariamente.<\/p>\n\n\n\n<p>Entonces llega Bruno (que me recuerda mucho al t\u00edtulo de una pel\u00edcula&#8230;), que con su simplicidad arquitect\u00f3nica captura inmediatamente mi atenci\u00f3n, llev\u00e1ndome incluso a importar algunas colecciones de Postman.<\/p>\n\n\n\n<p>En este post, intento resumir los puntos de &#8220;contacto&#8221; (o, si se prefiere, de &#8220;fricci\u00f3n&#8221;) entre los dos competidores, analiz\u00e1ndolos desde ambos puntos de vista para llegar a decretar &#8211; aunque sea posible &#8211; el ganador de esta contienda. \u00a1Empecemos!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-guardado-de-configuraciones\">Guardado de Configuraciones<\/h3>\n\n\n\n<p>Mientras que Postman guarda las configuraciones de colecciones y solicitudes en su nube, Bruno las almacena en el sistema de archivos de la m\u00e1quina local, en sus archivos \u201cbru\u201d. Aunque esto pueda parecer un detalle menor, en realidad es una diferencia enorme que repercute significativamente en la colaboraci\u00f3n (de la cual hablaremos m\u00e1s adelante), la usabilidad y la privacidad.<\/p>\n\n\n\n<p>En t\u00e9rminos de usabilidad, para modificar colecciones y solicitudes, adem\u00e1s de la interfaz de Bruno, podemos modificar directamente los archivos de configuraci\u00f3n (los \u201c.bru\u201d precisamente) que, en su versi\u00f3n m\u00e1s simple, son similares a lo siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXc7uiukgq8usXMxwjca-bUMMIGTUjwX50M6MA5oUUA4PN_a5-wYDbpQ-mIvSoGqV6f0K9he4LmkPZoiDyhr_yVN1qTvupPL5aaprG87khs_Parv1rs1wIx36daxHtLla3JV8dvcuv_w431ZYZUIKITIddbV30XLRhT1lIrTQzXxxYEcTgKUeIQ?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A screen shot of a computer\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Un excelente editor que recomiendo para la edici\u00f3n de los archivos Bru es Visual Studio Code, para el cual existe una extensi\u00f3n llamada &#8220;Bruno&#8221; que implementa el resaltado de sintaxis para facilitar su gesti\u00f3n.<\/p>\n\n\n\n<p>Adem\u00e1s, es importante se\u00f1alar que Bruno no tiene su propia nube (y, seg\u00fan su Manifiesto, es muy probable que nunca la tenga), por lo que la persistencia de las configuraciones es totalmente responsabilidad del usuario. As\u00ed, considerando que los archivos de configuraci\u00f3n de las colecciones y las solicitudes residen \u00fanicamente en el sistema de archivos de nuestras m\u00e1quinas, la privacidad est\u00e1 garantizada al 100%. La eventual compartici\u00f3n de estos archivos est\u00e1 exclusivamente en nuestras manos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-bruno-vs-postman-el-aspecto-de-la-colaboracion\">Bruno vs Postman: el aspecto de la colaboraci\u00f3n<\/h3>\n\n\n\n<p>A diferencia de la filosof\u00eda de Postman, que almacena nuestras configuraciones en alg\u00fan rinc\u00f3n indefinido de su nube, Bruno guarda las definiciones de las solicitudes y colecciones en nuestro sistema de archivos local, representadas por archivos de texto en formato Bru.<\/p>\n\n\n\n<p>Por lo tanto, aunque en Postman puedo hacer una copia de seguridad exportando mi colecci\u00f3n, en Bruno puedo transformar f\u00e1cilmente mi estructura en el sistema de archivos en un repositorio Git (o SVN, o Mercurial&#8230;) para subirlo a BitBucket, GitHub o GitLab, entre otros.<\/p>\n\n\n\n<p>\u00a1As\u00ed, hemos implementado la colaboraci\u00f3n a nivel de equipo!<\/p>\n\n\n\n<p>Mientras que Postman nos obliga a comprar licencias para equipos de m\u00e1s de 3 usuarios (con precios no precisamente &#8220;populares&#8221;), Bruno nos ofrece esta posibilidad de forma gratuita y sin ning\u00fan l\u00edmite desde el principio: depende de nosotros decidir qu\u00e9 solicitudes compartir y con qui\u00e9n. \u00bfNo es maravilloso?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-online-desconectado\">\u00bfOnline? \u00a1Desconectado!<\/h3>\n\n\n\n<p>Debo admitir que nunca me hab\u00eda percatado de este detalle, ya que en mi rutina diaria siempre estoy conectado. Sin embargo, parece que Postman solo funciona en modo &#8220;en l\u00ednea&#8221;. Es decir, no se inicia si no puede contactar con sus servidores (\u00a1\u00bfpero por qu\u00e9?!).<\/p>\n\n\n\n<p>En contraste, Bruno no requiere ninguna conexi\u00f3n, ya que todo lo que necesita est\u00e1 en el sistema de archivos local. Esto significa que es posible, durante el desarrollo de un servicio, realizar llamadas al entorno local incluso si est\u00e1s desconectado del resto del mundo.<\/p>\n\n\n\n<p>Este es otro &#8220;detalle&#8221; que refuerza a\u00fan m\u00e1s el respeto que Bruno tiene por nuestra privacidad.<\/p>\n\n\n\n<p>Uso de Librer\u00edas Externas<\/p>\n\n\n\n<p>Para un desarrollador, utilizar librer\u00edas externas es algo habitual (la rueda y el fuego ya fueron inventados hace tiempo, no es necesario reinventarlos) y esto tambi\u00e9n se aplica en este contexto.<\/p>\n\n\n\n<p>Tanto Postman como Bruno ofrecen librer\u00edas preinstaladas, listas para usar, que pueden cubrir la mayor\u00eda de nuestras necesidades, por ejemplo:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong><em>Postman<\/em><\/strong><\/td><td><strong><em>Libreria<\/em><\/strong><\/td><td><strong><em>Bruno<\/em><\/strong><\/td><\/tr><tr><td>X<\/td><td>ajv<\/td><td>X<\/td><\/tr><tr><td><\/td><td>axios<\/td><td>X<\/td><\/tr><tr><td><\/td><td>node-fetch<\/td><td>X<\/td><\/tr><tr><td>X<\/td><td>atob<\/td><td>X<\/td><\/tr><tr><td>X<\/td><td>btoa<\/td><td>X<\/td><\/tr><tr><td>X<\/td><td>chai<\/td><td>X<\/td><\/tr><tr><td>X<\/td><td>lodash<\/td><td>X<\/td><\/tr><tr><td>X<\/td><td>moment<\/td><td>X<\/td><\/tr><tr><td>X<\/td><td>uuid<\/td><td>X<\/td><\/tr><tr><td><\/td><td>nanoid<\/td><td>X<\/td><\/tr><tr><td>X<\/td><td>crypto-js<\/td><td>X<\/td><\/tr><tr><td>X<\/td><td>cheerio<\/td><td><\/td><\/tr><tr><td>X<\/td><td>csv-parse<\/td><td><\/td><\/tr><tr><td>X<\/td><td>tv4<\/td><td><\/td><\/tr><tr><td>X<\/td><td>xml2js<\/td><td><\/td><\/tr><tr><td>X<\/td><td>postman-collection<\/td><td><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Postman no parece estar &#8220;estructurado&#8221; para integrar librer\u00edas externas en su ecosistema. Las alternativas para hacerlo son b\u00e1sicamente dos:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A trav\u00e9s de scripts, descargar la librer\u00eda desde un CDN y ejecutar la funci\u00f3n eval en la cadena de texto devuelta. Dependiendo de d\u00f3nde se coloque esta llamada, la librer\u00eda se descarga en cada ejecuci\u00f3n de solicitud o prueba.<\/li>\n\n\n\n<li>Colocar el c\u00f3digo fuente de la librer\u00eda en una variable a nivel de colecci\u00f3n (o entorno) e invocar una \u201cfunci\u00f3n an\u00f3nima\u201d para acceder a sus m\u00e9todos.<\/li>\n<\/ol>\n\n\n\n<p>Sin duda, es m\u00e1s f\u00e1cil hacerlo que decirlo, pero, en mi opini\u00f3n, es un poco complejo.<\/p>\n\n\n\n<p>En Bruno, las cosas son mucho m\u00e1s simples: lo primero que hay que hacer es crear el archivo package.json con las librer\u00edas que queremos incluir y colocarlo en la ra\u00edz de nuestro proyecto:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXe4ULpatImxy0LoPCYltRUCUb8mljVF5wLNi1DFpDkTjuFXPbLk8HqP0hW551nAyiOV9twzB1-aX6rqOLcrwhw-Rw9Ft5j5Q5ooddke70VMnN0a0UM2LR8-7iz1cRn3BHj0xKcDs6XZV0r705F9uk9Qq7l5odagtLgypGoU0lEnZ8QrrWyF2Gs?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A screen shot of a computer code\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Luego, como si fuera cualquier proyecto NodeJS, instalamos las dependencias:<\/p>\n\n\n\n<p>npm install<\/p>\n\n\n\n<p>A partir de este momento, las librer\u00edas estar\u00e1n a nuestra disposici\u00f3n y podremos usarlas en cualquier parte dentro de nuestra colecci\u00f3n.<\/p>\n\n\n\n<p><strong>Scripting<\/strong><\/p>\n\n\n\n<p>Bruno, al igual que Postman, ofrece la posibilidad de personalizar las llamadas en los siguientes eventos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pre-Request<\/li>\n\n\n\n<li>Post-Response<\/li>\n<\/ul>\n\n\n\n<p>Cada uno de estos eventos puede ser personalizado a nivel de solicitud individual (y por lo tanto enfocado en una sola solicitud) o a nivel de colecci\u00f3n (y por lo tanto con efecto en todas las solicitudes subyacentes).<\/p>\n\n\n\n<p>Las razones para introducir scripting son variadas, desde la precompilaci\u00f3n de variables de una solicitud\/colecci\u00f3n hasta la generaci\u00f3n de un JWT para la autenticaci\u00f3n, sin olvidar el procesamiento de las respuestas obtenidas de las llamadas y muchas otras posibilidades.<\/p>\n\n\n\n<p>En el contexto del scripting, Bruno pone a disposici\u00f3n tres variables fundamentales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>req<\/strong>: Representa la solicitud.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>res<\/strong>: Representa la respuesta.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>bru<\/strong>: Expone m\u00e9todos que nos permiten interactuar con Bruno y su ecosistema.<\/li>\n<\/ul>\n\n\n\n<p>En la secci\u00f3n &#8220;Pre Request&#8221; podemos forzar las caracter\u00edsticas de la solicitud, configurando variables a nivel de colecci\u00f3n o entorno, e incluso el m\u00e9todo o la URL de la solicitud.<\/p>\n\n\n\n<p>Bruno nos permite &#8220;ocultar&#8221; los valores de nuestros secretos, coloc\u00e1ndolos en un archivo .env guardado dentro de nuestro directorio de trabajo. Para evitar que este archivo sea p\u00fablico en nuestro control de versiones, debemos incluirlo en nuestro archivo .gitignore (para beneficio de nuestros colaboradores, podemos crear un archivo .env.example que contenga valores ficticios para indicarles c\u00f3mo crear su propio archivo .env).<\/p>\n\n\n\n<p>Podemos, entonces, extraer valores de nuestros secretos, generar datos aleatorios usando librer\u00edas externas y, por qu\u00e9 no, establecer valores devueltos por llamadas a otros servicios.<\/p>\n\n\n\n<p>Por ejemplo, podemos extraer el valor secret\u00edsimo &#8220;MySecretValue&#8221; del archivo de entorno actual para colocarlo tanto en un encabezado (X-Secret) como en una variable:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXetyo7IP1Yxpu1je1kywRMc5Lhb0nS4H6LKKxYsIkqr3-thjcWzYdYaW2d8LdI466x0bIL2r1A-BTVQVBd-mkRsCAjB24dzDPPvGhdEo9sxEypKWRNmuvpLkfEfbg4DweJWyWs9qBaCjAxA0UhKNxWtWJIpn0DXF4iRdJMOXly99XaM99-bBvo?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A black background with white text\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Tambi\u00e9n podemos definir variables sin necesidad de pasar por un script, utilizando la interfaz de usuario declarativa:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXd2hHsg6VDaBRBEpGCKzdd3NTa2Rflsiqyom5Im5V1Exx_vHcARcOmqTcq3N6B1o59vxcyZGGJcBJqZFJ39q503jyzX49I13haPrc4tex2qHdrX9wPncSBV0M-J1moYfjG43H62-tlff4FXMXhl6oOcjIVh9RfDGQxbpTa06mPFVU_-sWz9bIA?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A screenshot of a phone\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Lo que acabamos de definir se puede usar en el cuerpo de la solicitud, aprovechando la sintaxis del sistema de plantillas de Bruno:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXdzJiq1THuBXhQgG_1iTaiVoPYSMwa4oHFO_QZ6inWtSl756P05x9r_K7Wg8HAGRFEGdiZjFmrrpVrhudMa0SpWfjeWeWrBl4dmwvo2a4ECnfGoq__PBwnvgidek7HwIjtz4OnoDwnFpfWsF6FeRT__D10wFRvnpz3Isn2-fZtxk472_ACscdQ?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A computer code with text\n\nDescription automatically generated with medium confidence\"\/><\/figure>\n\n\n\n<p>Despu\u00e9s de ejecutar la solicitud, podemos verificar los par\u00e1metros en la pesta\u00f1a &#8220;Timeline&#8221; de la interfaz de usuario, donde podemos confirmar el encabezado configurado por el script (X-Secret) y el cuerpo poblado con los valores de nuestras variables:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXdR19TyjXWV1dMYvhLCwkK854FgZkKkUK1hZRqWEONNMvGnId6_CPldWWk-rYp2hOfR6MSL1JJCvTIcjlX1waiMiXDJlm8i-sFQnQRq03LAu5rW3zkvWdI-tJaO0k5UnonOn9vTOo9GoPHQ_HkI8IXd8uDSQe8_aHO86iMKByGdfGE6hr05zoQ?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"bruno vs postman\"\/><\/figure>\n\n\n\n<p>En este punto, el \u00fanico l\u00edmite que podemos tener es el de nuestra imaginaci\u00f3n. Por ejemplo, podemos usar las librer\u00edas previamente instaladas para generar una direcci\u00f3n de correo electr\u00f3nico (con faker) y &#8220;transformarla&#8221; en un color (con uniqolor), para enviar la solicitud a nuestro servicio de prueba:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXcm4tQBeVwYbM0__DL2Q96HzsyB8Bdbas5YVcX4yvFyyAZiTe0TpLHLky6tsyWBIGYnUuoq-qOGwhagCpH6ESpa7lfejusi4C7d4hb5QQuK3SkpTFDB1lpNWM0E2a_YogfiUw-KFjQnx4smdK_YLn7LioT-aUIC1wslhB1uWccPAhoKdPLHFw?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"bruno vs postman\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Request Body<\/td><td><\/td><td>Response<\/td><\/tr><tr><td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXf8FnI4O0WE1SZY47bjACWiMv0Eg2V2n_Hf27rm3MvzQhixYnEXF1u-VKJH9EcA_kt50FttpZ5W8QKTtpraM1eG650oNalkQpK0D8lGJZRHleK5Vj2yjb3QYayuqErvlPW5HHpy0ejJ2Ouvf5tD0AS-OoAzddje3n1DJrq6VcrZNO1taMM0LTE?key=wDJBajGaAoEE8aPjksGFbg\" width=\"191\" height=\"110\"><\/td><td>=&gt;<\/td><td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXeqQQPLky1wT37V8kAvWtQ_sAxS7iM63boFcXhFIYQPwbIvDR2qtuRyatPxC2bK_Mef-iOTyV9K5CEetwdQVL7Eiti_qsatF8bjKS3SPMSmuIQir6_AUWqeXEUxjboEFiuXNGIRrwGlMjYgtoietDLYG60mvYdZYeUd7BjF1bGuQboMg4pYLGA?key=wDJBajGaAoEE8aPjksGFbg\" width=\"228\" height=\"110\"><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Finalmente (spoiler de la pr\u00f3xima secci\u00f3n), podemos verificar, mediante Assert, que el servicio nos est\u00e9 devolviendo la misma direcci\u00f3n de correo electr\u00f3nico que hemos enviado:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXf13K-rDrEs8Z1v-rpzMK2KRQsjfKZWsmk9hR3rFnmm4TIYXRVILJMx4PGctkRlDL4JF_srRugzCHMVD_P_wNeNB9GbnFzRSh70sjM-zRhcATsvVYi5nZCNYcg1JZpe_jh4XTK_9mSTMgoiM3tPGhbYv7cw2tGbSwMkGvdN93tUrSh6rQcasl8?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A screenshot of a phone\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-asserts-declarativos\">Asserts Declarativos<\/h2>\n\n\n\n<p>Esta funcionalidad me ha &#8220;capturado&#8221; de inmediato, ya que simplifica enormemente la implementaci\u00f3n de los tests m\u00e1s &#8220;b\u00e1sicos&#8221; y, al mismo tiempo, permite la libertad de implementar l\u00f3gicas m\u00e1s complejas mediante scripts.<\/p>\n\n\n\n<p>Al final de cada solicitud, es posible configurar tests para verificar su correcto funcionamiento basado en nuestras suposiciones.<\/p>\n\n\n\n<p>Mientras que en Postman estamos obligados a escribir c\u00f3digo para implementar los tests, Bruno nos ofrece la posibilidad de &#8220;declararlos&#8221;, aligerando nuestro trabajo, al menos para aquellos m\u00e1s simples y lineales.<\/p>\n\n\n\n<p>Intentemos, por ejemplo, escribir algunos tests para la llamada a api.chucknorris.io, que t\u00edpicamente responde con un JSON similar a este:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXfiEoUUosUv6PIxMh3nH5d47urh-0RVfYhrz0aPV1Nv0Pw3C8c8JInSi2WoqeFqqT2w9FvlDK3ySL4KfubFhOrJOursC271B9Iy34iHayj4sSAfSbgeOjfBIpRwBzhzc8Ez55lgKbCxzbbNd02EhZyUEykdebgiQHrdvun40uFw9QZqkIL1qzQ?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A computer screen with text\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Supongamos que queremos verificar que:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El campo <strong>value <\/strong>sea efectivamente una cadena de texto.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El campo <strong>id <\/strong>cumpla con una expresi\u00f3n regular espec\u00edfica.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El estado de la respuesta sea 200 (OK).<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El campo <strong>updated_at<\/strong> sea efectivamente una fecha\/hora.<\/li>\n<\/ul>\n\n\n\n<p>Operando en el modo t\u00edpico de Postman, habr\u00edamos escrito tests como estos (lo cual, como podemos ver, tambi\u00e9n podemos hacer en Bruno):<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXdl5-S9YNr_w6EN_gUQ0bZ72pEJroseaa3-NBDWLDxT3ZSmq0yGQy3ibsgTS4ZBsHK3p4swmcI1zWXed1rMIqiUN3KFhnT9PnzibpgFBoNnMiu7NEEA9i_wo4mNXSGtZs_Sb-iMwZ9tnonwqVhmaa5VYHCV3-VMf648dvYSJXSXSb9roHRU7uw?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A computer screen shot of text\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Aparte de algunas peque\u00f1as diferencias sint\u00e1cticas, podemos constatar que los dos sistemas son bastante similares. Pero Bruno tiene un as bajo la manga, ya que nos permite &#8220;declarar&#8221; estos tests en el panel &#8220;Assert&#8221; de nuestra solicitud:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXeeDRK-g2QKA5h9gQTRc3reveplLHXpotLs90kusoGMx_P2-zQbGic36Hont4rokSebHlGKmTEoj5JiilseD6yAyVzEaG9hnhOoIoFELI59SxJajwOlYnOuJf3_3EYjvt_F3gXnc5odQvR2NZCpXm5Jb0VE2CJ4k209vMrKoYncJqnsa0Ygxg?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"A screenshot of a computer\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Notamos que la simplicidad de configuraci\u00f3n de los Assert me ha permitido verificar la validez del campo &#8220;updated_at&#8221; solo mediante una expresi\u00f3n regular y no utilizando la librer\u00eda moment, como fue posible hacer con los scripts.<\/p>\n\n\n\n<p>Detr\u00e1s de escena, en el archivo Bru, los Assert mencionados se traducen en estas pocas l\u00edneas de configuraci\u00f3n::<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXd1vEPmtxaPr4ozKHPonn8XZYVirVEEHoHzDsR68TJigQbVM02DZWzbX9ffIi2k9ipbmth0NIbTiAKwuepNuOtdL5tHzLAMDJIuK70ElEyGlWUeY1_TAmpJwrcnzEzDZs1Po5ac_B8Ii3Arn0IgshAWDTX3uugu8xxQhuFBp2vzzEgfl9hiFaE?key=wDJBajGaAoEE8aPjksGFbg\" alt=\"bruno vs postman\"\/><\/figure>\n\n\n\n<p><strong>Ejecutar las Colecciones<\/strong><\/p>\n\n\n\n<p>Es normal que, durante el desarrollo de una funcionalidad, se pruebe la API espec\u00edfica en la que se est\u00e1 trabajando. Asimismo, es igualmente normal que, al finalizar el trabajo, se ejecuten todas (o casi todas) las solicitudes de una colecci\u00f3n para verificar que no se han introducido regresiones.<\/p>\n\n\n\n<p>En este contexto, Postman muestra uno de sus l\u00edmites m\u00e1s odiados: el n\u00famero m\u00e1ximo de &#8220;collection run&#8221; disponibles mensualmente, que son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>25 para los planes Free\/Basic<\/li>\n\n\n\n<li>250 para el plan Professional<\/li>\n\n\n\n<li>Ilimitado para el plan Enterprise<\/li>\n<\/ul>\n\n\n\n<p>Sin entrar en el m\u00e9rito de estas decisiones, notamos que Bruno no nos impone ning\u00fan l\u00edmite, permiti\u00e9ndonos un n\u00famero ilimitado de ejecuciones: es suficiente seleccionar \u201cRun\u201d del men\u00fa desplegable asociado al nombre de la colecci\u00f3n para obtener el resultado de las llamadas:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXdVFmV_ukuVFWNWMkc046JA7I3ZzihX-UjNC9yOwVtCL1hCW8uX064qNYsaPGjuKBeMp4nj2V-3PiJo0hgztGvp-dbdGNuQB8DCxn_ApPhCVLhuZjwjQbg_E0jKZ56mz5Ewh9HlnjBDqQVPEaNujF2dQm922-M-6DmIOdK4quEhMsh4ewk07A?key=wDJBajGaAoEE8aPjksGFbg\" width=\"105\" height=\"98\"><\/td><td>=&gt;<\/td><td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXd7QahMSUGVwbm8ZIYUJpehtnoXOyantNjgaQ28lyNg1tXaCE0s9mL-Odd4vViqZqY5XzV3_eHv7SEP2Gi2s6hN0q8V9MMr4UnpdNkxy_K1CPFvGwMzPj_O1REM62axG_5gKD_21k9xmaDusA5SlnBbK798Jb1HKUJpmxCG-b1vI5Bq406nbso?key=wDJBajGaAoEE8aPjksGFbg\" width=\"205\" height=\"192\"><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Como alternativa a la interfaz de usuario, Bruno ofrece un ejecutor de l\u00ednea de comandos (CLI) que se puede instalar a trav\u00e9s de npm:<\/p>\n\n\n\n<p>npm install -g @usebruno\/cli<\/p>\n\n\n\n<p>A partir de este momento, tenemos a disposici\u00f3n nuestro ejecutor; para probarlo, abrimos un terminal y nos ubicamos en el directorio principal de nuestra colecci\u00f3n. Las principales modalidades de ejecuci\u00f3n son las siguientes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>bru run: Ejecuta todas las solicitudes de la colecci\u00f3n actual.<\/li>\n\n\n\n<li>bru run request.bru: Ejecuta una solicitud espec\u00edfica.<\/li>\n\n\n\n<li>bru run &lt;folder&gt;: Ejecuta todas las solicitudes de un directorio espec\u00edfico.<\/li>\n<\/ul>\n\n\n\n<p><strong>Modelos de Licenciamiento<\/strong><\/p>\n\n\n\n<p>Las licencias de software siempre han sido un tema delicado para las empresas, ya que a menudo se perciben como un costo (casi como un &#8220;peaje&#8221; en algunos casos) que no trae beneficios efectivos, aparte del enriquecimiento del productor (que, en cualquier caso, no vive del aire y del amor).<\/p>\n\n\n\n<p>Bruno, con su &#8220;Golden Edition&#8221;, ofrece a los usuarios algunas funcionalidades adicionales respecto a la versi\u00f3n Community, entre las que se incluyen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bru File Explorer<\/strong>: La posibilidad de modificar una solicitud accediendo directamente al archivo Bru que la representa, en lugar de gestionar scripts adicionales en JavaScript. Estas operaciones tambi\u00e9n son posibles sin licencia, pero en la versi\u00f3n Community es necesario recurrir a editores externos.<\/li>\n\n\n\n<li><strong>Visual Git<\/strong>: Una interfaz de usuario con la que gestionar visualmente la interacci\u00f3n con el control de versiones. Personalmente, soy &#8220;a la antigua&#8221; y uso la querida y vieja l\u00ednea de comandos&#8230; Pero para quienes est\u00e1n acostumbrados a estas herramientas visuales, se trata de una integraci\u00f3n interesante (similar a la extensi\u00f3n GitLens de VSCode).<\/li>\n\n\n\n<li><strong>Developer Tools<\/strong>: Una serie (hasta ahora relativamente m\u00ednima) de herramientas para la gesti\u00f3n de estructuras JSON (incluye un &#8220;beautifier&#8221; y un convertidor a YAML) y de JWT (incluye un decodificador).<\/li>\n<\/ul>\n\n\n\n<p>No olvidemos que, para Bruno, la &#8220;licencia&#8221; es principalmente sin\u00f3nimo de &#8220;apoyo al desarrollo&#8221;.<\/p>\n\n\n\n<p>En cuanto a Postman, la complejidad del modelo de licenciamiento es directamente proporcional a la amplitud de la oferta: cuatro planes (Free, Basic, Professional y Enterprise) con precios mensuales crecientes basados en el n\u00famero de usuarios.<\/p>\n\n\n\n<p>El l\u00edmite m\u00e1s importante, en mi opini\u00f3n, es el relativo al n\u00famero m\u00e1ximo de miembros del equipo, que en la versi\u00f3n Free est\u00e1 limitado a 3. Para ampliar el equipo incluso en una sola unidad es necesario pasar al menos a la versi\u00f3n Basic, enfrentando un costo no precisamente &#8220;insignificante&#8221;.<\/p>\n\n\n\n<p><strong>\u00bfQu\u00e9 le falta a Bruno?<\/strong><\/p>\n\n\n\n<p>Mientras que la primera commit de Bruno data de diciembre de 2021, Postman vio la luz en 2012, \u00a19 a\u00f1os antes! Estos a\u00f1os adicionales le han permitido difundirse y mejorar progresivamente, hasta convertirse, de hecho, en el est\u00e1ndar del sector.<\/p>\n\n\n\n<p>Seguramente a Bruno todav\u00eda le faltan muchas cosas para ser realmente considerado al nivel de Postman, por ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Flows<\/strong>: Editor visual de flujos de llamadas API.<\/li>\n\n\n\n<li><strong>Postbot<\/strong>: IA aplicada a la generaci\u00f3n de llamadas API, documentaci\u00f3n y tests.<\/li>\n\n\n\n<li><strong>Mock Servers<\/strong>: Permiten la simulaci\u00f3n de API a trav\u00e9s de la devoluci\u00f3n de datos (falsos) predefinidos.<\/li>\n<\/ul>\n\n\n\n<p>En mi opini\u00f3n, a pesar de estas &#8220;lagunas&#8221;, Bruno cumple excelentemente con sus funciones, ayudando enormemente en el trabajo diario de desarrollo.<\/p>\n\n\n\n<p>La comunidad de Bruno est\u00e1 en continuo crecimiento, lo que permite tener esperanzas en un futuro prometedor, lleno de nuevas ideas, caracter\u00edsticas y mejoras, en beneficio del producto mismo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><a href=\"https:\/\/www.codemotion.com\/magazine\/es\/dev-life-es\/como-encontrar-proyectos-de-codigo-abierto-interesantes\/\" class=\"ek-link\"><strong><em>Art\u00edculo recomendado: c\u00f3mo encontrar proyectos de c\u00f3digo abierto interesantes<\/em><\/strong><\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><strong>Bruno vs Postman: Conclusiones<\/strong><\/p>\n\n\n\n<p>Nunca he sido un defensor del software &#8220;perfecto&#8221;, s\u00e9 muy bien que no existe. En cambio, estoy firmemente convencido de que puede existir el que mejor se adapta a nuestras necesidades.<\/p>\n\n\n\n<p>Sin pretender tener la verdad absoluta y, sobre todo, sin la necesidad de vender nada a nadie (algo que, como t\u00e9cnico, no soy capaz de hacer), me permito recomendaros que deis una oportunidad a Bruno. Estoy seguro de que os gustar\u00e1 y, qui\u00e9n sabe, tal vez descubrais que es justo lo que necesitais.<\/p>\n\n\n\n<p>Lo hab\u00e9is probado? \u00bfOs ha resuelto alg\u00fan problema? \u00bfQu\u00e9 pens\u00e1is que no funciona o se podr\u00eda mejorar?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bruno es un cliente de API de c\u00f3digo abierto que, desde hace alg\u00fan tiempo, se est\u00e1 difundiendo r\u00e1pidamente, ganando terreno frente al popular\u00edsimo Postman. Se trata de un proyecto que quiere crecer con el apoyo de su propia comunidad, sin la participaci\u00f3n de empresas externas (excepto como patrocinadores) y, sobre todo, con la firme voluntad&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/\">Read more<\/a><\/p>\n","protected":false},"author":261,"featured_media":28089,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10606],"tags":[12230],"collections":[],"class_list":{"0":"post-28081","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-backend-es","8":"tag-postman-es","9":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bruno vs Postman: La Batalla de las API - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"Este art\u00edculo compara Bruno y Postman. Bruno es una opci\u00f3n open source que gana cada vez m\u00e1s popularidad y adeptos. \u00a1Descubre m\u00e1s!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bruno vs Postman: La Batalla de las API\" \/>\n<meta property=\"og:description\" content=\"Este art\u00edculo compara Bruno y Postman. Bruno es una opci\u00f3n open source que gana cada vez m\u00e1s popularidad y adeptos. \u00a1Descubre m\u00e1s!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-10T09:19:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-11T16:22:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1368\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Fabio Grande\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fabio Grande\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/\"},\"author\":{\"name\":\"Fabio Grande\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/d47d145dba7746776b7d736aecffdd44\"},\"headline\":\"Bruno vs Postman: La Batalla de las API\",\"datePublished\":\"2024-06-10T09:19:30+00:00\",\"dateModified\":\"2024-06-11T16:22:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/\"},\"wordCount\":2678,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg\",\"keywords\":[\"postman\"],\"articleSection\":[\"Backend\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/\",\"name\":\"Bruno vs Postman: La Batalla de las API - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg\",\"datePublished\":\"2024-06-10T09:19:30+00:00\",\"dateModified\":\"2024-06-11T16:22:08+00:00\",\"description\":\"Este art\u00edculo compara Bruno y Postman. Bruno es una opci\u00f3n open source que gana cada vez m\u00e1s popularidad y adeptos. \u00a1Descubre m\u00e1s!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg\",\"width\":1368,\"height\":768,\"caption\":\"Bruno vs postman\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/bruno-vs-postman-la-batalla-de-las-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Backend\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/backend-es\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Bruno vs Postman: La Batalla de las API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Codemotion.Italy\\\/\",\"https:\\\/\\\/x.com\\\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/d47d145dba7746776b7d736aecffdd44\",\"name\":\"Fabio Grande\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/fabio-grande-profile-100x100.jpg\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/fabio-grande-profile-100x100.jpg\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/fabio-grande-profile-100x100.jpg\",\"caption\":\"Fabio Grande\"},\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/author\\\/fabio-grande\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Bruno vs Postman: La Batalla de las API - Codemotion Magazine","description":"Este art\u00edculo compara Bruno y Postman. Bruno es una opci\u00f3n open source que gana cada vez m\u00e1s popularidad y adeptos. \u00a1Descubre m\u00e1s!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/","og_locale":"en_US","og_type":"article","og_title":"Bruno vs Postman: La Batalla de las API","og_description":"Este art\u00edculo compara Bruno y Postman. Bruno es una opci\u00f3n open source que gana cada vez m\u00e1s popularidad y adeptos. \u00a1Descubre m\u00e1s!","og_url":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-06-10T09:19:30+00:00","article_modified_time":"2024-06-11T16:22:08+00:00","og_image":[{"width":1368,"height":768,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg","type":"image\/jpeg"}],"author":"Fabio Grande","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Fabio Grande","Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/"},"author":{"name":"Fabio Grande","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/d47d145dba7746776b7d736aecffdd44"},"headline":"Bruno vs Postman: La Batalla de las API","datePublished":"2024-06-10T09:19:30+00:00","dateModified":"2024-06-11T16:22:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/"},"wordCount":2678,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg","keywords":["postman"],"articleSection":["Backend"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/","url":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/","name":"Bruno vs Postman: La Batalla de las API - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg","datePublished":"2024-06-10T09:19:30+00:00","dateModified":"2024-06-11T16:22:08+00:00","description":"Este art\u00edculo compara Bruno y Postman. Bruno es una opci\u00f3n open source que gana cada vez m\u00e1s popularidad y adeptos. \u00a1Descubre m\u00e1s!","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg","width":1368,"height":768,"caption":"Bruno vs postman"},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/bruno-vs-postman-la-batalla-de-las-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Backend","item":"https:\/\/www.codemotion.com\/magazine\/es\/backend-es\/"},{"@type":"ListItem","position":3,"name":"Bruno vs Postman: La Batalla de las API"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/d47d145dba7746776b7d736aecffdd44","name":"Fabio Grande","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/fabio-grande-profile-100x100.jpg","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/fabio-grande-profile-100x100.jpg","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/fabio-grande-profile-100x100.jpg","caption":"Fabio Grande"},"url":"https:\/\/www.codemotion.com\/magazine\/author\/fabio-grande\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-600x400.jpg","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-600x600.jpg","author_info":{"display_name":"Fabio Grande","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/fabio-grande\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg",1368,768,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-150x150.jpg",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-300x168.jpg",300,168,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-768x431.jpg",768,431,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-1024x575.jpg",1024,575,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg",1368,768,false],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2.jpg",1368,768,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-100x100.jpg",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-180x128.jpg",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-896x504.jpg",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-400x225.jpg",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-600x400.jpg",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2024\/06\/Default_an_happy_golden_retriever_floating_in_space_with_an_as_2-600x600.jpg",600,600,true]},"uagb_author_info":{"display_name":"Fabio Grande","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/fabio-grande\/"},"uagb_comment_info":0,"uagb_excerpt":"Bruno es un cliente de API de c\u00f3digo abierto que, desde hace alg\u00fan tiempo, se est\u00e1 difundiendo r\u00e1pidamente, ganando terreno frente al popular\u00edsimo Postman. Se trata de un proyecto que quiere crecer con el apoyo de su propia comunidad, sin la participaci\u00f3n de empresas externas (excepto como patrocinadores) y, sobre todo, con la firme voluntad&#8230;&hellip;","lang":"es","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28081","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/261"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=28081"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28081\/revisions"}],"predecessor-version":[{"id":28103,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28081\/revisions\/28103"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/28089"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=28081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=28081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=28081"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=28081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}