{"id":4766,"date":"2017-02-05T19:02:16","date_gmt":"2017-02-05T17:02:16","guid":{"rendered":"https:\/\/www.tomislavstankovic.com\/blog\/?p=4766"},"modified":"2019-01-05T19:58:01","modified_gmt":"2019-01-05T17:58:01","slug":"nodejs-api-push-notifikacija","status":"publish","type":"post","link":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/","title":{"rendered":"Node.js API za slanje Push notifikacija"},"content":{"rendered":"<p>U ovom \u0107emo blog postu napraviti <em>Node.js API<\/em> za slanje <em>Push<\/em> notifikacija. Ovaj <em>API<\/em> je samo jedan dio svega onoga \u0161to je potrebno zadovoljiti kako bi se <em>push <\/em>notifikacije mogle uspje\u0161no slati\/primati i biti \u0107e zapravo nadogradnja prethodnog <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/\" target=\"_blank\"><em>Node.js API<\/em>-ja za <em>upload<\/em> datoteka<\/a>. <\/p>\n<p>Proces slanja <em>push <\/em>notifikacija:<\/p>\n<ul>\n<li>Treba nam servis koji \u0107e stajati izme\u0111u <em>API<\/em>-ja i mobilne aplikacije. U ovom slu\u010daju to je <em><a href=\"https:\/\/firebase.google.com\/\" target=\"_blank\">Google Firebase<\/a><\/em>.<\/li>\n<li>Treba nam jedinstveni token mobilne aplikacije tj. ure\u0111aja kako bi <em>API <\/em>znao kome poslati <em>push <\/em>notifikaciju. <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/ionic2-push-notifikacije-android\/\" target=\"_blank\">Kreiranje jedinstvenog tokena odvija se u samoj mobilnoj aplikaciji<\/a> i to ne\u0107e biti pokriveno ovim blog postom.<\/li>\n<li>Treba nam <em>API<\/em> koji \u0107e na osnovu zahtjeva skupiti sve tokene i poslati im <em>push <\/em>notifikaciju. Za to \u0107emo koristiti <a href=\"https:\/\/www.npmjs.com\/package\/node-gcm\" target=\"_blank\"><em>node-gcm NPM<\/em> paket<\/a>.<\/li>\n<\/ul>\n<p>U nekom od sljede\u0107ih blog postova napravit \u0107emo primjer <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/uvod-u-ionic-2\/\" target=\"_blank\"><em>Ionic<\/em> aplikacije<\/a> koja \u0107e koristiti ovaj <em>API<\/em> tj. koja \u0107e zapravo primati <em>push<\/em> notifikacije. <\/p>\n<h2>Google Firebase<\/h2>\n<p><em>Google Firebase<\/em> \u0107emo koristiti kao servis koji \u0107e stajati izme\u0111u mobilne aplikacije i <em>Node.js API<\/em>-ja. Na adresi <a href=\"https:\/\/console.firebase.google.com\/\" target=\"_blank\">https:\/\/console.firebase.google.com\/<\/a> potrebno je napraviti novi projekt s nazivom mobilne aplikacije koja \u0107e <em>API<\/em> koristiti. <\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Ionic.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Ionic.jpg\" alt=\"Google Firebase Ionic\" width=\"453\" height=\"402\" class=\"aligncenter size-full wp-image-4770\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Ionic.jpg 453w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Ionic-300x266.jpg 300w\" sizes=\"auto, (max-width: 453px) 100vw, 453px\" \/><\/a><\/p>\n<p><em>Server key<\/em> \u0107e nam trebati u <strong>server.js<\/strong> kako bi na\u0161 <em>API<\/em> znao s kojim servisom \u0107e komunicirati.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Server-Key.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Server-Key.jpg\" alt=\"Google Firebase Server Key\" width=\"999\" height=\"563\" class=\"aligncenter size-full wp-image-4771\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Server-Key.jpg 999w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Server-Key-300x169.jpg 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Server-Key-768x433.jpg 768w\" sizes=\"auto, (max-width: 999px) 100vw, 999px\" \/><\/a><\/p>\n<p>Osim toga potrebno je jo\u0161 dodati podr\u0161ku za konkretne platforme na kojima \u0107e se temeljiti mobilna aplikacija jer svaka platforma ima svoje specifi\u010dnosti. S obzirom da je <em>Ionic framework<\/em> za izradu <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/uvod-u-ionic-2\/\" target=\"_blank\">hibridnih mobilnih aplikacija<\/a> mi \u0107emo odmah kreirati podr\u0161ku za <em>iOS<\/em> i <em>Android<\/em> platforme.<\/p>\n<p>Priprema za <em>Android<\/em> platformu<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Android.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Android.jpg\" alt=\"Google Firebase Android\" width=\"2096\" height=\"708\" class=\"aligncenter size-full wp-image-4778\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Android.jpg 2096w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Android-300x101.jpg 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Android-768x259.jpg 768w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-Android-1024x346.jpg 1024w\" sizes=\"auto, (max-width: 2096px) 100vw, 2096px\" \/><\/a><\/p>\n<p>Priprema za <em>iOS<\/em> platformu<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-iOS.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-iOS.jpg\" alt=\"Google Firebase iOS\" width=\"2798\" height=\"670\" class=\"aligncenter size-full wp-image-4779\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-iOS.jpg 2798w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-iOS-300x72.jpg 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-iOS-768x184.jpg 768w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Firebase-iOS-1024x245.jpg 1024w\" sizes=\"auto, (max-width: 2798px) 100vw, 2798px\" \/><\/a><\/p>\n<p>\u0160to se <em>Google Firebasea<\/em> ti\u010de to je za sada to. Njemu \u0107emo se vratiti kada budemo radili mobilnu aplikaciju jer \u0107e nam trebati jo\u0161 neki podaci.<\/p>\n<h2>Testni <em>push.js<\/em><\/h2>\n<p>Sada \u0107emo napraviti testni <strong>push.js<\/strong> s kojim \u0107emo isprobati radi li uop\u0107e na\u0161 <em>API <\/em>i ho\u0107e li <em>push <\/em>notifikacija sti\u0107i na mobilni ure\u0111aj.<\/p>\n<p>Prvo moramo instalirati <a href=\"https:\/\/www.npmjs.com\/package\/node-gcm\" target=\"_blank\">https:\/\/www.npmjs.com\/package\/node-gcm<\/a> pomo\u0107u naredbe  <span class=\"lang:sh decode:true  crayon-inline \" >$ npm install node-gcm &#8211;save<\/span>.<\/p>\n<p><span class=\"lang:js decode:true  crayon-inline \" >gcmApiKey<\/span>  je zapravo <em>server key<\/em> koji imamo unutar <em>Google Firebase<\/em> su\u010delja, ali ovdje nam treba i jedinstveni token ure\u0111aja, a njega dobijemo unutar mobilne aplikacije. Kako dobiti taj token ne\u0107u prikazati u ovom blog postu nego u nekom od sljede\u0107ih. Uglavnom, na slici se vidi token ure\u0111aja. <\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Developer-Tools.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Developer-Tools.jpg\" alt=\"Google Developer Tools - Inspect Devices\" width=\"809\" height=\"167\" class=\"aligncenter size-full wp-image-4787\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Developer-Tools.jpg 809w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Developer-Tools-300x62.jpg 300w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Google-Developer-Tools-768x159.jpg 768w\" sizes=\"auto, (max-width: 809px) 100vw, 809px\" \/><\/a><\/p>\n<p>Njega dobijemo na na\u010din da <em>buildamo <\/em>aplikaciju na mobilni ure\u0111aj i unutar  <span class=\"lang:sh decode:true  crayon-inline \" >chrome:\/\/inspect\/#devices<\/span>  otvorimo konzolu iz koje kopiramo token koji onda zalijepimo u <strong>push.js<\/strong><\/p>\n<p>Sada imamo sve potrebno unutar <strong>push.js<\/strong> kako bi testirali <em>API<\/em>.<\/p>\n<pre class=\"lang:js mark:4,14,19-20,25 decode:true \" >var express = require('express');\r\nvar gcm = require('node-gcm');\r\nvar app = express();\r\nvar gcmApiKey = 'xxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx-xx'; \/\/ Server key iz https:\/\/console.firebase.google.com\/\r\n\r\nvar server = app.listen(3001, function () {\r\n    console.log('Pokrenut testni push API server!');\r\n});\r\n\r\napp.get('\/', function (req, res) {\r\n    res.send(\"Defaultna ruta\");\r\n});\r\n\r\napp.get('\/push', function (req, res) {\r\n    var device_tokens = []; \/\/ array jedinstvenih tokena ure\u0111aja\r\n    var retry_times = 4; \/\/ broj puta koliko \u0107e se push notifikacija poku\u0161ati poslati ako ne uspije prvi put\r\n    var sender = new gcm.Sender(gcmApiKey); \/\/ po\u0161iljatelj\r\n    var message = new gcm.Message(); \/\/ nova poruka\r\n    message.addData('title', 'Naslov');\r\n    message.addData('message', \"Sadr\u017eaj push notifikacije\");\r\n    message.addData('sound', 'default');\r\n    message.collapseKey = 'Testing Push'; \/\/ grupa push notifikacija\r\n    message.delayWhileIdle = true; \/\/odgoditi slanje push notifikacije ako je ure\u0111aj offline\r\n    message.timeToLive = 3; \/\/broj sekundi koliko push notifikaciju dr\u017eati na serveru ako je ure\u0111aj offline\r\n    device_tokens[0] = \"cscMv3QlzAA:APA91bFU8OQRe1Dkja-Oq3krC1fQrMV0HU8AnjLjOhbTjqbwT4ljqt2rgMpK3gt1kpPqs-8ibELSxIY4QKN7EZvdznRoRP_oSXHW1saRxqW2AziuPJ9OK8jfwli1kIm01veCyEtkRFG9\"; \/\/jedinstveni token ure\u0111aja\r\n    sender.send(message, device_tokens[0], retry_times, function (result) {\r\n        console.log('Push poslan na: ' + device_tokens);\r\n        res.status(200).send('Push notifikacija poslana na ure\u0111aj: ' + device_tokens);\r\n    }, function (err) {\r\n        res.status(500).send('Neuspje\u0161no poslana push notifikacija');\r\n    });\r\n});<\/pre>\n<p>Ako sada pokrenemo  <span class=\"lang:sh decode:true  crayon-inline \" >$ node push.js<\/span>  i odemo na putanju  <span class=\"lang:sh decode:true  crayon-inline \" >http:\/\/localhost:3001\/push<\/span> <\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Ionic-Push-Send.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Ionic-Push-Send.gif\" alt=\"Ionic Push Send\" width=\"712\" height=\"970\" class=\"aligncenter size-full wp-image-4785\" \/><\/a><\/p>\n<p>mo\u017eemo vidjeti da je <em>push <\/em>notifikacija uspje\u0161no stigla na mobilni ure\u0111aj<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Android-Ionic-Push.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Android-Ionic-Push.png\" alt=\"Android Ionic Push\" width=\"320\" height=\"569\" class=\"aligncenter size-full wp-image-4791\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Android-Ionic-Push.png 320w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Android-Ionic-Push-169x300.png 169w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><\/p>\n<p>Gledaju\u0107i prema ovom primjeru ispada da nam svaki korisnik mobilne aplikacije treba poslati svoj jedinstveni token ure\u0111aja kako bi ga mi ru\u010dno upisali u <strong>push.js<\/strong> i kako bi mogli tom korisniku poslati <em>push <\/em>notifikaciju. Naravno da to nema smisla i da je ovo slu\u017eilo samo za test. U produkcijskoj verziji <em>API<\/em>-ja potrebno je automatizirati \u010ditav proces i napraviti automatsku registraciju jedinstvenog tokena, slanje tokena u bazu podataka pa \u0107e <em>API <\/em>slati <em>push <\/em>notifikacije prema svim ure\u0111ajima \u010dije tokene ima spremljene u bazu.<\/p>\n<h2>Nadogradnja MySQL baze<\/h2>\n<p>Napravit \u0107emo novu tablicu naziva  <span class=\"lang:mysql decode:true  crayon-inline \" >device <\/span> unutar <em>MySQL <\/em>baze u koju \u0107emo spremati sve tokene, a koji \u0107e u bazu biti poslani \u010dim se mobilna aplikacija pokrene.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/device-table-mysql.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/device-table-mysql.png\" alt=\"device table mysql\" width=\"549\" height=\"148\" class=\"aligncenter size-full wp-image-4796\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/device-table-mysql.png 549w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/device-table-mysql-300x81.png 300w\" sizes=\"auto, (max-width: 549px) 100vw, 549px\" \/><\/a><\/p>\n<h2><em>server.js<\/em> nadogradnja<\/h2>\n<p>Sada \u0107emo nadograditi prethodno napravljen <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/node-js-restful-api-upload-datoteka\/\" target=\"_blank\"><em>API<\/em> za <em>upload<\/em> datoteka<\/a> koji \u0107e odmah prilikom dodavanja novog korisnika poslati <em>push <\/em>notifikaciju o dodanom korisniku.<\/p>\n<p>Pomo\u0107u naredbe  <span class=\"lang:sh decode:true  crayon-inline \" >$ npm install node-gcm<\/span>  \u0107emo instalirati <a href=\"https:\/\/www.npmjs.com\/package\/node-gcm\" target=\"_blank\">https:\/\/www.npmjs.com\/package\/node-gcm<\/a> i na vrh datoteke dodati:<\/p>\n<pre class=\"lang:js decode:true \" >var gcm = require('node-gcm');\r\nvar gcmApiKey = 'xxxxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxx--xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxx-xx';<\/pre>\n<p>Sada kada imamo spremnu novu tablicu u bazi mo\u017eemo napraviti <em>API<\/em> koji \u0107e iz mobilne aplikacije primati jedinstvene tokene.<\/p>\n<pre class=\"lang:js decode:true \" >apiRoutes.post('\/device-token', function (req, res, next) {\r\n\r\n   console.log(req.body);\r\n   \r\n   var token = req.body.token;\r\n   console.log(token);\r\n\r\n   pool.getConnection(function(err, connection) {\r\n \r\n        if (err) {\r\n            console.error(\"Dogodila se gre\u0161ka: \" + err);\r\n        }\r\n            \r\n\t\t\tvar uredjaj = { \r\n            dev_token: token  \r\n            };   \r\n\r\n            connection.query('INSERT INTO device SET ?', uredjaj,\r\n            function(err, rows) {\r\n                if (err) {\r\n                    throw err;\r\n                } else {\r\n                    var result = {\r\n                        success: true,\r\n                        detail: rows\r\n                    }\r\n                }\r\n            });\r\n    }); \r\n})<\/pre>\n<p>Sada mo\u017eemo nadograditi i drugi dio <em>API<\/em>-ja koji slu\u017ei za dodavanje korisnika. <\/p>\n<pre class=\"lang:js mark:21-59 decode:true \" >\/\/Dodavanje korisnika\r\napiRoutes.post('\/dodajkorisnika', upload.any(),function (req, res, next) {\r\n\r\n  console.log(req.body);\r\n  console.log(req.files);\r\n\r\n   pool.getConnection(function(err, connection) {\r\n \r\n        if (err) {\r\n            console.error(\"Dogodila se gre\u0161ka: \" + err);\r\n        }\r\n\r\n            var korisnik = { \r\n            k_ime: req.body.ime,\r\n            k_prezime: req.body.prezime,\r\n            k_slika: req.files[0].destination + \"\/\" + req.files[0].filename,  \r\n\t    k_dokument: req.files[1].destination + \"\/\" + req.files[1].filename  \r\n            };      \r\n\t\t\t\r\n        \/\/SELECT svih tokena i slanje push notifikacije\r\n        pool.getConnection(function(err, connection) {\r\n \r\n        if (err) {\r\n            console.error(\"Dogodila se gre\u0161ka: \" + err);\r\n        }\r\n       var query = \"SELECT * FROM device ORDER BY iddevice ASC\";\r\n        query = mysql.format(query);\r\n        connection.query(query,function(err,rows){\r\n           connection.release();\r\n            if (err) {               \r\n               return next(err);\r\n            } else {\r\n                 var SviTokeni = [];\r\n                 rows.forEach(function(a) {\r\n                        var jedanToken = {\r\n                             dev_token: a.dev_token\r\n                            }\r\n                            SviTokeni.push(jedanToken.dev_token);\r\n                        });\r\n            \/\/Push\r\n            var device_tokens = SviTokeni; \/\/ array jedinstvenih tokena ure\u0111aja\r\n    var retry_times = 4; \/\/ broj puta koliko \u0107e se push notifikacija poku\u0161ati poslati ako ne uspije prvi put\r\n    var sender = new gcm.Sender(gcmApiKey); \/\/ po\u0161iljatelj\r\n    var message = new gcm.Message(); \/\/ nova poruka\r\n    message.addData('title', 'Dodan novi korisnik:');\r\n    message.addData('message', korisnik.k_ime + ' ' + korisnik.k_prezime);\r\n    message.addData('sound', 'default');\r\n    message.collapseKey = 'Testing Push'; \/\/ grupa push notifikacija\r\n    message.delayWhileIdle = true; \/\/odgoditi slanje push notifikacije ako je ure\u0111aj offline\r\n    message.timeToLive = 3; \/\/broj sekundi koliko push notifikaciju dr\u017eati na serveru ako je ure\u0111aj offline\r\n    sender.send(message, device_tokens, retry_times, function (result) {\r\n        console.log('Push poslan na: ' + device_tokens);\r\n       res.status(200).send('Push notifikacija poslana na ure\u0111aj: ' + device_tokens);\r\n    }, function (err) {\r\n       res.status(500).send('Neuspje\u0161no poslana push notifikacija');\r\n    });\r\n            }\r\n        });  \r\n    })\r\n\t\t\t\r\n            connection.query('INSERT INTO korisnik SET ?', korisnik,\r\n            function(err, rows) {\r\n                if (err) {\r\n                    throw err;\r\n                } else {\r\n\t\t    res.json(\"Uspje\u0161no dodan korisnik!\");\r\n                    res.end();\r\n                }\r\n                connection.release();\r\n            });\r\n    });\r\n})<\/pre>\n<p>U ovom slu\u010daju tijelo poruke  <span class=\"lang:sh decode:true  crayon-inline \" >message <\/span> sastojat \u0107e se od  <span class=\"lang:sh decode:true  crayon-inline \" >korisnik.k_ime<\/span>  i  <span class=\"lang:sh decode:true  crayon-inline \" >korisnik.k_prezime<\/span>.<\/p>\n<p>Iz sljede\u0107e se animacije vidi da smo dodali novog korisnika Tomislav Stankovi\u0107. <\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Korisnik-API-Push.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Korisnik-API-Push.gif\" alt=\"Korisnik API Push\" width=\"974\" height=\"1126\" class=\"aligncenter size-full wp-image-4807\" \/><\/a><\/p>\n<p>Istovremeno s dodavanjem korisnika korisnicima mobilne aplikacije stigla je sljede\u0107a <em>push<\/em> notifikacija.<\/p>\n<p><a href=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Android-Ionic-korisnik-Push.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Android-Ionic-korisnik-Push.png\" alt=\"Android Ionic korisnik Push\" width=\"320\" height=\"569\" class=\"aligncenter size-full wp-image-4808\" srcset=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Android-Ionic-korisnik-Push.png 320w, https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/Android-Ionic-korisnik-Push-169x300.png 169w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/a><\/p>\n<h2>Zaklju\u010dak<\/h2>\n<p>I to je to! Napravili smo funkcionalan <em>API<\/em> za slanje <em>push <\/em>notifikacija. Jo\u0161 ostaje za napraviti <em>iOS<\/em> i<em> Android<\/em> mobilnu aplikaciju koja \u0107e automatski slati token ure\u0111aja u <em>MySQL<\/em> bazu i koja \u0107e primati <em>push <\/em>notifikacije, ali o tome \u0107e vi\u0161e rije\u010di biti u nekom od <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/ionic2-push-notifikacije-android\/\" target=\"_blank\">sljede\u0107ih blog postova<\/a> jer bi ovaj bio previ\u0161e dug ako bi se htjelo sve detaljno obraditi. <\/p>\n<p>Posjetite <a href=\"https:\/\/github.com\/tomislavstankovic\/SImple-NodeJS-ExpressJS-Starter-API\/tree\/push-notification\" target=\"_blank\"><strong>GitHub<\/strong><\/a> i preuzmite projekt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>U ovom \u0107emo blog postu napraviti Node.js API za slanje Push notifikacija. Ovaj API je samo jedan dio svega onoga \u0161to je potrebno zadovoljiti kako bi se push notifikacije mogle uspje\u0161no slati\/primati i biti \u0107e zapravo nadogradnja prethodnog Node.js API-ja za upload datoteka. Proces slanja push notifikacija: Treba nam servis koji \u0107e stajati izme\u0111u API-ja &hellip; <a href=\"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/\" class=\"more-link\">Nastavi \u010ditati <span class=\"screen-reader-text\">Node.js API za slanje Push notifikacija<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":4767,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[565,351],"tags":[386,385,352,378,387],"class_list":["post-4766","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-backend","category-razvoj","tag-google-cloud-messaging","tag-google-firebase","tag-ionic","tag-node-js","tag-push-notifikacije"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Node.js API za slanje Push notifikacija - Tomislav Stankovi\u0107<\/title>\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.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/\" \/>\n<meta property=\"og:locale\" content=\"hr_HR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js API za slanje Push notifikacija - Tomislav Stankovi\u0107\" \/>\n<meta property=\"og:description\" content=\"U ovom \u0107emo blog postu napraviti Node.js API za slanje Push notifikacija. Ovaj API je samo jedan dio svega onoga \u0161to je potrebno zadovoljiti kako bi se push notifikacije mogle uspje\u0161no slati\/primati i biti \u0107e zapravo nadogradnja prethodnog Node.js API-ja za upload datoteka. Proces slanja push notifikacija: Treba nam servis koji \u0107e stajati izme\u0111u API-ja &hellip; Nastavi \u010ditati Node.js API za slanje Push notifikacija\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/\" \/>\n<meta property=\"og:site_name\" content=\"Tomislav Stankovi\u0107\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-05T17:02:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-01-05T17:58:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/nodejs-api-slanje-push-notifikacija.png\" \/>\n\t<meta property=\"og:image:width\" content=\"825\" \/>\n\t<meta property=\"og:image:height\" content=\"510\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tomislav Stankovi\u0107\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisao\/la\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomislav Stankovi\u0107\" \/>\n\t<meta name=\"twitter:label2\" content=\"Procijenjeno vrijeme \u010ditanja\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minuta\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/\"},\"author\":{\"name\":\"Tomislav Stankovi\u0107\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"headline\":\"Node.js API za slanje Push notifikacija\",\"datePublished\":\"2017-02-05T17:02:16+00:00\",\"dateModified\":\"2019-01-05T17:58:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/\"},\"wordCount\":779,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/nodejs-api-slanje-push-notifikacija.png\",\"keywords\":[\"Google Cloud Messaging\",\"Google Firebase\",\"Ionic\",\"Node.js\",\"push notifikacije\"],\"articleSection\":[\"Backend\",\"Razvoj\"],\"inLanguage\":\"hr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/\",\"name\":\"Node.js API za slanje Push notifikacija - Tomislav Stankovi\u0107\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/nodejs-api-slanje-push-notifikacija.png\",\"datePublished\":\"2017-02-05T17:02:16+00:00\",\"dateModified\":\"2019-01-05T17:58:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/#breadcrumb\"},\"inLanguage\":\"hr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"hr\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/nodejs-api-slanje-push-notifikacija.png\",\"contentUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/nodejs-api-slanje-push-notifikacija.png\",\"width\":825,\"height\":510,\"caption\":\"Node.js API za slanje Push notifikacija\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/nodejs-api-push-notifikacija\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Po\u010detna stranica\",\"item\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js API za slanje Push notifikacija\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\",\"name\":\"Tomislav Stankovi\u0107\",\"description\":\"Sam svoj bloger\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"hr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/#\\\/schema\\\/person\\\/0329c549c57700034ea77f5d3d78396d\",\"name\":\"Tomislav Stankovi\u0107\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"hr\",\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"contentUrl\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\",\"width\":248,\"height\":165,\"caption\":\"Tomislav Stankovi\u0107\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/10\\\/cropped-TomislavStankovic.jpg\"},\"description\":\"Bloger \u0161irokog raspona interesa od kojih dio voli objaviti na ovom blogu. U neslobodno vrijeme Angular developer mobilnih i web aplikacija.\",\"sameAs\":[\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tomislavstankovic\\\/\"],\"url\":\"https:\\\/\\\/www.tomislavstankovic.com\\\/blog\\\/author\\\/tomislavstankovic\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Node.js API za slanje Push notifikacija - Tomislav Stankovi\u0107","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.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/","og_locale":"hr_HR","og_type":"article","og_title":"Node.js API za slanje Push notifikacija - Tomislav Stankovi\u0107","og_description":"U ovom \u0107emo blog postu napraviti Node.js API za slanje Push notifikacija. Ovaj API je samo jedan dio svega onoga \u0161to je potrebno zadovoljiti kako bi se push notifikacije mogle uspje\u0161no slati\/primati i biti \u0107e zapravo nadogradnja prethodnog Node.js API-ja za upload datoteka. Proces slanja push notifikacija: Treba nam servis koji \u0107e stajati izme\u0111u API-ja &hellip; Nastavi \u010ditati Node.js API za slanje Push notifikacija","og_url":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/","og_site_name":"Tomislav Stankovi\u0107","article_published_time":"2017-02-05T17:02:16+00:00","article_modified_time":"2019-01-05T17:58:01+00:00","og_image":[{"width":825,"height":510,"url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/nodejs-api-slanje-push-notifikacija.png","type":"image\/png"}],"author":"Tomislav Stankovi\u0107","twitter_card":"summary_large_image","twitter_misc":{"Napisao\/la":"Tomislav Stankovi\u0107","Procijenjeno vrijeme \u010ditanja":"7 minuta"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/#article","isPartOf":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/"},"author":{"name":"Tomislav Stankovi\u0107","@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"headline":"Node.js API za slanje Push notifikacija","datePublished":"2017-02-05T17:02:16+00:00","dateModified":"2019-01-05T17:58:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/"},"wordCount":779,"commentCount":0,"publisher":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"image":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/#primaryimage"},"thumbnailUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/nodejs-api-slanje-push-notifikacija.png","keywords":["Google Cloud Messaging","Google Firebase","Ionic","Node.js","push notifikacije"],"articleSection":["Backend","Razvoj"],"inLanguage":"hr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/","url":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/","name":"Node.js API za slanje Push notifikacija - Tomislav Stankovi\u0107","isPartOf":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/#primaryimage"},"image":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/#primaryimage"},"thumbnailUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/nodejs-api-slanje-push-notifikacija.png","datePublished":"2017-02-05T17:02:16+00:00","dateModified":"2019-01-05T17:58:01+00:00","breadcrumb":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/#breadcrumb"},"inLanguage":"hr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/"]}]},{"@type":"ImageObject","inLanguage":"hr","@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/#primaryimage","url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/nodejs-api-slanje-push-notifikacija.png","contentUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2017\/02\/nodejs-api-slanje-push-notifikacija.png","width":825,"height":510,"caption":"Node.js API za slanje Push notifikacija"},{"@type":"BreadcrumbList","@id":"https:\/\/www.tomislavstankovic.com\/blog\/nodejs-api-push-notifikacija\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Po\u010detna stranica","item":"https:\/\/www.tomislavstankovic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js API za slanje Push notifikacija"}]},{"@type":"WebSite","@id":"https:\/\/www.tomislavstankovic.com\/blog\/#website","url":"https:\/\/www.tomislavstankovic.com\/blog\/","name":"Tomislav Stankovi\u0107","description":"Sam svoj bloger","publisher":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.tomislavstankovic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"hr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.tomislavstankovic.com\/blog\/#\/schema\/person\/0329c549c57700034ea77f5d3d78396d","name":"Tomislav Stankovi\u0107","image":{"@type":"ImageObject","inLanguage":"hr","@id":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","url":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","contentUrl":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg","width":248,"height":165,"caption":"Tomislav Stankovi\u0107"},"logo":{"@id":"https:\/\/www.tomislavstankovic.com\/blog\/wp-content\/uploads\/2019\/10\/cropped-TomislavStankovic.jpg"},"description":"Bloger \u0161irokog raspona interesa od kojih dio voli objaviti na ovom blogu. U neslobodno vrijeme Angular developer mobilnih i web aplikacija.","sameAs":["https:\/\/www.tomislavstankovic.com\/blog\/","https:\/\/www.linkedin.com\/in\/tomislavstankovic\/"],"url":"https:\/\/www.tomislavstankovic.com\/blog\/author\/tomislavstankovic\/"}]}},"_links":{"self":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/4766","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/comments?post=4766"}],"version-history":[{"count":47,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/4766\/revisions"}],"predecessor-version":[{"id":6439,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/posts\/4766\/revisions\/6439"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/media\/4767"}],"wp:attachment":[{"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/media?parent=4766"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/categories?post=4766"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tomislavstankovic.com\/blog\/wp-json\/wp\/v2\/tags?post=4766"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}