Ați folosit fiecare GoToWebinar de la Citrix? Nu? Nu vă faceți griji, nu sunteți singuri. Cu toate acestea, ați încercat vreodată legarea orice serviciu în WordPress? MailChimp, Mad Mimi, PayPal, Twitter? În timp ce aceste servicii diferă în multe cazuri, ideea generală despre modul în care putem aduce date din API-uri externe în WordPress este aceeași. În acest articol voi explora acest lucru prin ochii unei exemple de integrare cu GoToWebinar de la Citrix.
GoToWebinar vă permite să programați evenimente live în direct, unde publicul și prezentatorii se alătură unei interfețe de utilizare comune. Prezentatorii pot apoi să partajeze diapozitivele, ecranul, camerele web și să facă tot felul de lucruri reci.
Serviciul a fost în jur de ceva timp, astfel încât sa întâmplat inevitabil: acum are un API - și unul destul de bun la acel moment.
Într-un proiect recent pe care l-am condus, am dorit să păstrăm înregistrările la fața locului și am dorit, de asemenea, ca datele de înregistrare să fie disponibile în WordPress. Fără API, acest lucru nu este posibil. În mod implicit, fiecare webinar are un link de înregistrare care vă duce în afara sistemului în GoToWebinar, unde utilizatorii se înregistrează. Funcționează bine, dar nu am vrut să confundăm utilizatorii cu acest salt brusc.
Am crezut că te-aș fi îndreptat spre procesul prin care am realizat ceva din acest lucru folosind un cod surprinzător de mic!
Înainte să ne aruncăm în abis, veți avea nevoie de câteva lucruri. Ar trebui să aveți un cont GoToWebinar și, de asemenea, trebuie să vă conectați la Centrul pentru dezvoltatori împreună cu contul dvs. Odată ajuns acolo, faceți clic pe marginea Adăugați o aplicație nouă buton.
Urmați instrucțiunile de pe ecran și completați toate câmpurile, asigurându-vă că selectați că construiți o aplicație GoToWebinar. Pentru Adresa URL a aplicației asigurați-vă că utilizați https://api.citrixonline.com
. Va trebui să modificați acest lucru când utilizați OAuth, dar în exemplele noastre vom folosi autentificarea directă prin conectare, ceea ce face ca această adresă URL să fie cea mai bună opțiune.
Odată ce cererea dvs. a fost creată, rețineți Cheia de consum. Vom folosi acest lucru mai târziu în apelurile noastre API. În caz contrar, asta e pentru configurare, așa că acum este momentul să ne murdărim mâinile.
API-urile de astăzi respectă în principal orientările REST, care reprezintă transferul de stat reprezentant. Fără a intra în nitty-pietriș, se reduce la o interfață simplă pe care o puteți comunica într-un mod foarte natural.
După cum am menționat, fiecare API este diferit în specificul său, dar modul general în care le folosim este aproximativ același:
Este într-adevăr atât de simplu. Dacă ați încercat să citiți documentația PayPal de la zero (ceea ce este oribil), s-ar putea să vă fi văzut sub impresia că lucrul cu API este un proces teribil de impozitare. Cred că o parte din confuzie provine din dificultatea de autentificare și din faptul că dezvoltatorii care sunt familiarizați doar cu PHP nu sunt într-adevăr folosiți la apelurile HTTP care sunt de obicei reprezentate fără cod PHP alături de ele. Să rezolvăm toate astea, putem?
O condiție prealabilă pentru tot ceea ce urmează să facem este să efectuați corect apelurile HTTP. De cele mai multe ori veți vedea tutoriale folosind CURL sau doar HTTP brut, dar WordPress ne acoperă (ca de obicei) cu API-ul său HTTP.
Întrucât apelurile HTTP pot avea o serie de părți diferite, am crezut că ar fi o idee bună să dați un pic mai profund în acest aspect. Să arătăm pe scurt ce este într-adevăr o solicitare HTTP.
O solicitare HTTP este trimisă la o anumită adresă URL, și de aici provin punctele finale API și rutele specifice. De exemplu, adresa URL din documentația GoToWebinar pentru a obține toți solicitanții înregistrării pentru un webinar este:
https://api.citrixonline.com/G2W/rest/organizers/organizerKey/webinars/webinarKey/registrants
Chiar dacă aveți ID-ul Organizatorului și Webinar, utilizarea URL-ului nu este suficientă. O solicitare HTTP este mai mult decât o adresă URL. Acesta conține o grămadă de alte informații, în special o serie de anteturi și poate chiar un corp.
Acest lucru este destul de ușor de înțeles atunci când primiți date. Ori de câte ori vizitați un site web, browserul dvs. emite o solicitare și primește un răspuns HTTP. Răspunsul este nu doar site-ul pe care îl vedeți în fața dvs. Acesta conține un număr de antete, cum ar fi codul de stare, de exemplu, care va fi, probabil, 200 OK. Codul pe care browserul îl interpretează și îl afișează este trimis în corp a răspunsului.
Din această cauză, documentația merge mai detaliat - oferă o cerere de HTTP exemplu:
GET https://api.citrixonline.com/G2W/rest/organizers/7913299991555673093/webinars/2575999967611407361/registrants HTTP / 1.1 Acceptați: application / json Tip de conținut: application / json Autorizație: OAuth oauth_token = hdKAifAke73JTJR5GABCdByGz4kp
Aceasta mizerie de siruri de caractere nu este de fapt atat de dificil de descifrat. Chiar dacă nu înțelegeți ce este, puteți construi destul de ușor această solicitare cu funcțiile native ale WordPress.
Totul începe cu OBȚINE
, ceea ce înseamnă că aceasta va fi o cerere de solicitare. WordPress oferă wp_remote_get ()
funcția, care va funcționa foarte bine. Aceasta este urmată de adresa URL, pe care o vom trece ca primul parametru pentru această funcție. Apoi vedem versiunea HTTP, care poate fi setată în al doilea argument, care este o serie de opțiuni.
Totul după aceea este un antet. Accept
valoarea antetului este application / json
, Tipul de conținut
valoarea antetului este application / json
si asa mai departe. Având în vedere aceste informații, să realizăm cererea HTTP în WordPress:
$ url = 'https://api.citrixonline.com/G2W/rest/organizers/7215599994255673093/webinars/2575945029611407361/registranții'; $ args = array ('httpversion' => '1.1', 'headers' => array ('Accept' => 'application / json', 'Content-Type' => 'OAuth oauth_token = hdKAifAke73gh885ghJTJR5GA4kp')); $ http_request = wp_remote_get ($ url, $ args);
În timp ce acesta este un exemplu specific pe care îl vom examina în detaliu în curând, punctul de interes este următorul: solicitările HTTP nu sunt atât de intimidante. De obicei, trebuie să setați o adresă URL, unele antete și, în unele cazuri, un corp, și asta este. Apoi, primiți niște date înapoi, de obicei în formularul JSON, pe care îl puteți trece json_decode ()
și apoi utilizați ca o matrice normală sau un obiect.
Acum, că știm structura de bază a unei solicitări HTTP, să ne dăm seama cum să ne autentificăm și să putem efectua apelurile pe care le dorim.
În acest exemplu, mă voi uita la metoda de autentificare directă a autentificării. Fluxul pentru OAuth este puțin mai complex, dar elementele de bază sunt aceleași - trebuie doar să faceți două apeluri HTTP în loc de unul.
Acestea fiind spuse, recomand foarte mult utilizarea OAuth deoarece este mai sigură și mai multe și mai multe API-uri o integrează sau chiar o cer!
Documentația pentru conectarea directă face ceea ce dorim să realizăm foarte clar. De fapt, ceea ce am observat în propria mea programare este că atunci când am dat seama cum pot fi făcute ușor cererile HTTP, am găsit toată documentația API mult mai ușor de înțeles. Sperăm că acest articol va face același lucru pentru dvs.!
Potrivit documentației, putem face o OBȚINE
Sună la https://api.citrixonline.com/oauth/access_token
cu partea corespunzătoare Accept
și Tipul de conținut
anteturi în plus față de setarea grant_type
, numele de utilizator
și parola
Parametrii URL și GoToWebinar ne vor scuza datele de autentificare. Să încercăm acum:
$ url = 'https://api.citrixonline.com/oauth/access_token?grant_type=password&user_id=myaccount&email.com&password=mysecretpass&client_id=mycitrixapikey'; $ args = array ('headers' => array ('Accept' => 'cerere / json', 'Content-Type' => 'application / json')); $ http_request = wp_remote_get ($ url, $ args);
Rețineți că valorile tuturor acestor parametri sunt false. Va trebui să utilizați numele de utilizator
(email) și parola unui cont GoToWebinar real. CLIENT_ID
ar trebui să fie "cheia de consum" a aplicației dvs., pe care am creat-o în secțiunea "Înainte de a începe" de mai sus.
Dacă utilizați var_dump ()
pentru a afișa conținutul $ http_request
variabilă, veți găsi că este o matrice formată dintr-un număr de membri, cum ar fi "anteturi", "corp", "răspuns" și așa mai departe. În scopurile noastre "corpul" deține cele mai importante informații:
După cum probabil ați observat, acesta este un șir JSON pe care va trebui să îl transformăm într-o formă utilizabilă. Fuga prin ea json_decode ()
ne va da o matrice PHP corectă dacă vom seta al doilea parametru la adevărat (altfel va fi un matrice).
$ body = json_decode ($ http_request, adevărat);
Din toate aceste date veți avea nevoie de două lucruri: jeton de acces
si al tau organizer_key
. Indicativul de acces este "parola temporară". Ideea este de a preveni necesitatea de a vă trimite real parola cu fiecare solicitare - solicitați un indiciu de acces temporar cu acreditările dvs. o singură dată, apoi utilizați-l pentru a "semna" fiecare solicitare ulterioară.
Să revedem exemplul nostru din secțiunea Apeluri HTTP și, probabil, exemplul va fi mult mai clar acum. Aici este același cod cu substituenți pentru toate informațiile pe care le avem acum:
$ organizer_key = '2893726'; $ webinar_id = '849927254829281838'; $ access_token = 'h7dwo20vAsXI8GLaGvun0wOJ6H5I'; $ url = "https://api.citrixonline.com/G2W/rest/organizers/$organizer_key/webinars/$webinar_id/registrants"; $ args = array ('httpversion' => '1.1', 'headers' => array ('Accept' => 'application / json', 'Content-Type' => "OAuth oauth_token = $ acces_token")); $ http_request = wp_remote_get ($ url, $ args);
webinar_id
în care vine de la un webinar real pe care l-am creat în GoToWebinar și puteți găsi ID-ul în URL-ul de la sfârșit. În acest stadiu ar trebui să fie clar Unde datele provin de la, dar în exemplul acesta este în continuare în esență codat greu - să clarificăm asta chiar în sus!
Trebuie să stocăm date de autentificare și expiră? Da și da, și deoarece cuvântul "expire" a fost folosit împreună cu "magazin", vorbim despre o situație tranzitorie aici, deci introduceți API-ul Transients.
Dacă nu aveți nicio idee despre ce este, nu vă faceți griji! Este destul de simplu - vă permite să stocați lucrurile utilizând funcțiile WordPress cu o marcă de timp în care data expiră datele. Să ne scriem o clasă mini pentru a putea face simpla creare a unui simbol de acces. Acest lucru va părea înfricoșător la început, dar este foarte simplu explicație!
clasa Citrix_WP var $ client_id; var $ password; var $ user_id; var $ access; funcția __construct () $ this-> client_id = 'sI48T4iXP0J6720G9wAB0Ghfg37576301'; $ this-> user_id = '[email protected]'; $ this-> password = 'superpassword'; $ this-> access_field = 'citrix_access'; $ This-> set_access (); funcția set_access () $ access = $ this-> get_access (); $ this-> access = $ access; funcția get_access () $ access = get_transient ($ this-> access_field); dacă (gol ($ acces)) $ access = $ this-> request_access (); $ this-> set_access_transient ($ acces); retur accesul $; funcția set_access_transient ($ access) set_transient ($ this-> access_field, $ access, DAY_IN_SECONDS); funcția request_data ($ url, $ args = array ()) $ $ defaults = array ('httpversion' => '1.1', 'headers' => Introduceți '=>' application / json ',' Autorizare '=>' OAuth oauth_token = '. $ This-> access ["access_token"]); $ args = wp_parse_args ($ args, implicit $); $ http_request = wp_remote_get ($ url, $ args); $ body = json_decode ($ http_request ['body'], adevărat); dacă (! gol ($ corp ['int_err_code'])) $ this-> get_access (); $ this-> cerere_data ($ url, $ args); altceva return $ body; request_access () $ url = 'https://api.citrixonline.com/oauth/access_token?grant_type=password&user_id='. $ this-> user_id. '& parola ='. $ this-> parola. '& client_id ='. $ This-> CLIENT_ID; $ args = array ('headers' => array ('Accept' => 'cerere / json', 'Content-Type' => 'application / json')); $ result = wp_remote_get ($ url, $ args); returnează json_decode ($ result ['body'], true);
Ce naiba se întâmplă aici ?! Există o explicație perfect simplă - vrem să scriem cât mai puțin cod în timp ce manipulam apelurile HTTP reale. Știm deja că avem nevoie de un jeton de acces pentru fiecare și că acest jeton de acces va expira la un moment dat. Deci, pentru fiecare apel pe care îl facem, ar trebui să verificăm dacă simbolul de acces este valabil. Dacă nu este, ar trebui să solicităm unul nou și apoi să reluăm apelul inițial. Această clasă are grijă de toate astea.
În funcția construct, care rulează de îndată ce un obiect este instanțiat, mi-am codificat greu CLIENT_ID
, numele de utilizator
și parola
. În realitate, este o idee bună să folosiți constante sau chiar să le transmiteți funcției constructe, dar m-am gândit că aș fi făcut totul pentru această lecție.
Un alt lucru de care avem nevoie este un loc pentru stocarea acreditărilor de acces pe care le primim de la Citrix. Voi folosi un tranzitoriu, iar numele lui va fi "citrix_access". Am stocat acest nume de domeniu ca proprietate a clasei. În cele din urmă, rulați set_access ()
metodă.
Acest lucru asigură că avem acreditări valide și le stocăm în acces
proprietate pentru acces ușor. Cum se asigură că totul este valabil? Utilizează obține acces()
metodă. Această metodă preia acreditările de acces de la serviciul nostru tranzitoriu. Dacă tranzitorul nu este gol, acesta returnează valoarea tranzitorie. Dacă tranzitorul este gol, acesta utilizează cere acces()
pentru a obține noi acreditări de la Citrix, stabilește valoarea tranzitorie pentru noile acreditări și le returnează și ei.
În acest stadiu, avem acreditări de acces disponibile, astfel încât să putem începe să formăm solicitări. Există încă o problemă: creditele de pe partea Citrix s-ar putea să fi expirat din motive de siguranță. În acest caz, solicitările noastre se vor întoarce cu o eroare. Din acest motiv, am adăugat o request_data ()
metodă care se poate ocupa de acest lucru pentru noi.
Această metodă conține aproape același cod pe care l-am scris anterior, utilizând proprietățile clasei pentru a popula apelul. Rețineți că am adăugat unele antete ca valori implicite. Acestea, cel mai probabil, nu se vor schimba de la apel la apel, eliminând nevoia de a transmite argumente în majoritatea cazurilor.
În plus, metoda verifică răspunsul organismului. Dacă conține un cod de eroare, acesta generează noi acreditări de acces și reamintește metoda cu aceiași parametri.
Aici depinde munca noastră grea. Pentru a obține o listă cu solicitanții înregistrării, trebuie să facem tot ce trebuie să facem:
$ citrix = nou Citrix_WP; $ registrants = $ citrix-> request_data ('https://api.citrixonline.com/G2W/rest/organizers/'. $ citrix-> access ['organizer_key']. '/ webinars / 849927252521582337 / solicitanții înregistrării);
Nu este nevoie să adăugăm argumente, ci doar adresa URL și vom primi toate datele delicioase din Citrix înapoi.
Notă de avertizare: clasa pe care am scris-o este o clasă de demonstrații foarte rapidă. Ea funcționează foarte bine pentru mine chiar acum, dar nu recomand să o folosiți așa cum este în producție. Iată câteva aspecte:
request_data ()
funcția nu este mare. Dacă cererea nu reușește din orice alt motiv decât un token invalidat, puteți intra într-o buclă infinită.Ca un exemplu, exemplul este bun, dar trebuie să fiți atenți la erori atunci când îl utilizați.
Ca întotdeauna, cineva a fost deja destul de drăguț să facă o clasă pe care să o folosim, care este mult mai completă decât cea pe care tocmai ți-am arătat-o ca studiu de caz. Teodor Talov a scris o Clasă Wrapper pentru API-urile Citrix, disponibilă prin GitHub.
Voi folosi clasa lui pentru a interacționa cu GoToWebinar din acest moment. Pentru a realiza același lucru pe care l-am făcut mai sus, veți avea nevoie de pregătire și câteva rânduri de cod. În primul rând, folosirea clasei este cea mai ușoară dacă o obțineți prin Composer. Compozitorul este foarte ușor de instalat dacă nu îl aveți deja - urmați Ghidul de inițiere și întâlniți-mă aici în cinci minute.
Utilizați terminalul sau promptul de comandă pentru a intra în directorul pluginului și tastați următoarea comandă:
compozitorul necesită teodortalov / citrix
Acest lucru va apuca fișierele de care aveți nevoie și le-ați pus în directorul furnizorilor. Apoi, în plugin-ul dvs. va trebui să includeți fișierul autoload așa cum este acesta:
include (plugin_dir_path (__FILE__) ./vendor/autoload.php ');
Asta e pentru pregătire, așa că acum putem folosi clasa. Iată un fragment care va trage viitoarele seminarii web de la Citrix.
$ client = nou \ Citrix \ Authentication \ Direct ('sI48T4iXP0J6720G9wAB0GHIHiIoyw20'); $ client-> auth ('[email protected]', 'gnasher1'); $ goToWebinar = nou \ Citrix \ GoToWebinar ($ client); $ webinars = $ goToWebinar-> getUpcoming ();
Easy-peasy, nu? Cu această clasă mai puternică în toolbelt-ul nostru, să construim ceva frumos! O parte din planul nostru a fost să folosim tipuri personalizate de posturi pentru a stoca seminarii web pentru a le lista pe site. Tot ce avem nevoie este un câmp meta care stochează ID-ul Citrix Webinar și putem trage orice altceva de la Citrix, de exemplu: solicitanții înregistrării. Să creăm o casetă meta care afișează acum solicitanții înregistrării unui webinar!
Hai să scoatem lucrurile din WordPress de bază: meta-box-ul în sine. Iată câteva coduri care vor afișa o căsuță metală goală cu un titlu frumos:
funcția my_registrants_metabox () add_meta_box ('webinar_registrants', 'Registrants', 'my_registrants_metabox_content', 'webinar'); funcția my_registrants_metabox_content ($ post) // Aici este conținutul metabox.
Veți avea, desigur, nevoie de un tip de post personalizat, cu numele "webinar", pentru ca acest lucru să apară. Dacă trebuie să citiți acest lucru, avem un ghid de creare a tipului de post personalizat.
Îmi place să fac un mic prototip HTML cu privire la rezultatul final dorit, deci hai să facem asta. Datele false, dar un UI real. Am de gând să utilizez Datatables, un plugin de tabel jQuery, așa că voi encrige scripturile și stilurile pentru asta. Aici merge:
funcția my_backend_assets () wp_register_script ('datatables', '//cdn.datatables.net/1.10.7/js/jquery.dataTables.min.js', array ('jquery', 'customselect'), '1.0' Adevărat ); wp_register_style ('datatables', '//cdn.datatables.net/1.10.7/css/jquery.dataTables.min.css'); wp_enqueue_script ('my-app', plugin_dir_path (__FILE__) ./js/app.js ', array (' datatables '),' 1.0 ', true); funcția my_registrants_metabox () add_meta_box ('webinar_registrants', 'Registrants', 'my_registrants_metabox_content', 'webinar'); funcția my_registrants_metabox_content ($ post) wp_enqueue_script ('datatables'); wp_enqueue_style ('datatables'); ?>„;
Nume Numele de familie Data Zona Daniel Pataki [email protected] 2015-08-12 New York Cineva altfel [email protected] 2015-08-13 Paris Acest lucru va crea marcajul de care avem nevoie și enqueue stilurile. Tot ce trebuie să facem este să creăm
js / app.js
în plugin-ul nostru cu următorul conținut:(funcția ($) $ (document) .ready (funcția ($) $ ('.mai-table-table');Rezultatul ar trebui să arate cam ca imaginea de mai jos.
Nu este super-drăguț, dar o voi rezolva prin introducerea unei alte foi de stil și suprascrierea unor defecțiuni impuse de Datatables. Următorul pas este să luăm date de la Citrix în loc să-l falsificăm.
Am decis să folosesc din nou tranziții pentru a ne asigura că nu bombardăm Citrix cu solicitări de fiecare dată când este vizualizată o pagină web de editare. Vom lua lista solicitanților de înregistrare și le vom păstra într-un moment tranzitoriu cu o oră în valoare de timp de expirare. Aceasta înseamnă că lista va fi actualizată numai în fiecare oră, dar ne va reduce solicitările la una pe oră în loc de una pe vizită.
De asemenea, va trebui să folosim un câmp meta pentru ID-ul webinar. De obicei, folosesc câmpurile personalizate avansate, dar din moment ce acesta este un exemplu simplu, hai să folosim opțiunea câmpurilor personalizate implicite în WordPress și să stocăm un ID de webinar cu cheia
webinar_id
. Iată codul final:funcția my_backend_assets () wp_register_script ('datatables', '//cdn.datatables.net/1.10.7/js/jquery.dataTables.min.js', array ('jquery', 'customselect'), '1.0' Adevărat ); wp_register_style ('datatables', '//cdn.datatables.net/1.10.7/css/jquery.dataTables.min.css'); wp_enqueue_script ('my-app', plugin_dir_path (__FILE__) ./js/app.js ', array (' datatables '),' 1.0 ', true); wp_register_style ('my-datatables', plugin_dir_path (__FILE__). /css/my-datatables.css '); funcția my_registrants_metabox () add_meta_box ('webinar_registrants', 'Registrants', 'my_registrants_metabox_content', 'webinar'); funcția my_registrants_metabox_content ($ post) wp_enqueue_script ('datatables'); wp_enqueue_style ('datatables'); wp_enqueue_style ('meu-datatables'); $ webinar_id = get_field ('webinar_id', $ post-> ID); $ registrants = get_transient ('registrants_'; $ webinar_id); dacă (gol ($ registrants)) $ client = new \ Citrix \ Authentication \ Direct ('consumer_key'); $ client-> auth ('user_id', 'parola'); $ goToWebinar = nou \ Citrix \ GoToWebinar ($ client); $ webinars = $ goToWebinar-> getRegistrants ($ webinar_id); set_transient ("registrants_". $ webinar_id, $ înregistrări, HOUR_IN_SECONDS); dacă (numără ($ solicitanți)> 0) echo '„; ecou'„;„; echo "„; echo "
„; echo "„; echo " „; echo "„; echo "„; foreach ($ înregistrați ca $ registrant) $ time_zone = explode ('/', $ registrant ['timeZone')); echo "Nume „; echo "Numele de familie „; echo "Data „; echo "Zona „; echo "„; echo " „; echo '„; echo "". $ registrant ['firstName']. ' „; echo "". $ registrant ['lastName']. ' „; echo "". $ registrant ['email']. ' „; echo "". data ("Y-m-d", strtotime ($ registrant ['registrationDate'])). ' „; echo "". str_replace ('_', ', $ time_zone [1]).' „; echo "S-au întâmplat câteva lucruri aici. În primul rând, am adăugat o nouă foaie de stil, doar pentru a adăuga o distincție vizuală la lista pe care o veți vedea în ecranul de mai jos.
Încerc apoi să obțin lista persoanelor care au înregistrat înregistrările de la persoanele în cauză. Dacă aceasta se întoarce goală, înseamnă că tranzientul nu a fost niciodată setat sau a expirat. În acest caz, recuperăm solicitanții înregistrării și le punem într-o situație tranzitorie.
Apoi bifăm registrele pentru a popula masa și suntem gata! Iată cum arată toate acestea cu unele stiluri adăugate:
Concluzie
Și acolo îl aveți: date extrase dintr-un API extern, memorat în cache și afișat, toate cu mecanisme și funcții native WordPress. În timp ce acest lucru durează ceva timp pentru a citi și a digera, mai ales dacă faci pentru prima dată ceva de genul ăsta, într-adevăr nu durează prea mult după ce îți înfășeri capul în jurul tău.
De fapt, odată ce ai o experiență cu API-uri externe, cea mai mare parte a timpului tău va fi cheltuită prin determinarea metodelor și opțiunilor pe care le au, nu cum să faci cereri HTTP și cum să stochezi date și așa mai departe.
Vă recomandăm cu exactitate utilizarea API-ului HTTP cuplat cu API-ul Transients. Sa dovedit a fi un lucru valoros și rapid în banda mea de instrumente.