{"id":28087,"date":"2024-06-06T15:11:32","date_gmt":"2024-06-06T13:11:32","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=28087"},"modified":"2024-06-06T15:11:34","modified_gmt":"2024-06-06T13:11:34","slug":"le-api-di-bruno-bruno-vs-postman","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/","title":{"rendered":"Le API di Bruno \u2013 Bruno vs Postman"},"content":{"rendered":"\n<p>Bruno \u00e8 un <strong>API Client open source che<\/strong>, ormai da qualche tempo, si sta rapidamente diffondendo, guadagnando terreno nei confronti del popolarissimo <strong>Postman<\/strong>.<\/p>\n\n\n\n<p>Si tratta di un progetto che vuole crescere con il supporto della propria Community, senza la partecipazione di aziende terze (se non come sponsor) e, soprattutto, con la forte volont\u00e0 di non farsi acquisire. Insomma, vogliono camminare con le loro gambe, mantenendo la propria identit\u00e0, accettando aiuti esterni, senza per\u00f2 permettere alcuna interferenza nella gestione del progetto.&nbsp;<\/p>\n\n\n\n<p>Di questi tempi \u00e8 certamente un nobile intento, auguriamoci che duri.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-perche-bruno\">Perch\u00e9 Bruno<\/h2>\n\n\n\n<p>Non so per voi ma, per me, Postman \u00e8 da sempre sinonimo di \u201caffidabilit\u00e0\u201d e \u201cabitudine\u201d: nonostante alcuni piccoli dettagli (ad esempio il non poter modificare le request se non attraverso la sua interfaccia) l\u2019ho sempre trovato adatto a quelle che sono le mie esigenze. La mia caratteristica pigrizia ha fatto il resto: tutte le mie collection sono li da tempo immemore, e pensare di riorganizzarle altrove mi ha sempre fatto accapponare la pelle.<\/p>\n\n\n\n<p>Tutto perfetto, dunque, finch\u00e9 non mi sono trovato nella condizione di dover condividere \u201cseriamente\u201d le mie request con il Team, per un\u2019effettiva collaborazione: tra i costi per la subscription e la gestione condivisa delle chiamate, che richiede \u2013 come ogni inizio \u2013 frequentissime variazioni, la mia perplessit\u00e0 cresceva quotidianamente\u2026<\/p>\n\n\n\n<p>E poi arriva Bruno (mi ricorda tanto il titolo di un film\u2026), che con la sua <strong>semplicit\u00e0 architetturale cattura immediatamente la mia attenzione,<\/strong> spingendomi addirittura ad importare alcune collection di Postman.<\/p>\n\n\n\n<p>In questo post, provo a riepilogare i punti di \u201ccontatto\u201d (o, se preferite, di \u201cattrito\u201d) tra i due concorrenti, analizzandoli da entrambi i punti di vista per arrivare a decretare \u2013 ancorch\u00e9 possibile \u2013 il vincitore di questa sfida. Iniziamo!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-salvataggio-delle-configurazioni\">Salvataggio delle Configurazioni<\/h3>\n\n\n\n<p>Mentre Postman salva le configurazioni di collection e request nel suo Cloud, Bruno le salva sul filesystem della macchina locale, nei suoi files \u201cbru\u201d. Sebbene questa possa sembrare cosa da poco, \u00e8 in realt\u00e0 una differenza enorme che si ripercuote pesantemente sul tema della collaborazione (di cui parleremo pi\u00f9 avanti), dell\u2019usabilit\u00e0 e della privacy.<\/p>\n\n\n\n<p>In termini di usabilit\u00e0, per modificare collection e request, oltre alla UI di Bruno, possiamo modificare direttamente i files di configurazione (i \u201c.bru\u201d per l\u2019appunto) che, nella loro versione pi\u00f9 semplice, sono simili al seguente:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXexPKO9u2SgwpDf2chrSIG-z4lvtFUyxmdzkYG2fGTWuGD-WYhkkaiveMIiWAwNtV4dsGcyxcLbH6LFcifYCAXCZGyvdEssTEq7Hq11Woi7wm-OfKsR1gAP11O4ZGYsoZy9t4F3w8tKChOFAXy7-ZIE7PEOMSv1ANfuaH9RdCD9bBdHQHpUozk?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A screen shot of a computer\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Un ottimo editor che mi sento di consigliarvi (ancorch\u00e9 ve ne sia necessit\u00e0) per l\u2019editing dei files Bru \u00e8 Visual Studio Code, per il quale (guarda il caso, alle volte) esiste l\u2019extension denominata \u201cBruno\u201d che implementa la syntax highlighting per facilitarne la gestione.<\/p>\n\n\n\n<p>Si aggiunga che Bruno non ha un proprio Cloud (e, stando al loro Manifest, \u00e8 molto probabile che non l\u2019avr\u00e0 mai) per cui la persistenza delle configurazioni \u00e8 totalmente a carico dell\u2019utente: quindi, considerando che i files di configurazione delle collection e delle request risiedono solo sul filesystem delle nostre macchine, la privacy \u00e8 garantita al 100%. La loro eventuale condivisione \u00e8 esclusivamente nelle nostre mani.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-collaborazione\">Collaborazione<\/h3>\n\n\n\n<p>In netta contrapposizione alla filosofia di Postman, che persiste le nostre configurazioni in qualche indefinito angolo del suo Cloud, abbiamo visto che, in Bruno, le definizioni delle request (e collection) risiedono sul nostro filesystem locale, e sono rappresentate da file di testo in formato Bru.<\/p>\n\n\n\n<p>Quindi, se \u00e8 vero che in Postman posso fare un backup esportando la mia collection, \u00e8 altrettando vero che in Bruno posso facilmente trasformare la mia struttura su filesystem in un repository Git (o SVN, o Mercurial\u2026) per pusharlo su BitBucket, GitHub o GitLab (e chi pi\u00f9 ne ha pi\u00f9 ne metta).<\/p>\n\n\n\n<p>Abbiamo appena implementato la condivisione a livello di Team!!<\/p>\n\n\n\n<p>Mentre Postman ci obbliga ad acquistare licenze per Teams composti da pi\u00f9 di 3 Utenti (ed i prezzi non sono esattamente \u201cpopolari\u201d), Bruno ci offre gratuitamente questa stessa possibilit\u00e0 \u201cout-of-the-box\u201d, senza alcun limite: sta a noi decidere cosa (e con chi) condividere le request. Non \u00e8 meraviglioso?&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-online-offline\">Online? Offline!<\/h3>\n\n\n\n<p>Devo ammettere che non mi sono mai accorto di questo dettaglio, in quanto la mia quotidianit\u00e0 mi porta ad essere sempre connesso, ma- a quanto pare \u2013 Postman funziona solo in modalit\u00e0 \u201conline\u201d. Quindi, non si avvia se non ha la possibilit\u00e0 di contattare i suoi server (ma perch\u00e9?!?!).<\/p>\n\n\n\n<p>Al contrario, <strong>Bruno non ha alcuna necessit\u00e0 di connessione<\/strong>, in quanto tutto ci\u00f2 di cui ha bisogno risiede sul filesystem locale. Questo significa che \u00e8 possibile, in fase di sviluppo di un servizio, effettuare chiamate all\u2019ambiente locale anche se siete isolati dal resto del mondo.\u00a0<\/p>\n\n\n\n<p>Questo \u00e8 un altro \u201cdettaglio\u201d che va a consolidare ulteriormente il rispetto che Bruno ha per la nostra privacy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-uso-di-librerie-esterne\">Uso di Librerie Esterne<\/h3>\n\n\n\n<p>Per un Dev, l\u2019utilizzo di librerie esterne rappresenta la normalit\u00e0 (la ruota ed il fuoco li hanno gi\u00e0 inventati da tempo, non serve reinventarli) e trova un senso anche in questo contesto.<\/p>\n\n\n\n<p>Sia Postman che Bruno offrono librerie precaricate, immediatamente fruibili, che sono in grado di coprire la maggior parte delle nostre esigenze, ad esempio:<\/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 non sembra \u201cstrutturato\u201d per accogliere librerie esterne nel suo ecosistema. Le alternative per farlo sono sostanzialmente due:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Via script, scaricare la libreria da un CDN ed eseguire la funzione eval sulla stringa restituita. A seconda di dove viene posta questa chiamata, la libreria \u00e8 scaricata a ogni esecuzione di request o test.<\/li>\n\n\n\n<li>Porre il codice sorgente della libreria in una variabile a livello di collection (o environment) e invocare una \u201canonymous function\u201d per ottenere l\u2019accesso ai suoi metodi.<\/li>\n<\/ol>\n\n\n\n<p>Sicuramente \u00e8 pi\u00f9 facile a farsi che a dirsi ma, a parer mio, \u00e8 un po\u2019 complesso.<\/p>\n\n\n\n<p>In Bruno le cose sono molto pi\u00f9 semplici: la prima cosa da fare \u00e8 quella di creare il file package.json con le librerie che vogliamo includere e metterlo nella root del nostro progetto:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXdy6IqTxO1Z2yrtfvitMfJ5NNX3FCQEKVvZY-EMVTWopNeq5FetaF3aL29tBOk5VnFKsqT3CQKAVPvO-qe0aRIBzqWfyP0TE6neGNNrNFTmVAhgPmOZNrmN2kl1SfhGunEjKWFEMkltoWVNUrqLO5WpdWly9LV8Jsmy2DouYrnUQnK6fzZ1qf0?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A screen shot of a computer code\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Poi, come se fosse un qualunque progetto NodeJS, installiamo le dipendenze:<\/p>\n\n\n\n<p>npm install<\/p>\n\n\n\n<p>Da questo momento, le librerie sono a nostra disposizione e possiamo usarle ovunque, nell\u2019ambito della nostra collection.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-scripting\">Scripting<\/h3>\n\n\n\n<p>Bruno, come Postman, offre la possibilit\u00e0 di customizzare le chiamate nei seguenti eventi:<\/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>Ognuno di questi eventi pu\u00f2 essere personalizzato a livello di singola request (e quindi focalizzato su una singola richiesta) oppure a livello di collection (e quindi con effetto su tutte le sottostanti richieste).<\/p>\n\n\n\n<p>I motivi per cui si rende necessaria l\u2019introduzione dello scripting sono i pi\u00f9 disparati, dalla precompilazione delle variabili di una request\/collection allo stacco di un JWT pre l\u2019autenticazione, senza dimenticare l\u2019elaborazione delle risposte ottenute dalle chiamate e chiss\u00e0 quante altre possibilit\u00e0.<\/p>\n\n\n\n<p>Nel contesto dello scripting, Bruno mette a disposizione tre variabili fondamentali:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>req<\/em><\/strong> \u2013 Rappresenta la request.<\/li>\n\n\n\n<li><strong><em>res<\/em><\/strong> \u2013 Rappresenta la response.<\/li>\n\n\n\n<li><strong><em>bru<\/em><\/strong> \u2013 Espone metodi che ci permettono di interagire con Bruno ed il suo ecosistema.<\/li>\n<\/ul>\n\n\n\n<p>Nella sezione \u201cPre Request\u201d possiamo andare a forzare le caratteristiche della richiesta, impostando variabili a livello di Collection o Environment se non addirittura il metodo o l\u2019url della request.<\/p>\n\n\n\n<p>Bruno ci permette di \u201cnascondere\u201d i valori dei nostri secret, ponendoli in un file \u201c.env\u201d salvato all\u2019interno della nostra directory di lavoro. Per evitare che questo file venga reso pubblico dal nostro Source Control dobbiamo indicarlo nel nostro \u201c.gitignore\u201d (eventualmente a beneficio dei nostri collaboratori andremo a creare un file \u201c.env.example\u201d che conterr\u00e0 valori fake per indicare ad ognuno di loro come creare il proprio file .env).<\/p>\n\n\n\n<p>Possiamo quindi pensare di estrarre valori dai nostri secrets, generare dati randoom usando librerie esterne e, perch\u00e9 no, impostare valori restituiti da chiamate ad altri servizi.<\/p>\n\n\n\n<p>Ad esempio, possiamo estrarre il segretissimo valore \u201cMySecretValue\u201d dal file di environment corrente per metterlo sia in un Header (X-Secret) che in una variabile:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXeXDo9A2nVtuW-8ae26O1zfpvYLM1sd2gsrj2xAO4WSPrC76GOTPEe_HYXPSRtrTTdM4SR8mYLGmVtw98snv90x7XWRYgw2SG5m0mP0Z_pqF0uT0ZWOocpeLDtI3NBtqgCyWkYuVP8FV74EApmQqs4Sh4SaEJLm5yCcQFBAXlsG-nc4lz39L5A?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A black background with white text\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Possiamo anche definire variabili senza passare per uno script, bens\u00ec sfruttando la UI dichiarativa:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXcFdOuZBtc_RZapJF9RcpggkIDoGJ2eDC8HTgIVnKstBFWlnxXWVJFBNQiVxJcEvjCTNHywROVm6dUz2LkwmhY9BBNmHW5MRXislHN5hJp-D9HElDlXvejZ6T4C2BdPj2Kn0eMzL_WPUFBYZgNvtQ7umMKHuCPJxluv67rWgb7snZkaj6OxQHc?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A screenshot of a phone\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Ci\u00f2 che abbiamo appena definito pu\u00f2 essere usato nel body della request, sfruttando la sintassi del sistema di templating di Bruno:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXe_xPpx7fEmllISA8dqFUGL4vFIgqTuOWkkf_qHU1u8XpY1yjDQvYkWPNlpVLNLmXmpIyKYPAVgLerq1NwG_auR8KMVN5GmYDTD9M1SZ7_1-Jh065gTn3gZ156DXfYyL4pVE446DSCt6e75IdgZT5H1CtoclqTbD6kbbMQ7f64uFH0aWO85q4Y?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A computer code with text\n\nDescription automatically generated with medium confidence\"\/><\/figure>\n\n\n\n<p>Dopo aver eseguito la request, possiamo verificare i parametri nel Tab \u201cTimeline\u201d della UI, dove possiamo avere conferma dell\u2019Header impostato da Script (X-Secret) e del body popolato con i valori delle nostre variabili:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXfurKtUtYbT4a11numeoCA88EfdHYvZ8xm1fl9u-qqRqUvK2Xo0vDMcjUH2vThUQzDGFqpG-sOrur1H9oJK0Rh2s1yhG5cuknZrssq_SZDdlBuI2i5pP2H5cNimVTeViBWeW6bgLiC8JoYVXlBF4lRTnMxeCBL3NkSnPdYfCB859Gl8l1YwzYA?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A screenshot of a computer program\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>A questo punto, l\u2019unico limite che possiamo porci \u00e8 quello della fantasia. Ad esempio, ancora, possiamo usare le librerie precedentemente installate per generare un indirizzo e-mail (con <strong><em>faker<\/em><\/strong>) e \u201ctrasformarlo\u201d in un colore (con <strong><em>uniqolor<\/em><\/strong>), per inviare la richiesta al nostro servizio di test:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXen7A7zwl0rS9kyricEMmjPflzrV4Osv2cuxFzO1p0YFCAj4deGuob4dmKLPKe5KVi3RIBQh1GONESPMp9l5bHz1smBijg35O4XNFVl7GQhjZHwZ4hB-j29Ghc1EzquoVbQc4UNW9Dr9Vghw2gBpjgit-Q9brxq8ia8oRFy-uYKOr_t1HrZ5w?key=6pTmJzUPhww4bcjhEL6hxA\" 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_4nXdBJ_5QtIQuAH85a_NcG2FwNjKmmcE_nZ0bLu2HjJM52i0QajBBCYK7EQWdMDRFkBvZxPvoB9Ap6GUrYWeSov6vmOmkfN18XE8z7Qb_cSEO4qsrqDi_qotT6KbcMjwnU_TUSoi9T4OapjHSGyVv4j903nkypuJpx4ewZ9JyHIK1ZFgHXsCVylI?key=6pTmJzUPhww4bcjhEL6hxA\" width=\"191\" height=\"110\"><\/td><td>=&gt;<\/td><td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXeoEW_Md02MkvkhWX95NmL0d1dZd43KoUqJpwSIt-uV1D7XXy0cJHlCxyGy6lic9bfzlDe3xA7fzHQnrHK6yNJGlrIU0qFbG4pwukKirRmegiIR8yBAQjCBbSC-4VWqmT_ANKU0j3KDwxDgKsaoqTmQiwlXno2yAiNvff8WgdW6T9XktGFrE6A?key=6pTmJzUPhww4bcjhEL6hxA\" width=\"228\" height=\"110\"><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Infine (spoiler della prossima sezione) possiamo verificare \u2013 tramite Assert &#8211; che il servizio ci stia restituendo lo stesso indirizzo mail che abbiamo inviato:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXelwJqQjobrms6mlGup8WMeiNwVAiz70c76tS887hITQis2RJHQMRBLXmyJsunImFcdGExLEecTjbGDOi4xGUTYaTyxI7vblbxwZjBJ92HKUzRsNJUvmlMZhwgK2FozRoGaOBFc_iCdrkIvBbB738vEt6_rp1Juzf7t_H63TcHv52VwcJZHSA?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A screenshot of a phone\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-assert-dichiarativi\">Assert Dichiarativi<\/h3>\n\n\n\n<p>Questa \u00e8 una funzionalit\u00e0 che mi ha immediatamente \u201ccatturato\u201d, in quanto ha enormemente semplificato l\u2019implementazione dei Test pi\u00f9 (passatemi il termine) \u201cbanali\u201d lasciando comunque la libert\u00e0, tramite script, di implementare logiche pi\u00f9 complesse.<\/p>\n\n\n\n<p>Al termine di ogni request \u00e8 possibile impostare dei Test, per verificarne il corretto funzionamento sulla base delle nostre assunzioni.<\/p>\n\n\n\n<p>Mentre in Postman, per implementare i Test, siamo costretti a scrivere del codice, Bruno ci offre la possibilit\u00e0 di \u201cdichiararli\u201d alleggerendo il nostro lavoro (almeno) per quelli pi\u00f9 semplici e lineari.<\/p>\n\n\n\n<p>Proviamo, per esempio, a scrivere qualche test per la chiamata a api.chucknorris.io che, tipicamente, risponde con un JSON simile a questo:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXf7I8QPUC9os9s8cUhp7ZgKN4L11kUo8Yo2dorWqLKxF_9laaLlwB4AxO7BfQ3zSmteUefFbjLITvM-RKvJhhNs3zANp4oy1__w9i_Rd8E9yLi3F_ksIyilx7PzJ-VttxgEWvQtJ6shJ682dUIa7Tzg47_qtJgcpiCkkEaibXc73LkBNQ5Usg?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A computer screen with text\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<p>Ipotizziamo di voler verificare che:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Il campo <strong><em>value<\/em><\/strong> sia effettivamente una stringa.<\/li>\n\n\n\n<li>Il campo <strong><em>id<\/em><\/strong> rispetti una specifica Regular Expression.<\/li>\n\n\n\n<li>Lo status della response sia 200 (OK).<\/li>\n\n\n\n<li>Il campo <strong><em>update_at<\/em><\/strong> sia effettivamente una data\/ora.<\/li>\n<\/ul>\n\n\n\n<p>Operando nella modalit\u00e0 tipica di Postman avremmo scritto dei test come questi (cosa che, come possiamo constatare, possiamo fare anche in Bruno):<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXeohsAIoOsAtnQKbqkkziv3-lA5n7RCEkD_tsmC3v2EDHljdVjH5C8mq0Pp4AtyhcgYe7QQrftfr7w-KIS5Oldy5pn8GHEQnruS-8h5Sn_ldQOmhX29CjesLoNfkRHcutrAY7fTd6ymeNXvGeILKOmazu2ap7ZZ4XQt1J6hlZwEgVVUO8Aip-0?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"Bruno vs postman\"\/><\/figure>\n\n\n\n<p>Tolta qualche piccola differenza sintattica, possiamo constatare che i due sistemi sono abbastanza simili. Ma Bruno ha un asso nella manica, in quanto ci permette di \u201cdichiarare\u201d questi test nel pannello \u201cAssert\u201d della nostra Request:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXcU3UeQvHQwiop91wJRrmT7cQ-eOfNgC4VbxTgl1fxWwEXHy-TSKk6ZXqiCc70xPm0TMqlDCIIxSG5bccHj-TMg9y_fgHMLjEvweAaGUrnOSI3RcnMq1H42uYIlavs6YaNWM5ohUO1TNPV8usQu0SiipwBL_eJpKQ1MZwrevcv_MMusQRf33uQ?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"Bruno vs Postman\"\/><\/figure>\n\n\n\n<p>Notiamo che la semplicit\u00e0 di configurazione degli Assert mi ha permesso di controllare la validit\u00e0 del campo \u201cupdated_at\u201d solamente attraverso una Regular Expression e non sfruttando la libreria <strong><em>moment<\/em><\/strong>, come \u00e8 stato invece possibile fare con gli script.<\/p>\n\n\n\n<p>Dietro le quinte, nel file Bru, i sopraccitati Assert si traducono in queste poche righe di configurazione:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXcSJMQipqztneJAFGd6IprpzUiF1XvQjbaffxG_zGkmrbC9rgHhfTWTrrZ5BYk4gKwtrurdg3sz-LN-0wmfj3DVgyk6ez9vEIS-UxjXY4YS0UshjWOstY3wmQujfLad_ZBvryckB5j7C_hAeFTKxxAFFQbuLyEt3iIko76EogGvkENyEooyIao?key=6pTmJzUPhww4bcjhEL6hxA\" alt=\"A black background with white text\n\nDescription automatically generated\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-eseguire-le-collection\">Eseguire le Collection<\/h3>\n\n\n\n<p>\u00c8 normale che, durante lo sviluppo di una funzionalit\u00e0, si vada a testare la specifica API su cui si sta lavorando. Cos\u00ec come \u00e8 altrettanto normale che, al termine del lavoro, si lancino tutte (o quasi) le request di una collection per verificare di non aver introdotto regressioni.<\/p>\n\n\n\n<p>In questo contesto, il buon Postman mostra uno dei suoi limiti pi\u00f9 odiati: ilnumero massimo di \u201ccollection run\u201d disponibili mensilmente, ovvero:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>25 per i piani Free\/Basic<\/li>\n\n\n\n<li>250 per il piano Professional<\/li>\n\n\n\n<li>Unlimited per il piano Enterprise<\/li>\n<\/ul>\n\n\n\n<p>Senza entrare nel merito di queste scelte, rileviamo che Bruno non ci impone alcun limite, permettendoci un numero illimitato di esecuzioni: \u00e8 sufficiente selezionare \u201cRun\u201d dal menu a tendina legato al nome della Collection per ottenere il risultato delle chiamate:<\/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_4nXe4JgbPP4s9IT7Yrr6_7p2oxvwDzIrOSmShQFxyPumEuH0GsvXsMzvZeuM6Jwso-1meZtUkYamDwLMzmuhwvEegDjoqRpyI2ggCjT6pes45YjS5aPKQXtqz8dLBLjlV7dqWZ1BHTl7q3zFxK8avqNSjlwWfU05Er2RwZABebsV9R_8bhGNQqQE?key=6pTmJzUPhww4bcjhEL6hxA\" width=\"105\" height=\"98\"><\/td><td>=&gt;<\/td><td><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/docsz\/AD_4nXcXjhvb7eQKOeafUj8zMJzbyEE5_o85qYOycARQ_1DGeBbTZSFftIC_fqYqXlY7VWYwlw_rE5xF9cShJxpThs9Ntb8_yyS9LyDs47IwRykqc9_IZWMOeydVqzj-Al4Kb-DAtC7tCLIT5Gez0FVTbIbHhs7O7Y_ut1Tb_W62LUjxSRTVP68row?key=6pTmJzUPhww4bcjhEL6hxA\" width=\"205\" height=\"192\"><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>In alternativa alla UI, Bruno offre un runner CLI (bru), che si pu\u00f2 installare attraverso npm:<\/p>\n\n\n\n<p>npm install -g @usebruno\/cli<\/p>\n\n\n\n<p>da questo momento abbiamo a disposizione il nostro runner; per provarlo, apriamo un terminale e posizioniamoci nella directory principale della nostra collection. Le principali modalit\u00e0 di esecuzione sono le seguenti:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong><em>bru run<\/em><\/strong><\/td><td>Esegue tutte le request della collection corrente<\/td><\/tr><tr><td><strong><em>bru run request.bru<\/em><\/strong><\/td><td>Esegue una specifica request<\/td><\/tr><tr><td><strong><em>bru run &lt;folder&gt;<\/em><\/strong><\/td><td>Esegue tutte le request di una specifica directory<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-modelli-di-licensing\">Modelli di Licensing<\/h3>\n\n\n\n<p>Le licenze software sono sempre state un tasto dolente per le aziende, poich\u00e9 (spesso) vengono vissute come un costo (quasi un \u201cpizzo\u201d in alcuni casi) che non porta benefici effettivi se non l\u2019arricchimento del produttore (che, comunque, non vive d\u2019aria e d\u2019amore).<\/p>\n\n\n\n<p>Bruno, con la sua \u201cGolden Edition\u201d mette a disposizione degli Utenti alcune funzionalit\u00e0 in pi\u00f9 rispetto alla Community, tra cui:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>Bru File Explorer,<\/em><\/strong> ovvero la possibilit\u00e0 di modificare una request accedendo direttamente al file Bru che la rappresenta, piuttosto che gestire eventuali script js aggiuntivi. Sono operazioni comunque possibili anche senza licenza, ma nella versione Community \u00e8 necessario ricorrere a editor esterni.<\/li>\n\n\n\n<li><strong><em>Visual Git<\/em><\/strong>, una UI con cui gestire in maniera visuale l\u2019interazione con il Source Control. Personalmente sono \u201call\u2019antica\u201d, uso la cara e vecchia linea di comando\u2026 Ma per chi \u00e8 avvezzo a questi strumenti visuali, si tratta di un\u2019integrazione interessante (simile all\u2019extension GitLens di VSCode).<\/li>\n\n\n\n<li><strong><em>Developer Tools<\/em><\/strong>, una serie (ad oggi relativamente minimale) di tools per la gestione delle strutture JSON (include un \u201cbeautyfier\u201d ed un convertitore a YAML) e dei JWT (include un decoder).<\/li>\n<\/ul>\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\/it\/open-source\/come-trovare-progetti-open-source-interessanti\/\" class=\"ek-link\"><strong><em>Articolo consigliato: come trovare progetti open source interessanti<\/em><\/strong><\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Non dimentichiamo che, per Bruno, la \u201cLicenza\u201d \u00e8 principalmente sinonimo di \u201csupporto allo sviluppo\u201d.<\/p>\n\n\n\n<p>Per quanto riguarda Postman, la complessit\u00e0 del modello di licensing \u00e8 direttamente proporzionale alla vastit\u00e0 dell\u2019offerta: quattro piani (Free, Basic, Professional ed Enterprise) a prezzi mensili crescenti basati sul singolo Utente.<\/p>\n\n\n\n<p>Il limite, a parer mio, pi\u00f9 importante \u00e8 quello relativo al numero massimo di componenti del Team che nella versione Free \u00e8 fermo a 3. Per far crescere il Team anche di una sola unit\u00e0 \u00e8 necessario passare almeno alla versione Basic, affrontando un costo non proprio \u201cindifferente\u201d.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cosa-manca-a-bruno\">Cosa manca a Bruno?<\/h3>\n\n\n\n<p>Mentre la prima commit di Bruno risale al Dicembre 2021, Postman ha visto la luce nel 2012, ben 9 anni prima! Questi anni in pi\u00f9 gli hanno permesso di diffondersi e migliorarsi progressivamente, fino a diventare, di fatto, lo standard del settore.<\/p>\n\n\n\n<p>Sicuramente a Bruno mancano ancora tante cose per essere davvero considerato al pari di Postman, ad esempio:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>Flows<\/em><\/strong> \u2013 Editor visuale di flussi di chiamate API.<\/li>\n\n\n\n<li><strong><em>Postbot<\/em><\/strong> \u2013 AI applicata alla generazione di chiamate API, documentazione e test.<\/li>\n\n\n\n<li><strong><em>Mock Servers<\/em><\/strong> \u2013 Permettono la simulazione di API attraverso la restituzione di dati (fake) predefiniti.<\/li>\n<\/ul>\n\n\n\n<p>A parer mio, nonostante queste \u201clacune\u201d Bruno assolve egregiamente le sue funzioni, aiutando enormemente la quotidianit\u00e0 del nostro lavoro di sviluppo.<\/p>\n\n\n\n<p>La Community di Bruno \u00e8 in crescita continua, il che porta a sperare per un suo roseo futuro, denso di nuove idee, features e fix, a tutto vantaggio del prodotto stesso.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-conclusioni\">Conclusioni<\/h3>\n\n\n\n<p>Non sono mai stato un sostenitore del software \u201cperfetto\u201d, so bene che non esiste. Invece, sono fermamente convinto che possa esistere ci\u00f2 che meglio si adatta alle nostre esigenze.<\/p>\n\n\n\n<p>Senza la pretesa di avere la verit\u00e0 in tasca e, soprattutto, senza la necessit\u00e0 di dover vendere nulla a nessuno (cosa, questa, che da tecnico, non sono proprio in grado di fare), mi permetto di consigliare a tutti voi di dare un\u2019opportunit\u00e0 a Bruno. Sono certo che vi piacer\u00e0 e, chiss\u00e0, magari scoprirete che fa proprio al caso vostro.&nbsp;<\/p>\n\n\n\n<p>Sono sinceramente curioso di ricevere i Vostri feedback: lo avete provato? Vi ha risolto qualche problema oppure no? Cosa, secondo Voi, non funziona o \u00e8 migliorabile ?&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bruno \u00e8 un API Client open source che, ormai da qualche tempo, si sta rapidamente diffondendo, guadagnando terreno nei confronti del popolarissimo Postman. Si tratta di un progetto che vuole crescere con il supporto della propria Community, senza la partecipazione di aziende terze (se non come sponsor) e, soprattutto, con la forte volont\u00e0 di non&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/\">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":[10263],"tags":[12222,12224],"collections":[11708],"class_list":{"0":"post-28087","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-backend-it","8":"tag-bruno","9":"tag-postman","10":"collections-dalla-community","11":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bruno vs. Postman: la battaglia delle API - Codemotion Magazine<\/title>\n<meta name=\"description\" content=\"Fabio Grande analizza Bruno e Postman, due API client. Scopri come Bruno, open source e community-driven, si contrappone a Postman, evidenziando differenze in gestione locale, usabilit\u00e0, collaborazione e scripting. Chi vincer\u00e0?\" \/>\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\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Le API di Bruno \u2013 Bruno vs Postman\" \/>\n<meta property=\"og:description\" content=\"Fabio Grande analizza Bruno e Postman, due API client. Scopri come Bruno, open source e community-driven, si contrappone a Postman, evidenziando differenze in gestione locale, usabilit\u00e0, collaborazione e scripting. Chi vincer\u00e0?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/\" \/>\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-06T13:11:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-06T13:11:34+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\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/\"},\"author\":{\"name\":\"Fabio Grande\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/d47d145dba7746776b7d736aecffdd44\"},\"headline\":\"Le API di Bruno \u2013 Bruno vs Postman\",\"datePublished\":\"2024-06-06T13:11:32+00:00\",\"dateModified\":\"2024-06-06T13:11:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/\"},\"wordCount\":2436,\"publisher\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#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\":[\"bruno\",\"postman\"],\"articleSection\":[\"Backend\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/\",\"url\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/\",\"name\":\"Bruno vs. Postman: la battaglia delle API - Codemotion Magazine\",\"isPartOf\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#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-06T13:11:32+00:00\",\"dateModified\":\"2024-06-06T13:11:34+00:00\",\"description\":\"Fabio Grande analizza Bruno e Postman, due API client. Scopri come Bruno, open source e community-driven, si contrappone a Postman, evidenziando differenze in gestione locale, usabilit\u00e0, collaborazione e scripting. Chi vincer\u00e0?\",\"breadcrumb\":{\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#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\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#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\/it\/backend-it\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Le API di Bruno \u2013 Bruno vs Postman\"}]},{\"@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\/#\/schema\/person\/image\/\",\"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 battaglia delle API - Codemotion Magazine","description":"Fabio Grande analizza Bruno e Postman, due API client. Scopri come Bruno, open source e community-driven, si contrappone a Postman, evidenziando differenze in gestione locale, usabilit\u00e0, collaborazione e scripting. Chi vincer\u00e0?","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\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/","og_locale":"en_US","og_type":"article","og_title":"Le API di Bruno \u2013 Bruno vs Postman","og_description":"Fabio Grande analizza Bruno e Postman, due API client. Scopri come Bruno, open source e community-driven, si contrappone a Postman, evidenziando differenze in gestione locale, usabilit\u00e0, collaborazione e scripting. Chi vincer\u00e0?","og_url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2024-06-06T13:11:32+00:00","article_modified_time":"2024-06-06T13:11:34+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\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/"},"author":{"name":"Fabio Grande","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/d47d145dba7746776b7d736aecffdd44"},"headline":"Le API di Bruno \u2013 Bruno vs Postman","datePublished":"2024-06-06T13:11:32+00:00","dateModified":"2024-06-06T13:11:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/"},"wordCount":2436,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#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":["bruno","postman"],"articleSection":["Backend"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/","url":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/","name":"Bruno vs. Postman: la battaglia delle API - Codemotion Magazine","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#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-06T13:11:32+00:00","dateModified":"2024-06-06T13:11:34+00:00","description":"Fabio Grande analizza Bruno e Postman, due API client. Scopri come Bruno, open source e community-driven, si contrappone a Postman, evidenziando differenze in gestione locale, usabilit\u00e0, collaborazione e scripting. Chi vincer\u00e0?","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#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\/it\/backend-it\/le-api-di-bruno-bruno-vs-postman\/#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\/it\/backend-it\/"},{"@type":"ListItem","position":3,"name":"Le API di Bruno \u2013 Bruno vs Postman"}]},{"@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\/#\/schema\/person\/image\/","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 \u00e8 un API Client open source che, ormai da qualche tempo, si sta rapidamente diffondendo, guadagnando terreno nei confronti del popolarissimo Postman. Si tratta di un progetto che vuole crescere con il supporto della propria Community, senza la partecipazione di aziende terze (se non come sponsor) e, soprattutto, con la forte volont\u00e0 di non&#8230;&hellip;","lang":"it","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28087","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=28087"}],"version-history":[{"count":3,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28087\/revisions"}],"predecessor-version":[{"id":28091,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/28087\/revisions\/28091"}],"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=28087"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=28087"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=28087"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=28087"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}