{"id":25038,"date":"2021-10-26T15:57:37","date_gmt":"2021-10-26T13:57:37","guid":{"rendered":"https:\/\/www.smsapi.pl\/blog\/?p=25038"},"modified":"2024-01-29T14:35:28","modified_gmt":"2024-01-29T13:35:28","slug":"biblioteka-java-sms-api","status":"publish","type":"post","link":"https:\/\/www.smsapi.pl\/blog\/podstawy\/biblioteka-java-sms-api\/","title":{"rendered":"Biblioteka Java: SMS API"},"content":{"rendered":"\n<p><strong>Jak wykorzysta\u0107 SMS API to wysy\u0142ki wiadomo\u015bci w Java? Oto instrukcja z przyk\u0142adami kodu.<\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Java od wielu lat utrzymuje si\u0119 w \u015bcis\u0142ej czo\u0142\u00f3wce najpowszechniejszych j\u0119zyk\u00f3w programowania na \u015bwiecie. SMSAPI wychodzi temu trendowi naprzeciw dzi\u0119ki udost\u0119pnieniu gotowej biblioteki Java do obs\u0142ugi komunikacji SMS. Je\u015bli wi\u0119c Twoje programy s\u0105 napisane w\u0142a\u015bnie w tym j\u0119zyku, to czytaj dalej!<\/p>\n\n\n\n<p>Jak wszystkie biblioteki <a aria-label=\"SMS API (opens in a new tab)\" href=\"https:\/\/www.smsapi.pl\/sms-api\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">SMS API<\/a>, ta r\u00f3wnie\u017c jest w ca\u0142o\u015bci udost\u0119pniona na <a href=\"https:\/\/github.com\/smsapi\/smsapi-java-client\" target=\"_blank\" rel=\"noreferrer noopener\">GitHubie<\/a>. Tam te\u017c mo\u017cesz obejrze\u0107 kod \u017ar\u00f3d\u0142owy. To oczywi\u015bcie najpewniejsze \u017ar\u00f3d\u0142o informacji o jej dzia\u0142aniu i mo\u017cliwo\u015bciach. Natomiast w tym poradniku przybli\u017cam bibliotek\u0119 Java znacznie przyst\u0119pniej, tak aby stworzenie w\u0142asnej aplikacji by\u0142o prostsze ni\u017c wstawienie kawy w firmowym automacie. Zaczynajmy!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Instalacja biblioteki do obs\u0142ugi SMS w Javie<\/h2>\n\n\n\n<p>Na pocz\u0105tek, do\u0142\u0105cz pliki biblioteki Java do Twojego projektu. Mo\u017cesz to zautomatyzowa\u0107 korzystaj\u0105c z narz\u0119dzia Maven. W pliku konfiguracyjnym POM wystarczy doda\u0107 po jednym elemencie do list repozytori\u00f3w i zale\u017cno\u015bci.<\/p>\n\n\n\n<pre class=\"wp-block-code language-xml\"><code>&lt;repositories&gt;\n\t&lt;repository&gt;\n\t\t&lt;releases&gt;\n\t\t\t&lt;enabled&gt;true&lt;\/enabled&gt;\n\t\t\t&lt;updatePolicy&gt;always&lt;\/updatePolicy&gt;\n\t\t\t&lt;checksumPolicy&gt;fail&lt;\/checksumPolicy&gt;\n\t\t&lt;\/releases&gt;\n\t\t&lt;id&gt;smsapi&lt;\/id&gt;\n\t\t&lt;name&gt;smsapi&lt;\/name&gt;\n\t\t&lt;url&gt;https:\/\/labs.smsapi.com\/maven\/&lt;\/url&gt;\n\t\t&lt;layout&gt;default&lt;\/layout&gt;\n\t&lt;\/repository&gt;\n&lt;\/repositories&gt;\n\n&lt;dependencies&gt;\n\t&lt;dependency&gt;\n\t\t&lt;groupId&gt;pl.smsapi&lt;\/groupId&gt;\n\t\t&lt;artifactId&gt;smsapi-lib&lt;\/artifactId&gt;\n\t\t&lt;version&gt;2.5&lt;\/version&gt;\n\t&lt;\/dependency&gt;\n&lt;\/dependencies&gt;<\/code><\/pre>\n\n\n\n<p>Na <a href=\"https:\/\/labs.smsapi.com\/maven\/pl\/smsapi\/smsapi-lib\/\" target=\"_blank\" rel=\"noreferrer noopener\">serwerze SMSAPI<\/a> znajdziesz wersje biblioteki od 1.1 a\u017c do 2.5. Zawieraj\u0105 one archiwa JAR z kodem \u017ar\u00f3d\u0142owym, skompilowanym kodem bajtowym, szczeg\u00f3\u0142ow\u0105 dokumentacj\u0105 wygenerowan\u0105 przez Javadoc oraz pliki POM.<\/p>\n\n\n\n<p>Je\u015bli do zarz\u0105dzania rozwojem aplikacji wybra\u0142e\u015b narz\u0119dzie Gradle, to skorzystanie z biblioteki SMSAPI w Javie jest r\u00f3wnie \u0142atwe. Do pliku build.gradle dodaj odwo\u0142ania do wtyczek do Javy oraz jej bibliotek:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>plugins {\n\tid 'java'\n\tid 'java-library'\n}<\/code><\/pre>\n\n\n\n<p>Do repozytori\u00f3w do\u0142\u0105cz bibliotek\u0119 SMSAPI:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>repositories {\n\tmavenCentral()\n\tmaven {\n\t\turl 'https:\/\/labs.smsapi.com\/maven\/'\n\t}\n}<\/code><\/pre>\n\n\n\n<p>Ostatnia rzecz to dodanie biblioteki w odpowiedniej wersji do zale\u017cno\u015bci Twojego projektu:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>dependencies {\n\tapi 'pl.smsapi:smsapi-lib:2.5'\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Pocz\u0105tek aplikacji obs\u0142uguj\u0105cej wysy\u0142ki SMS w Javie: konfiguracja<\/h2>\n\n\n\n<p>Przed rozpocz\u0119ciem w\u0142a\u015bciwego programowania potrzeba zrobi\u0107 jeszcze jedn\u0105 podstawow\u0105 rzecz: za\u0142\u00f3\u017c konto SMSAPI! <\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"9Ccm5wB3LH\"><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/zrob-to-sam-jak-utworzyc-konto-testowe\/\">Zr\u00f3b to sam #01 \u2013 Jak utworzy\u0107 konto testowe? (poradnik wideo)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Zr\u00f3b to sam #01 \u2013 Jak utworzy\u0107 konto testowe? (poradnik wideo)&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/zrob-to-sam-jak-utworzyc-konto-testowe\/embed\/#?secret=rajrE4D8Aa#?secret=9Ccm5wB3LH\" data-secret=\"9Ccm5wB3LH\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Umo\u017cliwi to nam rozpocz\u0119cie wsp\u00f3\u0142pracy. <a href=\"https:\/\/ssl.smsapi.pl\/\" target=\"_blank\" rel=\"noopener\">Panel Klienta<\/a> to graficzny interfejs, za pomoc\u0105 kt\u00f3rego mo\u017cesz r\u0119cznie obs\u0142ugiwa\u0107 ca\u0142\u0105 Twoj\u0105 <a href=\"https:\/\/www.smsapi.pl\/kampanie-sms\">kampani\u0119 SMS<\/a>. Znajdziesz tam opcje: ustawie\u0144 konta, wysy\u0142ki SMS i MMS, zarz\u0105dzania baz\u0105 odbiorc\u00f3w oraz polami nadawcy i inne. O szczeg\u00f3\u0142ach przeczytaj w artyku\u0142ach z serii <a href=\"https:\/\/www.smsapi.pl\/blog\/zrob-to-sam\/\">SMSAPI Zr\u00f3b to sam<\/a>.<\/p>\n\n\n\n<p class=\"language-java\">Komunikacja z serwerem SMSAPI odbywa si\u0119 poprzez metody HTTP: POST, GET, PUT oraz DELETE. W kodzie biblioteki obs\u0142uguje je pakiet <code>Proxy<\/code> dzi\u0119ki interfejsowi <code>Client<\/code>. To niejako zaplecze biblioteki, nie musisz go dok\u0142adnie poznawa\u0107. <\/p>\n\n\n\n<p class=\"language-java\">Do nawi\u0105zania bezpiecznego po\u0142\u0105czenia potrzeba 40-znakowego <a href=\"https:\/\/ssl.smsapi.pl\/react\/oauth\/manage\" class=\"ek-link\" target=\"_blank\" rel=\"noopener\">tokenu OAuth2<\/a>. Tworzenie klienta wygl\u0105da w przybli\u017ceniu tak:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>import pl.smsapi.OAuthClient;\nimport pl.smsapi.proxy.Proxy;\nimport pl.smsapi.proxy.ProxyNative;\n\nclass Main{\n\tpublic static void main(String&#91;] args){\n\t\tString token = \"%SMSAPI_ACCESS_TOKEN%\";\n\t\tvar client = new OAuthClient(token);\n\t\tvar proxy = new ProxyNative(\"https:\/\/api.smsapi.pl\/\");\n\t}\n}\n<\/code><\/pre>\n\n\n\n<p>Jak wida\u0107, do po\u0142\u0105czenia z serwerem potrzebny jest jeszcze obiekt proxy. \u0141\u0105czy si\u0119 on z jedn\u0105 z dw\u00f3ch domen, w zale\u017cno\u015bci od tego, z kt\u00f3rej us\u0142ugi korzystasz: https:\/\/api.smsapi.pl\/ lub https:\/\/api.smsapi.com\/. Mo\u017cesz jednak pomin\u0105\u0107 jawne utworzenie proxy. Wtedy zostanie on utworzony domy\u015blnie, \u0142\u0105cz\u0105c si\u0119 z us\u0142ug\u0105 api.smsapi.pl.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Podstawowa wysy\u0142ka SMS w Javie<\/h2>\n\n\n\n<p class=\"language-java\">Czas przej\u015b\u0107 do konkret\u00f3w! Dzia\u0142anie omawianej biblioteki opiera si\u0119 na fabrykach oraz akcjach. Pierwsze odpowiadaj\u0105 poszczeg\u00f3lnym funkcj\u0105, drugie pozwalaj\u0105 ustawia\u0107 ich parametry. <\/p>\n\n\n\n<p class=\"language-java\">Ka\u017cd\u0105 czynno\u015b\u0107 nale\u017cy rozpocz\u0105\u0107 od utworzenia fabryki, a zako\u0144czy\u0107 wywo\u0142aniem funkcji <code>execute()<\/code> z klasy bazowej. Oczywi\u015bcie raz utworzon\u0105 fabryk\u0119 mo\u017cesz p\u00f3\u017aniej wykorzystywa\u0107 do woli. Poszerzaj\u0105c poprzedni listing o proste wys\u0142anie SMS-a (proxy jest tworzony domy\u015blnie):<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>import pl.smsapi.OAuthClient;\nimport pl.smsapi.api.SmsFactory;\nimport pl.smsapi.api.action.sms.SMSSend;\n\nclass Main{\npublic static void main(String&#91;] args){\n\tvar client = new OAuthClient(\"%SMSAPI_ACCESS_TOKEN%\");\n\n\tvar smsFactory = new SmsFactory(client);\n\tvar actionSmsSend = smsFactory.actionSend(\"+48111222333\", \"Hello world!\");\n\tactionSmsSend.execute();\n}\n}<\/code><\/pre>\n\n\n\n<p>Przydatna mo\u017ce okaza\u0107 si\u0119 mo\u017cliwo\u015b\u0107 \u0142a\u0144cuchowego \u0142\u0105czenia metod z klas akcji. Poni\u017cszy fragment zadzia\u0142a identycznie:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>var smsFactory = new SmsFactory(client);\nsmsFactory.actionSend()\n\t.setTo(\"+48111222333\")\n\t.setText(\"Hello world!\")\n\t.execute();<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Biblioteka Java: masowa wysy\u0142ka SMS<\/h2>\n\n\n\n<p class=\"language-java\">Prowadzenie <a href=\"https:\/\/www.smsapi.pl\/masowa-wysylka-sms\">masowych wysy\u0142ek SMS<\/a> nie oby\u0142oby si\u0119 bez mo\u017cliwo\u015bci wysy\u0142ania wiadomo\u015bci do wielu odbiorc\u00f3w naraz. Fabryka <code>SmsFactory<\/code> umo\u017cliwia to bardzo prosto, dzi\u0119ki przeci\u0105\u017ceniu metod <code>actionSend<\/code> i <code>setTo<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>SendStatusResponse response = smsFactory.actionSend(\n\t\tnew String&#91;]{\"+48111222333\", \"+48444555666\"},\n\t\t\"Hello receivers!\")\n\t\t.execute();\n\nSendStatusResponse response = smsFactory.actionSend()\n\t\t.setTo(new String&#91;]{\"+48111222333\", \"+48444555666\"})\n\t\t.setText(\"Hello again receivers!\")\n\t\t.execute();<\/code><\/pre>\n\n\n\n<p>To jednak nie wszystko. W Panelu klienta zauwa\u017cysz, \u017ce odbiorc\u00f3w da si\u0119 \u0142\u0105czy\u0107 w grupy. Wys\u0142anie identycznych <a href=\"https:\/\/www.smsapi.pl\/powiadomienia-sms\">powiadomie\u0144 SMS<\/a> do wszystkich cz\u0142onk\u00f3w danej grupy jest bardzo proste:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>SendStatusResponse response = smsFactory.actionSend()\n\t\t.setGroup(\"Group_name\")\n\t\t.setText(\"Hello group!\")\n\t\t.execute();<\/code><\/pre>\n\n\n\n<p class=\"language-java\">W powy\u017cszych listingach zachowano obiekt, zwracany przez metod\u0119 execute(). W tym przypadku jest to klasa <code>SendStatusResponse<\/code>. Posiada ona metody:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>getParts()<\/code> \u2013 zwraca liczb\u0119 cz\u0119\u015bci, na kt\u00f3r\u0105 podzielony zosta\u0142 SMS.<\/li>\n\n\n\n<li><code>getCount()<\/code> \u2013 zwraca liczb\u0119 zleconych wysy\u0142ek wiadomo\u015bci.<\/li>\n\n\n\n<li><code>getList()<\/code> \u2013 zwraca list\u0119 (<code>ArrayList<\/code>) obiekt\u00f3w klasy <code>MessageResponse<\/code>. Z kolei jej metody zwracaj\u0105 informacje o poszczeg\u00f3lnych wys\u0142anych SMS-ach. S\u0105 to:\n<ul class=\"wp-block-list\">\n<li><code>getId()<\/code> \u2013 unikalny identyfikator w systemie.<\/li>\n\n\n\n<li><code>getPoints()<\/code> \u2013 koszt wiadomo\u015bci, wyra\u017cony w punktach pobranych z Twojego konta.<\/li>\n\n\n\n<li><code>getNumber()<\/code> \u2013 numer odbiorcy.<\/li>\n\n\n\n<li><code>getStatus()<\/code> \u2013 jeden ze <a href=\"https:\/\/www.smsapi.pl\/docs\/#18-lista-statusow-doreczenia\" class=\"ek-link\">status\u00f3w dor\u0119czenia<\/a>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Wa\u017cny aspekt: planowanie wysy\u0142ki SMS<\/h2>\n\n\n\n<p>Jest jeszcze kilka praktycznych funkcji omawianej biblioteki, o kt\u00f3rych warto wspomnie\u0107. Pierwsz\u0105 jest <strong>planowanie wysy\u0142ki SMS<\/strong> na przysz\u0142o\u015b\u0107. Odpowiednia data i godzina dostarczenia powiadomienia do Twoich klient\u00f3w ma kluczowy wp\u0142yw na ich reakcj\u0119. Jaki? Sprawd\u017a poni\u017cszy artyku\u0142.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"WSGR2zrdBB\"><a href=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/czas-sie-liczy-jak-wybrac-odpowiedni-moment-na-wysylke-sms\/\">Czas si\u0119 liczy! Jak wybra\u0107 odpowiedni moment na wysy\u0142k\u0119 SMS?<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Czas si\u0119 liczy! Jak wybra\u0107 odpowiedni moment na wysy\u0142k\u0119 SMS?&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/czas-sie-liczy-jak-wybrac-odpowiedni-moment-na-wysylke-sms\/embed\/#?secret=vRAgh2g82x#?secret=WSGR2zrdBB\" data-secret=\"WSGR2zrdBB\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"language-java\">W swoim kodzie mo\u017cesz \u0142atwo ustawi\u0107 zadany czas za pomoc\u0105 metod setDateSent z akcji <code>SMSSend<\/code>. Przyjmuj\u0105 one albo obiekt <code>Calendar<\/code>, albo liczb\u0119 sekund od pocz\u0105tku epoki. Ten przyk\u0142ad ustawi wysy\u0142k\u0119 na 1 stycznia 2022, o 12:00:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>import java.util.GregorianCalendar;\n\nvar sendDate = new GregorianCalendar(2022, 0, 1, 12, 0);\nSendStatusResponse response = smsFactory.actionSend()\n\t.setTo(\"+48111222333\")\n\t.setText(\"Hello in the future!\")\n\t.setDateSent(sendDate)\n\t.execute();<\/code><\/pre>\n\n\n\n<p>Poni\u017cszy przyk\u0142ad za\u015b wy\u015ble SMS-a za godzin\u0119:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>import java.util.Date;\n\nvar sendDate = new Date().getTime()\/1000 + 3600;\nSendStatusResponse response = smsFactory.actionSend()\n\t.setTo(\"+48111222333\")\n\t.setText(\"Hello in the future!\")\n\t.setDateSent(sendDate)\n\t.execute();<\/code><\/pre>\n\n\n\n<p class=\"language-java\">W ten spos\u00f3b da si\u0119 ustawi\u0107 dat\u0119 maksymalnie na 3 miesi\u0105ce naprz\u00f3d. Je\u017celi w mi\u0119dzyczasie zmienisz plany, usu\u0144 SMS z harmonogramu za pomoc\u0105 akcji <code>SMSDelete<\/code>. Potrzebny jest do tego wspomniany wy\u017cej unikalny identyfikator zaplanowanego SMS-a. Wygl\u0105da to na przyk\u0142ad tak:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>String smsIdToDelete = response.getList().get(0).getId()\nsmsFactory.actionDelete(smsIdToDelete).execute();<\/code><\/pre>\n\n\n\n<p class=\"language-java\">Z obiektu klasy <code>SendStatusResponse<\/code> bierzemy list\u0119 wys\u0142anych SMS-\u00f3w, z niej \u2013 zerowy element, a z niego ID. Metod\u0105 z fabryki <code>actionDelete<\/code> tworzymy akcj\u0119, od razu podaj\u0105c do niej parametr i wykonujemy j\u0105.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak zrobi\u0107 dobre wra\u017cenie przy pomocy kampanii SMS?<\/h2>\n\n\n\n<p>Najwa\u017cniejsza jest oczywi\u015bcie tre\u015b\u0107, ale ta najpewniej b\u0119dzie identyczna dla mn\u00f3stwa odbiorc\u00f3w. Biblioteka udost\u0119pnia pewne dwa proste sposoby. <\/p>\n\n\n\n<p>Pierwszy to pole nadawcy SMS (inaczej branding SMS). Jest to kr\u00f3tki tekst, wy\u015bwietlany na ekranie zamiast numeru telefonu. Nazwa ta powinna jako\u015b identyfikowa\u0107 Twoj\u0105 firm\u0119, mark\u0119 lub produkt, aby od razu by\u0142o wiadomo, kto pisze. <\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"qyIywymSbO\"><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/branding-sms-skojarz-swoja-marke-z-wysylka-sms\/\">Branding SMS \u2013 jak ustawi\u0107 nazw\u0119 nadawcy w miejsce numeru telefonu?<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Branding SMS \u2013 jak ustawi\u0107 nazw\u0119 nadawcy w miejsce numeru telefonu?&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/branding-sms-skojarz-swoja-marke-z-wysylka-sms\/embed\/#?secret=mmRmgf1agj#?secret=qyIywymSbO\" data-secret=\"qyIywymSbO\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"language-java\">To prosta, ale zarazem przydatna w <a href=\"https:\/\/www.smsapi.pl\/sms-marketing\">marketingu SMS<\/a> metoda zwr\u00f3cenia uwagi odbiorcy. Do r\u0119cznego zarz\u0105dzania polami nadawcy s\u0142u\u017cy odpowiednia sekcja Panelu klienta. W kodzie mo\u017cesz skorzysta\u0107 z ju\u017c istniej\u0105cego pola za pomoc\u0105 metody akcji <code>SMSSend<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>smsFactory.actionSend()\n\t.setTo(\"+48111222333\")\n\t.setText(\"Hello world!\")\n\t.setSender(\"sender_name\")\n\t.execute();<\/code><\/pre>\n\n\n\n<p>Drugi ze wspomnianych sposob\u00f3w to <strong>parametryzacja wiadomo\u015bci<\/strong>. Specjalne ci\u0105gi znak\u00f3w w tek\u015bcie SMS umo\u017cliwiaj\u0105 <a href=\"https:\/\/www.smsapi.pl\/personalizacja\">personalizacj\u0119 masowo wysy\u0142anych wiadomo\u015bci<\/a>. <\/p>\n\n\n\n<p>Dzi\u0119ki temu nie b\u0119d\u0105 one identyczne, ale skierowane bardziej indywidualnie do odbiorc\u00f3w. Mo\u017cesz skorzysta\u0107 z czterech p\u00f3l dowolnych oraz warto\u015bci p\u00f3l z bazy kontakt\u00f3w. Szczeg\u00f3\u0142owo opisuje je <a href=\"https:\/\/www.smsapi.pl\/docs\/#sms-do-grupy-z-bazy-kontaktow\">Dokumentacja<\/a>. Zobaczmy na przyk\u0142adzie:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>smsFactory.actionSend()\n\t.setTo(new String&#91;]{\"+48111222333\", \"+48444555666\"})\n\t.setText(\"Hello &#91;%imie%], your number is &#91;%1%]!\")\n\t.setParam(0, new String&#91;]{\"11\", \"22\"})\n\t.execute();<\/code><\/pre>\n\n\n\n<p>Teksty wszystkich (dw\u00f3ch) SMS-\u00f3w zostan\u0105 zmodyfikowane dwukrotnie. Pola [%imie%] b\u0119d\u0105 zamienione na odpowiednie warto\u015bci z bazy kontakt\u00f3w. <\/p>\n\n\n\n<p class=\"language-java\">Metoda <code>setParam<\/code> zapewni podmian\u0119 pola [%1%]. Pierwszy jej argument to indeks parametru, drugi to tablica string\u00f3w, wstawianych do kolejnych wiadomo\u015bci zamiast ci\u0105g\u00f3w specjalnych. Dost\u0119pne s\u0105 cztery takie dowolne parametry: [%1%], [%2%], [%3%], [%4%], kt\u00f3rym odpowiadaj\u0105 indeksy 0, 1, 2, 3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Obs\u0142uga p\u00f3l nadawcy SMS w bibliotece Java SMSAPI<\/h2>\n\n\n\n<p class=\"language-java\">Jak wspomnia\u0142em wy\u017cej, warto skorzysta\u0107 z funkcji p\u00f3l nadawcy SMS. Ich programow\u0105 obs\u0142ug\u0119 zapewnia fabryka <code>SenderFactory<\/code> oraz klasy akcji: <code>SenderList<\/code>, <code>SenderAdd<\/code>, <code>SenderDefault<\/code>, <code>SenderDelete<\/code>. <\/p>\n\n\n\n<p>Poni\u017cszy przyk\u0142ad pokazuje, jak przywo\u0142a\u0107 list\u0119 istniej\u0105cych p\u00f3l nadawc\u00f3w SMS, doda\u0107 nowego, ustawi\u0107 go jako domy\u015blnego i usun\u0105\u0107. Zak\u0142adam, \u017ce wcze\u015bniej utworzono obiekt klienta (potrzebny dla fabryki).<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>var senderNameFactory = new SenderFactory(client);\nSendersResponse response = senderNameFactory.actionList().execute();\nfor (SenderResponse elem: response.getList()){\n\tSystem.out.println(\n\t\t\"Sender name: \"+elem.getName()\n\t\t+\"Sender status: \"+elem.getStatus()\n\t\t+\"is default?: \"+elem.isDefault()\n\t);\n}\nsenderNameFactory.actionAdd(\"NewSenderName\").execute();\nsenderNameFactory.actionSetDefault(\"NewSenderName\").execute();\nsenderNameFactory.actionDelete(\"NewSenderName\").execute();<\/code><\/pre>\n\n\n\n<p>Pole nadawcy wiadomo\u015bci musi spe\u0142nia\u0107 pewne wymogi. Najwa\u017cniejsze, to pami\u0119ta\u0107, \u017ce ze wzgl\u0119d\u00f3w bezpiecze\u0144stwa ka\u017cde nowe pole musi by\u0107 zatwierdzone przez naszego pracownika w godzinach pracy SMSAPI.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Obs\u0142uga b\u0142\u0119d\u00f3w w bibliotece Java SMS API<\/h2>\n\n\n\n<p>Podczas automatycznej obs\u0142ugi SMS-\u00f3w mog\u0105 wyst\u0105pi\u0107 b\u0142\u0119dy, i to w wielu miejscach. Przyk\u0142adowo: w \u0142\u0105czeniu si\u0119 z serwerem, konstruowaniu zapyta\u0144, stosowaniu r\u00f3\u017cnorodnych parametr\u00f3w oraz przetwarzaniu odpowiedzi z serwera. Kiedy co\u015b p\u00f3jdzie nie tak, serwer zamiast oczekiwanej odpowiedzi wy\u015ble kod i wiadomo\u015b\u0107 b\u0142\u0119du. <\/p>\n\n\n\n<p>Szczeg\u00f3\u0142ow\u0105 list\u0119 kod\u00f3w znajdziesz w <a href=\"https:\/\/www.smsapi.pl\/docs\/#19-kody-bledow\" class=\"ek-link\">Dokumentacji<\/a>. Przed b\u0142\u0119dami warto si\u0119 zabezpieczy\u0107, dlatego omawiana biblioteka definiuje kilka klas wyj\u0105tk\u00f3w.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ClientException<\/code> \u2013 te wyj\u0105tki dotycz\u0105 metod HTTP. U\u017cywane kody b\u0142\u0119d\u00f3w to np. 101 (niepoprawny token OAuth2) i 103 (brak punkt\u00f3w do wys\u0142ania SMS).<\/li>\n\n\n\n<li><code>HostException<\/code> \u2013 oznaczaj\u0105 b\u0142\u0119dy po stronie serwera SMSAPI. Kody m.in. to 8 (b\u0142\u0105d w odwo\u0142aniu) i 201 lub 999 (wewn\u0119trzne b\u0142\u0119dy systemu).<\/li>\n\n\n\n<li><code>ActionException<\/code> \u2013 te wyj\u0105tki wynikaj\u0105 z niepoprawnego u\u017cycia kt\u00f3rej\u015b z akcji. Kod b\u0142\u0119du 11 to za d\u0142ugi tekst wiadomo\u015bci lub jego brak. 13 to b\u0142\u0119dny numer odbiorcy lub jednoczesne u\u017cycie grupy i pojedynczego numeru. 14 oznacza, \u017ce pole nadawcy jest nieprawid\u0142owe; 40 \u2013 nie istnieje podana grupa.<\/li>\n\n\n\n<li><code>ProxyException<\/code> \u2013 wyst\u0119puj\u0105 przy b\u0142\u0119dzie po\u0142\u0105czenia z serwerem, nie maj\u0105 kodu z SMSAPI. S\u0105 rzucane, gdy wyst\u0105pi wyj\u0105tek z klasy <code>java.io.IOException<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"language-java\">Konkretne kody b\u0142\u0119d\u00f3w zwraca metoda <code>getCode()<\/code>. W jednym przypadku rzucany jest jeszcze wyj\u0105tek indeksu poza tablic\u0105 (<code>ArrayIndexOutOfBoundsException<\/code>): gdy usi\u0142owano odwo\u0142a\u0107 si\u0119 do parametru wiadomo\u015bci o indeksie innym, ni\u017c 0, 1, 2, 3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Biblioteka SMSAPI w Javie \u2013 wi\u0119cej opcji<\/h2>\n\n\n\n<p class=\"language-java\">Istniej\u0105 jeszcze inne, nieopisane wy\u017cej fabryki, kt\u00f3re oferuj\u0105 dalsze mo\u017cliwo\u015bci dla Twojej aplikacji w Javie. Jedn\u0105 z nich jest <code>ContactsFactory<\/code> \u2013 jak \u0142atwo si\u0119 domy\u015bli\u0107, s\u0142u\u017cy do obs\u0142ugi bazy kontakt\u00f3w. Umo\u017cliwia listowanie, usuwanie, edycj\u0119 poszczeg\u00f3lnych odbiorc\u00f3w oraz ich grup. Utworzenie nowego wpisu mo\u017ce wygl\u0105da\u0107 w przybli\u017ceniu tak \u2013 zak\u0142adaj\u0105c, \u017ce istnieje ju\u017c obiekt klienta HTTP:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>ContactsFactory contactsFactory = new ContactsFactory(client);\ncontactsFactory.actionContactAdd()\n\t.setFirstName(\"Test First Name\")\n\t.setLastName(\"Test Last Name\")\n\t.setPhoneNumber(numberTest)\n\t.setEmail(\"test@example.com\")\n\t.execute();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Wysy\u0142ka MMS z Java<\/h3>\n\n\n\n<p class=\"language-java\">Inna fabryka o nazwie <code>MMSFactory<\/code> s\u0142u\u017cy do obs\u0142ugi wiadomo\u015bci multimedialnych. Kluczowa jest jej metoda actionSend, kt\u00f3ra dzia\u0142a analogicznie, jak dla opisanej powy\u017cej wysy\u0142ki SMS-\u00f3w. <\/p>\n\n\n\n<p class=\"language-java\">Jej wykonanie (<code>metod\u0105 execute()<\/code>) zwraca obiekt <code>SendStatusResponse<\/code>, a za pomoc\u0105 metod \u201cset\u201d ustawisz parametry wiadomo\u015bci, takie jak odbiorca i data wys\u0142ania. Zamiast zwyk\u0142ego tekstu musisz dostarczy\u0107 wiadomo\u015b\u0107 w formacie SMIL oraz jej temat. Poni\u017cszy fragment zak\u0142ada, \u017ce istnieje ju\u017c taka poprawna tre\u015b\u0107:<\/p>\n\n\n\n<pre class=\"wp-block-code language-java\"><code>mmsFactory = new MMSFactory(client);\nmmsFactory.actionSend()\n\t.setTo(\"+48111222333\")\n\t.setSubject(\"test_subject\")\n\t.setSmil(smil_content)\n\t.execute();<\/code><\/pre>\n\n\n\n<p>Na koniec wska\u017c\u0119 Ci kilka miejsc, gdzie mo\u017cesz szuka\u0107 odpowiedzi na wszelkie powsta\u0142e pytania techniczne. Pierwsze to cz\u0119sto ju\u017c wspominana <a rel=\"noreferrer noopener\" href=\"https:\/\/www.smsapi.pl\/docs\" target=\"_blank\">dokumentacja API<\/a>. Brak jest tam nawi\u0105za\u0144 do kodu Javy, ale mn\u00f3stwo jest szczeg\u00f3\u0142owych wyja\u015bnie\u0144. Pomog\u0105 one zrozumie\u0107 przeznaczenie poszczeg\u00f3lnych parametr\u00f3w, kod\u00f3w b\u0142\u0119d\u00f3w i sposob\u00f3w dzia\u0142ania r\u00f3\u017cnych funkcji. <\/p>\n\n\n\n<p>Je\u015bli wygodnie korzysta Ci si\u0119 z dokumentacji Javadoc, \u015bci\u0105gnij jej najnowsz\u0105 wersj\u0119 (2.5) z <a href=\"https:\/\/labs.smsapi.com\/maven\/pl\/smsapi\/smsapi-lib\/2.5\/smsapi-lib-2.5-javadoc.jar\" target=\"_blank\" rel=\"noreferrer noopener\">serwera SMSAPI<\/a>. Dzi\u0119ki licznym komentarzom i przejrzystej strukturze znacznie u\u0142atwi ona odnalezienie si\u0119 w\u015br\u00f3d dost\u0119pnych klas, metod i pakiet\u00f3w.<\/p>\n\n\n\n<p>Dobrym \u017ar\u00f3d\u0142em informacji s\u0105 te\u017c testy jednostkowe, napisane przy u\u017cyciu JUnit. Znajdziesz je na <a href=\"https:\/\/github.com\/smsapi\/smsapi-java-client\" target=\"_blank\" rel=\"noreferrer noopener\">GitHubie<\/a>. Na etapie tworzenia biblioteki s\u0142u\u017cy\u0142y zapewnieniu jako\u015bci, a dla Ciebie dostarcz\u0105 przyk\u0142ad\u00f3w zastosowa\u0144 poszczeg\u00f3lnych interfejs\u00f3w i metod. Je\u015bli to dalej nie rozwieje wszystkich w\u0105tpliwo\u015bci, si\u0119gnij do najpe\u0142niejszego \u017ar\u00f3d\u0142a wiedzy, czyli samego kodu biblioteki. Powodzenia!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jak wykorzysta\u0107 SMS API to wysy\u0142ki wiadomo\u015bci w Java? Oto instrukcja z przyk\u0142adami kodu.<\/p>\n","protected":false},"author":3,"featured_media":25042,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[321],"tags":[315,230,223],"class_list":["post-25038","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-podstawy","tag-biblioteka","tag-it","tag-api"],"_links":{"self":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/25038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/comments?post=25038"}],"version-history":[{"count":32,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/25038\/revisions"}],"predecessor-version":[{"id":30057,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/25038\/revisions\/30057"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/media\/25042"}],"wp:attachment":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/media?parent=25038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/categories?post=25038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/tags?post=25038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}