Jak już się napisało, że kiedyś opiszę się tworzenie klienta RESTa w .Necie, to słowa trzeba dotrzymać. Postaram się jak najzwięźlej opisać w jak dość prosty sposób można otrzymać taką funkcjonalność. Przykładem będzie właśnie API dla Blipa, bowiem to przy nim “wypłynęło” kilka ciekawych zagadnień.
Continue reading ‘Klient REST w WCF’
Monthly Archive for January, 2009
Wyszło jak zawsze – przypadkiem. Wśród napisanych blipowych bibliotek znalazła się jedna dla .neta. Niestety, nie jest już rozwijana w związku z czym spróbowałem napisać swoją. Po kilku godzinach surfowania w Sieci udało mi się zdobyć na tyle dużo wiedzy nt. WCF by to właśnie w tej technologi wykonać bibliotekę. I myślę, że udało się, choć nie cała funkcjonalność API Blipa się w niej znajduje.
Pliki
kod źródłowy (Visual Studio 2008)
UPDATE [01.01.2010]
projekt na GitHub
Wymagania
.Net Framework 3.5
Użycie
Generalnie wszystkie wywołania metod znajdują się we właściwości Api klasy Blip. Jest tak dlatego, że podczas pobierania owej właściwości tworzony jest kontekst z wymaganymi przez API nagłówkami HTTP. Jeśli aplikacja, która piszesz łączy się z innymi źródłami danych przez HTTP, warto dla bezpieczeństwa wywoływać metodę Blip.Dispose() lub używać klauzuli using(), by usunąć kontekst.
Parametry przekazywane do wywołań niestety mogą być tylko typu string (wymóg WCF UPDATE: cóż, w innym kontekście może i można, ale ja dostaje wyjątek) i nie są w żaden sposób sprawdzane.
using (WcfBlip.Blip blip = new WcfBlip.Blip(“uzytkownik”, “haslo”)) // logujemy się
{
Updates[] updates = blip.Api.GetUpdates(); // pobiera ostatnie statusy użytkownika
Updates[] updates2 = blip.Api.GetUpdates(“10″, “5″); // pobiera 10 ostatnich statusów zaczynając od 5
User user = blip.Api.GetUser(“jack”); // pobiera dane nt. użytkownika “jack”
}
Trochę więcej przykładów znajduje się WcfBlipTest
Choć według opisu API jest podział na update’y, statusy, prywatne wiadomości i uwagi, to zdecydowałem się na jedną klasę Update, która to posiada właściwość Type, po której to można rozpoznawać typ wiadomości.
Do poprawki
- uzupełnić brakujące metody (upload obrazków, avatarów, backgroundów)
- dodać komentarze do kodu
- dodać do klas encji właściwości zwracające nazwy użytkowników (a nie jak teraz – tylko ich URL)
- wprowadzić obsługę błędów (na razie nie ma żadnej)
Licencja
MIT
Wszelkie komentarze i uwagi mile widziane :-)
P.S. W najbliższym czasie postaram się napisać o tworzeniu klientów REST w .Necie za pomocą WCF.
Na Onecie pojawił się wywiad ze Stallmanem, który to ostatnio wpadł do Krakowa (mam nadzieje, że nie spotkał brytyjskich turystów). Mało kto z “branży” go nie zna i wiele już toczono bitew od wyższości jego idei nad innymi. Nie o to mi jednak chodzi. Zastanawia mnie, czy stwierdzenia takie jak “Cloud computing to głupota” albo to, które pojawiło się w wywiadzie, że “Nie mam ani jednej komórki. Nie pozwolę Wielkiemu Bratu, by mnie śledził” nie są lekką przesadą? Każdy postęp i wygoda użytkowania ciągnie za sobą jakieś zagrożenia. Będę korzystał z produktów Google oraz innych serwisów udostępniających mi niezbędne usługi, nawet kosztem własnej prywatności, bowiem nie widzę sensu wywarzania tych samych drzwi. A to, że otwarcie tych drzwi może coś kosztować, to już inna sprawa.
Wordpressowy sidebar bardzo mi się podoba – nie muszę grzebać w kodzie, by coś poprzesuwać, zmieniać. Jednak zanim napiszesz własny prosty widget, pamiętaj, jest jeden mały “myk” ;-) W dokumentacji Widget API napisano, że aby zarejestrować nowy widget należy wywołać (np. w pluginie) register_sidebar_widget(). Szkoda tylko, że ktoś nie wspomniał o tym, że w najnowszych wersjach WP (bodajże od 2.5.x) ta funkcja dołączana jest przez core Wordpressa później niż plugin w związku z tym otrzymujemy piękny komunikat:
Call to undefined function: register_sidebar_widget
“Szybkie” rozwiązanie zostało przedstawione w tym poście, chociaż wydaję mi się trochę błędne, stąd też sadzę, że ten kod jest lepszy:
function widget_becool ($args) {
echo $args['before_widget'];
echo $args['before_title'];
echo ‘Becool!’;
echo $args['after_title'];
// sth
echo $args['after_widget'];
}
function widget_init_becool() {
register_sidebar_widget( ‘Becool’, ‘widget_becool’ );
}
add_action(‘widgets_init’, ‘widget_init_becool’);
Można użyć create_function(), ale myślę, że tak jest czytelniej :-)

