Miło mi poinformować, że nasze forum właśnie szerzej otwiera się na świat. A to za sprawą udostępnienia platformy API, za pomocą której każdy programista czy webmaster, przy odrobinie dobrych chęci, będzie mógł odczytać zdalnie pewne udostępnione dane z forum i wyświetlić je w zewnętrznej aplikacji lub na swojej stronie internetowej - w postaci tzw. widżetów. Można je tworzyć za pomocą nieskomplikowanego kodu JavaScript i osadzić np. na własnym blogu wycinek swoich danych profilowych udostępnionych na forum. Możliwości wykorzystania API zależą praktycznie tylko od wyobraźni twórców takich widżetów!
Jedną z najprostszych metod używania API, jest wykorzystanie w JavaScript specjanie przygotowanej w tym celu biblioteki - cross domenowy AJAX. Dane w formacie JSON są pobierane bezpośrednio z forum za pomocą wywołań asynchronicznych. Różnica między tradycyjnym AJAX-em jest taka, że AJAX pozwala pobierać dane tylko z tej samej domeny, z której został wywołany. Proponowana klasa JSONHttpRequest nie posiada tej wady, a udostępnia interfejs niemal identyczny jak standardowy XMLHttpRequest, więc jej używanie powinno być intuicyjne dla każdego, kto kiedykolwiek implementował jakiś skrypt z wykorzystaniem AJAX-a. Niestety biblioteka ta ma również pewne ograniczenia:
Nie pozwala wykonywać zapytań synchronicznych (w zasadzie to nie wada)
Nie obsługuje metody POST, a jedynie GET
Nie pozwala wysyłać ani odczytywać żadnych nagłówków HTTP
W przypadku wystąpienia błędu, nie zwraca wysłanych przez serwer kodów statusu odpowiedzi HTTP
Nie obsługuje XML (responseXML), ale za to domyślnym formatem wymiany danych jest wygodny JSON (responseJSON)
API
Udostępnione na forum API opiera się na wzorcu REST, który w odróżnieniu np. od SOAP jest znacznie łatwiejszy i przyjemniejszy w użyciu, a dodatkowo zawiera szereg innych zalet. Wszystkie udostępnione funkcjonalności są podzielone na klasy, które z kolei zawierają metody - jak w programowaniu zorientowanym obiektowo. Aby wywołać jakąś metodę obiektu REST, wystarczy po prostu odwołać się do z góry określonego adresu URL na forum, który udostępnia API. Idea wykorzystania API jest następująca:
Na swojej stronie, za pomocą klasy JSONHttpRequest wywołujemy odpowiedni, specjalnie udostępniony adres URL z API na forum
Odbieramy dane
Dynamicznie, za pomocą JavaScript, wklejamy je gdzieś do dokumentu (X)HTML, np. za pomocą innerHTML
Nawiązaznie połączenia i odebranie danych odbywa się praktycznie tak samo, jak w przypadku tradycyjnego AJAX-a - pełny przykład znajduje się w kodzie powyżej.
Skąd wziąć adresy udostępnionych funkcjonalności? Pełen spis dostępnych klas i ich metod, wraz z opisami, znajduje się pod adresem http://www.forumweb.pl/api/services.html. Możemy tam znaleźć np. klasę "users" z metodą "get", do wywołania której jak widać adres jest następujący: http://www.forumweb.pl/api/users/get.js (fragment <format> w podanych adresach URI zamieniamy zawsze na "js" - co stanowi po prostu rozszerzenie nazwy pliku API). Jeśli chcemy wywołać metodę z określonymi parametrami, po prostu podajemy je w adresie po pytajniku - np. http://www.forumweb.pl/api/users/get.js?user_id=2. Do celów testowych można również otworzyć sobie w przeglądarce najpierw format "xml", na którym lepiej widać, jaka będzie struktura odpowiedzi (klasa JSONHttpRequest obsługuje wyłącznie format "js"!) - np. http://www.forumweb.pl/api/users/get.xml?user_id=2.
Obsługa błędów
Kiedy coś pójdzie nie tak, zamiast spodziewanych danych w odpowiedzi dostaniemy komunikat błędu w postaci:
OBJECT_NOT_FOUND - żądany obiekt nie został znaleziony
DB_ERROR - błąd bazy danych
Rozwój
W przyszłości planowane jest stałe powiększanie dostępnych w API klas i metod - mile widziane wszelkie propozycje.
Jak pokazałem na przykładzie, stworzenie własnego widżetu, korzystającego z ForumwebAPI, jest niemal dziecinnie proste. Byłoby cudownie, gdyby ten temat stał się takim repozytorium widżetów, gdzie twórcy mogliby się nimi pochwalić, a inni użytkownicy bez przeszkód wstawiać je na własnych stronach.
API REST można używać również z poziomu PHP. Są dostępne darmowe doskonałe biblioteki - np. w Zend Framework. Idealnym formatem do wykorzystania w PHP, będzie oczywiście zserializowany kod PHP - np. http://www.forumweb.pl/api/users/get.php?user_id=2. Być może kiedyś zamieszczę tutaj przykład prostego klienta REST w PHP, który pozwoli pobrać dane w tle i np. zapisać w lokalnej bazie danych lub wykonać na nich jeszcze inne operacje.
Początkowo nie będą udostępnione metody API, które mogą modyfikować bazę danych forum lub wymagać logowania, ale w przyszłości - kto wie.
Nie przyglądałem się jakoś specjalnie temu API, ale jeśli daje już te lub zbliżone możliwości, to może warto by to jakoś wypromować przez automatyczne generowanie odnośników do kanałów w odpowiednich miejscach, tak żeby ułatwić ludziom życie.
Chociaż osobiście najbardziej podoba mi się idea pojedynczego zbiorczego kanału ze wszystkimi tematami, w których się kiedykolwiek wypowiedzieliśmy.
_________________ Nadszedł już czas, najwyższy czas, nienawiść zniszczyć w sobie.
Studia...
Emdek wogóle warto promować API, bo szczerze samo stworzenie API nic nie daje. Jedynie produkt promowany - pokazywany jak działa to tu to tam - będzie mógł kogoś zainteresować do tego, by sam stworzył jakieś z niego narzędzie.
Sam fakt pojawienia się API był miłym zaskoczeniem, ale szczerze nie zachwycił. Zaczął jednak interesować, kiedy logeen pokazał choć trochę jego możliwości: aktywni, punktowane posty (jak dzisiaj).
_________________ Pozycjonowanie strony - jak zdobyć najlepsze pozycje w wyszukiwarkach!
Może się wydawać, że te materiały to niewiele, ale w tym nie ma dużej filozofii - to naprawdę jest takie proste Napisanie nieskomplikowanego widżeciku w JavaScript na swoją stronę WWW to kilkanaście minut pracy, a to jest tylko jedno z wielu możliwych zastosowań API.
A oto kolejny ciekawy przykład wykorzystania ForumwebAPI - bardzo lekka przeglądarka tematów na forum:
Nic nie stoi na przeszkodzie, aby napisać taką aplikację w języku Java, C++ czy C#, która będzie działać w ten sam sposób, wykorzystując XML jako format pobierania danych za pośrednictwem API. Forumweb jako aplikacja okienkowa - czemu nie
_________________
Ostatnio zmieniony przez kurshtml dnia 31.08.2009 19:07, w całości zmieniany 1 raz
Właśnie chodzi o to, że wcale nie trzeba korzystać z JavaScript. Widżet na stronie głównej Kursu, który wyświetla najaktywniejszych użytkowników, został napisany w PHP - za pomocą ForumwebAPI skrypt PHP okresowo pobiera dane w formacie ".php". Bez trudu można wykorzystać format ".xml" w aplikacjach napisanych w języku: Java, C/C++, C#, Visual Basic, Delphi/Object Pascal i innych. JS to tylko jedna z możliwości.
kurshtml to mnie zachęciło do zgłębienia tego cacka choć nie wiem, do czego by go narazie wykorzystać
muszę się zagłębić w tematykę parsowania xml'a w php, żeby coś z tego wycisnąć
---------- 00:42 01.09.2009 ----------
Wiem, że niektórym najtrudniej zacząć. Więc prezentuje pierwszy "obrabiacz" tego API. Kod generuje listę 10 najaktywniejszych w php, czyli w sumie coś co już jest na stronie kursu, jednak może przyda się komuś na stronę internetową
@jsmp: Twój drugi przykład bardzo dobrze pokazuje bardziej zaawansowany sposób użycia API - brawo Przy czym jest trochę mało optymalny, bo dla każdego użytkownika z listy pobiera dodatkowy plik XML, co trochę trwa.
Właśnie zmodyfikowałem wszystkie metody API, tak aby zamiast pojedynczych identyfikatorów przyjmowały listę identyfikatorów, dzięki czemu to samo można wykonać tylko dwoma zapytaniami HTTP:
Przypominam również o metodzie _services/get. W powyższym przypadku była akurat zupełnie nieprzydatna, ponieważ drugie zapytanie zależy od pierwszego, tzn. wykorzystuje dane pobrane w pierwszym zapytaniu, a więc muszą one zostać wywołane sekwencyjnie. Często jednak, kiedy zapytania są niezależne (wynik jednego nie ma wpływ na parametry wejściowe drugiego), można je wykonać równolegle - za pomocą pojedynczego zapytania HTTP - właśnie dzięki _services/get:
Oczywiście obie powyższe uwagi odnoszą się również do wywołań API z poziomu JavaScript (za pomocą klasy JSONHttpRequest) oraz PHP (za pomocą klasy HttpRequest, którą przedstawiłem kilka postów wcześniej).
Ostatnio zgłębiając XML'a poznałem SimpleXML. Kod pozwala w o wiele krótszy sposób przeparsować kanał xml. Poniżej przykład z postu - tam zawierał 22 linijki, tu 9.
To prawda, pakiet SimpleXML jest bardzo wygodnym narzędziem. Na dodatek podobne implementacje są dostępne w większości popularnych języków programowania: PHP, Python, Perl, Ruby, Java, C++. Jeśli ktoś używa Linuksa, pewnie standardowo ma zainstalowanego Perla - można sobie wypróbować, jak to działa spod konsoli.
Zobacz następny temat Zobacz poprzedni temat Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach