{"id":11062,"date":"2014-10-24T15:59:12","date_gmt":"2014-10-24T13:59:12","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=11062"},"modified":"2016-11-04T16:16:34","modified_gmt":"2016-11-04T15:16:34","slug":"realizzare-il-back-end-per-la-propria-app-con-baasbox","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/realizzare-il-back-end-per-la-propria-app-con-baasbox\/","title":{"rendered":"Realizzare il back end per la propria app con BaasBox"},"content":{"rendered":"<p>Alzi la mano chi non ha mai avuto a che fare con un back end&#8230; ora alzino la mano quelli che mangiano pane e <a href=\"http:\/\/en.wikipedia.org\/wiki\/Application_programming_interface\" target=\"_blank\">API<\/a> a colazione&#8230; bene potete entrambi continuare a leggere perch\u00e9 questo articolo \u00e8 per entrambi.<br \/>\nChe stiate realizzando una calcolatrice per iOS, o stiate pianificando di fare concorrenza a <a href=\"http:\/\/www.sap.com\" target=\"_blank\">SAP<\/a> con un nuovo gestionale su iPad, prima o poi vi toccher\u00e0 interfacciarvi con un back end, che sia per ricevere un banner, per salvare lo stato di un&#8217;operazione o per leggere l&#8217;elenco delle news. Se il backend non \u00e8 gi\u00e0 stato realizzato da qualcun&#8217;altro, le alternative sono due: o lo facciamo noi con le nostre manine oppure paghiamo qualcun altro per farlo.<\/p>\n<p>Su devAPP ci sono due articoli (un po&#8217; vecchi ma sempre attuali) su come realizzare un semplice backend usando php:\u00a0<a href=\"http:\/\/www.devapp.it\/wordpress\/t105-json-e-ios-5-creiamo-il-backend-con-json-e-php-parte-1.html\" target=\"_blank\">parte 1<\/a> e <a href=\"http:\/\/www.devapp.it\/wordpress\/t106-json-e-ios-5-creiamo-il-client-iphone-per-il-nostro-web-service-php-parte-2.html\" target=\"_blank\">parte 2<\/a>. Non \u00e8 un&#8217;operazione difficile, come potete vedere da questi due articoli, ma se vi serve qualcosa di pi\u00f9 che una semplice lista di nomi e date di nascita, probabilmente vi toccher\u00e0 assumere un professionista.<\/p>\n<p>Esiste in realt\u00e0 una terza strada, che sta prendendo piede da qualche anno, cio\u00e8 quella di usare un <strong>BaaS<\/strong>, acronimo di <a href=\"http:\/\/it.wikipedia.org\/wiki\/Backend_as_a_service\" target=\"_blank\"><strong>Backend as a Service<\/strong><\/a>.<\/p>\n<p>In pratica anzich\u00e9 realizzarvi da voi il vostro backend, ne &#8220;affittate&#8221; uno con le caratteristiche che vi servono, pagando (o non-pagando come vedremo pi\u00f9 avanti) soltanto ci\u00f2 che realmente\u00a0vi serve.<\/p>\n<p>Vi starete chiedendo come fa un servizio cos\u00ec generico ad adattarsi alle vostre esigenze, che sia quella di salvare la classifica del vostro ultimo clone-2048 oppure di memorizzare online l&#8217;elenco delle ricette da visualizzare nella vostra app. Senza entrare nei dettagli tecnici, questi servizi, invece di utilizzare\u00a0un tradizionale database SQL (come ad esempio mySQL) utilizzano <strong>database <a href=\"http:\/\/en.wikipedia.org\/wiki\/NoSQL\" target=\"_blank\">NO-SQL<\/a><\/strong> nei quali \u00e8 possibile memorizzare informazioni senza necessit\u00e0 di dichiarare lo schema a priori.<\/p>\n<p>Il provider pi\u00f9 famoso per questo tipo di servizi \u00e8 sicuramente <a href=\"https:\/\/parse.com\" target=\"_blank\">parse.com<\/a>, acquistato un annetto fa direttamente da Facebook per la modica cifra di 85 milioni di dollari, che immagino stia investendo per aggiungere funzionalit\u00e0 alla propria piattaforma alla quale manca solo la possibilit\u00e0 di fare il caff\u00e8.<\/p>\n<p>Ma non ho scritto tutta questa premessa per parlarvi di parse, che si facciano pubblicit\u00e0 da soli \ud83d\ude42 vorrei invece parlare della sua alternativa free e OpenSource, che ha anche il vanto di essere Italiana: <a href=\"http:\/\/www.baasbox.com\" target=\"_blank\"><strong>BaasBox<\/strong><\/a>.<\/p>\n<p><strong> BaasBox<\/strong> su github si autodefinisce come:<\/p>\n<blockquote><p>an Open Source project that aims to provide a general purpose back end for mobile and web apps<\/p><\/blockquote>\n<p>e un progetto che ha il termine &#8220;Open Source&#8221; nella propria definizione non pu\u00f2 che ricevere la nostra attenzione.<\/p>\n<p>Il vantaggio di installare un BaaS su un proprio server \u00e8 innanzi tutto economico perch\u00e9 avrete accesso illimitato alla piattaforma con l&#8217;unica limitazione delle capacit\u00e0 del vostro server, ma non \u00e8 da trascurare anche la possibilit\u00e0 di installare il BaaS direttamente sulla vostra macchina di sviluppo, cos\u00ec da non dipendere dalla connessione ad internet e poter pianificare anche alcuni complessi scenari di integrazione automatizzati.<\/p>\n<h2>Installazione e configurazione<\/h2>\n<p>L&#8217;installazione di BaasBox non richiede particolari competenze o risorse, il software infatti \u00e8 basato su java, per cui \u00e8 sufficiente avere un computer con una virtual machine java installata. Io ho eseguito l&#8217;installazione su un server Debian, seguendo le istruzioni disponibili a questo indirizzo: <a href=\"http:\/\/www.baasbox.com\/installing-baasbox-on-linux\/\" target=\"_blank\">http:\/\/www.baasbox.com\/installing-baasbox-on-linux\/<\/a> ma se volete giusto provare potete tranquillmante eseguire BaasBox sul vostro mac, vi basta scaricare il file zip da questa pagina <a href=\"http:\/\/www.baasbox.com\/download-page\/\" target=\"_blank\">http:\/\/www.baasbox.com\/download-page\/<\/a><\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-01.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11063\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-01.png\" alt=\"creare-un-backend-per-app-ios-android-baasbox-01\" width=\"1600\" height=\"577\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-01.png 1600w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-01-300x108.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-01-1024x369.png 1024w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><\/p>\n<p>Una volta scaricato e scompattato il file zip, aprite un terminale posizionandovi nella\u00a0cartella dove avete scaricato il file e digitate:<\/p>\n<pre class=\"lang:sh decode:true\">.\/start<\/pre>\n<p>Dopo una prima operazione di configurazione lo scrip si arrester\u00e0 mostrando alcune incoraggianti informazioni:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-02.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11064\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-02.png\" alt=\"creare-un-backend-per-app-ios-android-baasbox-02\" width=\"1432\" height=\"224\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-02.png 1432w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-02-300x46.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-02-1024x160.png 1024w\" sizes=\"auto, (max-width: 1432px) 100vw, 1432px\" \/><\/a><\/p>\n<p>La parte interessante \u00e8 quel : &#8220;<em>Listening for HTTP on \/0\u2026\u2026\u2026:9000<\/em>&#8220;, che ci dice che il software \u00e8 pronto e in ascolto sulla porta 9000 (porta di default). Verifichiamo.<\/p>\n<p>Aprite il vostro browser e digitate:<\/p>\n<pre class=\"lang:sh decode:true\">locahost:9000<\/pre>\n<p>Tutto funziona e vi apparir\u00e0 la pagina di login:<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11065\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-03.png\" alt=\"creare-un-backend-per-app-ios-android-baasbox-03\" width=\"1600\" height=\"1414\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-03.png 1600w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-03-300x265.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-03-1024x904.png 1024w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><\/p>\n<p>Entrate con le credenziali di default:<\/p>\n<blockquote><p>username: admin<br \/>\npassword: admin<br \/>\napp code: 1234567890<\/p><\/blockquote>\n<p>Cos\u00ec da accedere alla console di amministrazione di BaasBox.<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-04.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11066\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-04.png\" alt=\"creare-un-backend-per-app-ios-android-baasbox-04\" width=\"1600\" height=\"1272\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-04.png 1600w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-04-300x238.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-04-1024x814.png 1024w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><\/p>\n<p>Dedicate un po&#8217; di tempo ad esaminare le opzioni presenti nel men\u00f9 di sinistra. Da segnalare tra i settings la possibilit\u00e0 di definire il template delle email da inviare all&#8217;utente, opzioni normalmente a pagamento con altri provider \ud83d\ude09<br \/>\nAnche la possibilit\u00e0 di caricare due differenti certificati per le nofiche push, produzione e sandbox \u00e8 una funzione che difficilmente altri provider vi danno gratis.<\/p>\n<p>Nella sezione &#8220;DB Management&#8221; avrete la possibilit\u00e0 di effettuare il backup e restore dei database, utile sia per sicurezza sia per verificare il comportamento dell&#8217;app con determinati tipi di dati. (Scenari tipo &#8220;cosa succede se ho un milione di commenti?&#8221;)<\/p>\n<p>La parte dove verranno memorizzati i nostri dati \u00e8 la parte di <strong>Collections<\/strong> e <strong>Documents<\/strong>. Nella terminologia No-SQL le Collections equivalgono pi\u00f9 o meno alle tabelle, mentre i Documents equivalgono pi\u00f9 o meno ai records. In pratica la vostra classe &#8220;Customer&#8221; sar\u00e0 una Collections, tutte le istanze di quella classe diventeranno Documents.<\/p>\n<p>Creiamo una nuova collection, cliccando sul tasto &#8220;New Collection&#8221; e creiamo la collection &#8220;Customer&#8221;.<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-05.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11067\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-05.png\" alt=\"creare-un-backend-per-app-ios-android-baasbox-05\" width=\"1600\" height=\"638\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-05.png 1600w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-05-300x119.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-05-1024x408.png 1024w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/a><\/p>\n<p>Volendo potremmo anche caricare un nuovo customer direttamente dall&#8217;interfaccia web, cliccando semplicemente sulla sezione &#8220;Documents&#8221; e &#8220;New Document&#8221;, ma in questo caso saremmo costretti a fornire le informazioni sul customer direttamente in JSON, il che non \u00e8 certo comodissimo.<\/p>\n<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-06.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11068\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-06.png\" alt=\"creare-un-backend-per-app-ios-android-baasbox-06\" width=\"1138\" height=\"1078\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-06.png 1138w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-06-300x284.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2014\/10\/creare-un-backend-per-app-ios-android-baasbox-06-1024x970.png 1024w\" sizes=\"auto, (max-width: 1138px) 100vw, 1138px\" \/><\/a><\/p>\n<h2>Api REST e SDK iOS<\/h2>\n<p>Oltre che utilizzando la console di amministrazione, potete usare BaasBox con le API REST oppure utilizzando una libreria specifica, disponibile per iOS, Android e Javascript.<br \/>\nLe API rest non saranno trattate in questo articolo, trovate tutte le informazioni a questo indirizzo: <a href=\"http:\/\/www.baasbox.com\/documentation\/?shell#api\" target=\"_blank\">http:\/\/www.baasbox.com\/documentation\/?shell#api<\/a><\/p>\n<h2>Applicazione iOS<\/h2>\n<p>Per realizzare un&#8217;applicazoine iOS la soluzione \u00e8 pi\u00f9 semplice \u00e8 quella di utilizzare <a href=\"http:\/\/cocoapods.org\" target=\"_blank\">CocoaPods<\/a>, basta infatti aggiungere questa dipendenza:<\/p>\n<pre class=\"lang:sh decode:true\">pod 'BaasBoxSDK', '0.8.3'<\/pre>\n<p>e procedere all&#8217;installazione con il classico <em>`pod install`<\/em> per generare un workspace gi\u00e0 configurato. Maggiori informazioni su CocoaPods <a href=\"http:\/\/www.devapp.it\/wordpress\/cococapods-gestire-le-dipendenze-e-gli-aggiornamenti-in-xcode-in-modo-automatico.html\" target=\"_blank\">qui<\/a><\/p>\n<p>La libreria va configurata nell&#8217;AppDelegate, per farlo aggiungiamo al metodo <em>application:didFinishLaunchingWithOptions<\/em> questa istruzione:<\/p>\n<pre class=\"lang:objc decode:true\">[BaasBox setBaseURL:@\"http:\/\/localhost:9000\"\u00a0appCode:@\"1234567890\"];<\/pre>\n<p>ricordatevi di importare l&#8217;header della libreria:<\/p>\n<pre class=\"lang:objc decode:true\">#import &lt;BaasBoxSDK\/BaasBox.h&gt;<\/pre>\n<h2>Model<\/h2>\n<p>Un aspetto positivo di BaasBox \u00e8 che non siete vincolati ad usare oggetti di un determinato tipo nella vostra applicazione, ma potete creare le vostre classi e aggiungere cos\u00ec tutte le property e la logica necessaria per la vostra app, mantenendo separata la logica di sincronizzazione.<\/p>\n<p>Invece di lavorare con:<\/p>\n<pre class=\"lang:objc decode:true\">customer[@\"name\"] (parse)<\/pre>\n<p>potremo lavorare con<\/p>\n<pre class=\"lang:objc decode:true\">customer.name<\/pre>\n<p>mi sembra un bel vantaggio, no?<\/p>\n<p>Per creare e ricevere oggetti di tipo <em>Customer<\/em> creiamo quindi la classe <em>Customer<\/em> subclass di <em>BAAObject<\/em>. Per ciascuna classe \u00e8 necessario definire soltanto due metodi, il primo \u00e8 <em>collectionName<\/em> con il quale possiamo fornire il nome &#8216;remoto&#8217; della classe, in questo caso l&#8217;implementazione sar\u00e0 questa:<\/p>\n<pre class=\"lang:objc decode:true\">- (NSString *)collectionName {\r\nreturn @\"document\/Customer\";\r\n}<\/pre>\n<p>e l&#8217;altro metodo \u00e8 <em>initWithDictionary:<\/em> il quale si occuper\u00e0 semplicemente della conversione dei nomi delle property, se non avete nulla di particolare l&#8217;implementazione sar\u00e0 simile a questa:<\/p>\n<pre class=\"lang:objc decode:true \">- (instancetype)initWithDictionary:(NSDictionary *)dictionary {\r\n   self = [super initWithDictionary:dictionary];\r\n   if (self) {\r\n      _name = dictionary[@\"name\"];\r\n      _surname = dictionary[@\"surname\"];\r\n   }\r\n   return self;\r\n}<\/pre>\n<p>Anche se a prima vista pu\u00f2 sembrare scomodo, implementare questo metodo offre una lunga serie di vantaggi: qualora i nomi delle property fossero diversi o se volessimo aggiungere della logica di validazione \/ conversione di formato.<\/p>\n<h2>Login<\/h2>\n<p>Per effettuare le operazioni di lettura\/scrittura dovrete essere loggati su BaasBox, operazione che risulta molto semplice utilizzando l&#8217;sdk:<\/p>\n<pre class=\"lang:objc decode:true\">BAAClient *client = [BAAClient sharedClient];\r\n[client authenticateUser:@\"admin\" password:@\"admin\" completion:^(BOOL success, NSError *error) {\r\n\/\/Inserite qui il vostro codice\r\n}];<\/pre>\n<p>Ovviamente questo \u00e8 solo un esempio che utilizza delle credenziali hardcoded, potete creare da voi il vostro viewController di login oppure utilizzare quello gi\u00e0 fornito da BaasBox come esempio <a href=\"https:\/\/github.com\/baasbox\/DearDiary-iOS-starter\" target=\"_blank\">qui<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h2>Ricevere e inviare gli oggetti al back end<\/h2>\n<p>Una volta loggati potrete utilizzare metodi di classe del vostro model per interrogare il back end e ricevere cos\u00ec gli oggetti richiesti. L&#8217;approccio utilizzato \u00e8 quello di <a href=\"http:\/\/en.wikipedia.org\/wiki\/Active_record_pattern\" target=\"_blank\">ActiveRecord<\/a> quindi troveremo dei metodi asincroni come:<\/p>\n<pre class=\"lang:objc decode:true\">[Customer getObjectsWithCompletion:^(NSArray *objects, NSError *error) { } ];<\/pre>\n<p>il quale restituisce un&#8217;array di oggetti ti tipo <em>Customer<\/em>, quindi gi\u00e0 convertiti nel tipo di riferimento.<\/p>\n<p>Salvare un nuovo customer sul back end non potrebbe essere pi\u00f9 semplice: create una normale istanza della classe Customer e invocate il metodo asincrono <em>saveObjectWithCompletion:<\/em> come in questo esempio:<\/p>\n<pre class=\"lang:objc decode:true\">Customer *newCustomer = [Customer new];\r\nnewCustomer.name = @\"Mario\";\r\nnewCustomer.surname = @\"Rossi\";\r\n[newCustomer saveObjectWithCompletion:^(id object, NSError *error) {\r\n\/\/Esaminate l'errore per verificare che tutto sia andato a buon fine.\r\n}];<\/pre>\n<h2>Conclusioni<\/h2>\n<p>Ci sono molti aspetti di BaasBox che non abbiamo trattato in questo articolo, come le push notification, lo storage dei dati, le permission and so on and so forth, quindi non giudicate l&#8217;intera piattaforma soltanto in base a quello che avete letto qui.<\/p>\n<p>Il mio personale giudizio su BaasBox \u00e8 che se paragonata ad altre piattaforme commerciali sembra essere un po&#8217; cruda ed essenziale, ma poich\u00e9 quello che fa \u00e8 sufficiente a coprire il 99% dei requisiti di un&#8217;applicazione classica e, soprattutto, stiamo parlando di un&#8217;applicazione totalmente Open Source, il mio giudizio non pu\u00f2 che essere positivo, inoltre proprio il suo essere &#8220;essenziale&#8221; si traduce in una maggiore possibilit\u00e0 di customizzazione e, proprio poich\u00e9 il progetto \u00e8 Open Source, potete anche modificare (e studiare) l&#8217;sdk in modo che sia lui a piegarsi alle vostre esigenze e non il contrario.<\/p>\n<p>Insomma, 10 e lode al progetto BaasBox!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alzi la mano chi non ha mai avuto a che fare con un back end&#8230; ora alzino&#8230;<\/p>\n","protected":false},"author":53,"featured_media":11069,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8,30,481],"tags":[1409,1411,1408,1410,1412],"class_list":["post-11062","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-varie","category-materiale-open-source","category-risorse-utili","tag-baas","tag-baasbox","tag-back-end-app-ios","tag-backend-as-a-service","tag-creare-backend-per-app-ios-e-android"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11062","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=11062"}],"version-history":[{"count":5,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11062\/revisions"}],"predecessor-version":[{"id":12520,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/11062\/revisions\/12520"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/11069"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=11062"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=11062"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=11062"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}