python_640x400
Programmer's notes

Zapytania HTTP w Pythonie

0 334

Python posiada bibliotekę urllib2 do wykonywania zapytań HTTP, HTTPS, FTP. Dzięki niej łatwo możemy pobrać zawartość strony www czy plik z jakiegoś serwera. W poprzednim poście (“Simple.Data.SqlServer na hostingu Webio“) stworzyłem proste Web Api, które zwraca listę obiektów klasy Event z serwera. W celu jej pobrania wystarczy wywołać metodę urlopen():

Możemy użyć bezpośrednio URLa lub stworzyć obiekt Request, który umożliwi także ustawianie nagłówków żądania. W tym przykładzie chcę dostać od serwera odpowiedź w formacie XML a nie JSON.

Pobrana odpowiedź z serwera jest stringiem, przydałoby się zamienić ją na jakiś bardziej przydatny typ danych. Zacznijmy od stworzenia klasy Event. Konstruktor klasy w Pythonie nazywa sie “__init__” i przyjmuje parametr “self“, dzięki któremu możemy stworzyć property klasy i zainicjować je na odpowiednie dane przekazane przy tworzeniu obiektu.

Nie można łączyć ze sobą stringów i intów. Należy najpierw zamienić int na string. Stąd: str(ev.Id)

Następnie należy zrobić deserializację stringa do obiektów naszej nowej klasy. Wiemy, że z serwera dostaniemy listę obiektów typu Event w jednym stringu w formacie JSON. Niestety nie udało mi się znaleźć biblioteki pokroju Json.NET od Newtonsoft. Także napiszemy własnego, skrojonego na miarę “Json to Event” parsera opartego na wyrażeniach regularnych:

Trochę nie podoba mi się zabawa ze stringami i wyrażeniami regularnymi. Jeżeli ktoś z czytelników zna fajną bibliotekę Pythona deserializującą JSONa do obiektów danej klasy, proszę o komentarz :)

Powyższy kod pozostawia wiele do życzenia, co z kolei daje miejsce do poprawy w kolejnych wpisach :)

Skoro już potrafimy pobrać listę zdarzeń z Web Api należałoby teraz wysłać nowe i dodać do kolekcji na serwerze. W tym celu również posłużymy się biblioteką urllib2 i metodą urlopen. Metoda ta, jako pierwszy parametr przyjmuje URL lub obiekt Request określający docelowy endpoint, do którego się łączy. Jako drugi parametr może przyjąć dane. Jeżeli przekażemy do tej metody dane, to automatycznie zostanie wysłane zapytanie POST (zamiast GET jak w poprzednich przypadkach). Dane muszą być w formacie ‘application/x-www-form-urlencoded‘.

Ten dziwny format danych wysłanych w requeście spowodowany jest sposobem w jaki budowane są obiekty C# w Web Api. Kontroler spodziewa się listy obiektów typu Event, nazwa tego property to właśnie “Events“, czyli przesyłamy tablicę i pierwszy element (stąd indeks 0) bindujemy do obiektu Event a jego property “Name” ustawiamy na “TestURLLIB2″.

A chcąc przekazać dwa zdarzenia ustawiamy dwa pierwsze elementy tablicy

Dzięki tym kilku ćwiczeniom znamy już proste zapytania HTTP: pobieranie danych za pomocą GET i wysyłanie za pomocą POST. W tym momencie to w zupełności wystarczy aby przejść dalej w ramach projektu Smart Lodówka i przymierzyć się do wysyłania zdarzeń ze świata rzeczywistego. Zacznę od dwóch podstawowych typów zdarzeń: Otwarcie i Zamknięcie drzwi lodówki.

C.

Leave a Reply

DEV

Around Dev

My way of seeing

%d bloggers like this: