Tematyka zajęć 4

Przesyłanie danych w Internecie

  1. JSON
  2. JSON-RPC
  3. REST
  4. cURL
  5. JQ
  6. Architektura klient - serwer
  7. Sieci P2P

Przebieg zajęć

  1. Wprowadzenie do tematyki zajęć, udostępnienie materiałów dydaktycznych.
  2. Omówienie architektury klient - serwer i stylu architektury REST
  3. Omówienie URL
  4. Krótkie omówienie biblioteki cURL i JQ
  5. Wysyłanie żądania przez cURL do API poznan.pl
  6. Wysyłanie żądania przez cURL do API openweathermap.org z użyciem biblioteki JQ.

Materiały do zajęć

Zadania do realizacji na zajęciach

Zadanie 1 - cURL / JSON

  1. Wyślij żądanie cURL do strony http://jsonplaceholder.typicode.com/posts/1. Jak wygląda otrzymanny wynik? Czym różni się od danych w (znanym ze wstępu do informatyki) formacie XML?

    $ curl 'http://jsonplaceholder.typicode.com/posts/1'

Zadanie 2 - cURL / JSON /XML

  1. Przyjrzyj się API strony poznan.pl

    http://www.poznan.pl/api/
  2. Za pomocą narzędzia cURL uzyskaj z API strony poznan.pl informację o wydarzeniach w formacie XML.

    $ curl 'http://www.poznan.pl/mim/public/ws-information/?co=getCurrentDayEvents'
  3. Za pomocą narzędzia cURL uzyskaj z API strony poznan.pl spis ulic w formacie JSON

    $ curl 'http://www.poznan.pl/featureserver/featureserver.cgi/ulice/all.json'
  4. Ogranicz poprzednie wywołanie do 100 pierwszych ulic

    $ curl 'http://www.poznan.pl/featureserver/featureserver.cgi/ulice/all.json?maxFeatures=100'

    Jeśli chcesz zobaczyć zwrócony JSON ze 100 ulicami w Poznaniu w bardziej czytelnej formie, możesz użyć polecenia jq:

    $ curl 'http://www.poznan.pl/featureserver/featureserver.cgi/ulice/all.json?maxFeatures=100' | jq
  5. Program jq to potężne narzędzie, można go użyć do przeszukiwania i filtrowania danych w formacie JSON. Przykładowo lista nazw ulic może zostać zbudowana w następujący sposób

    $ curl 'http://www.poznan.pl/featureserver/featureserver.cgi/ulice/all.json' | jq '.features[].properties.a3'

Zadanie 3 - cURL & JQ

  1. Przejrzyj API na stronie

    https://openweathermap.org/api

    Jakie dane i w jakim formacie możesz na tej stronie uzyskać?

  2. Zarejestruj się na stronie

    https://openweathermap.org/api

    Pobierz prywatny klucz.

  3. Za pomocą narzędzia cURL uzyskaj ze strony https://openweathermap.org/ pogodę w mieście o pierwszej literze takiej, jak pierwsza litera Twojego nazwiska.

Zadania zaliczeniowe

Podstawowe

Zadania podstawowe sprawdzane są automatycznie, stąd ważne jest wysłanie na odpowiedni adres i zachowanie wskazanego formatu.

Wyniki zadań dostępne są w pliku tekstowym pod adresem http://kino.vm.wmi.amu.edu.pl/dtin/######.txt, gdzie ###### to sześciocyfrowy numer indeksu.

Zadanie 4.1 - Faktoryzacja numeru indeksu (1p.)

Wyślij na http://kino.vm.wmi.amu.edu.pl:6080/dtin/z4.1/######, gdzie ###### to sześciocyfrowy numer indeksu, żądanie PUT zawierające w treści plik JSON, dla którego poniższe zapytanie jq zwróci sumę czynników pierwszych numeru indeksu (przykładowo dla liczby \(60=2\cdot 2\cdot 3\cdot 5\), wynikiem powinno byc 12):

[.factors[].value] | add

Nie zapomnij ustalić poprawnego nagłówka Content-Type.

Zadanie 4.2 i 4.3 - Filtry jq (4p.)

Wyślij na http://kino.vm.wmi.amu.edu.pl:6080/dtin/z4.2/###### lub http://kino.vm.wmi.amu.edu.pl:6080/dtin/z4.3/######, gdzie ###### to sześciocyfrowy numer indeksu, żądanie POST zawierające w treści filtr jq, który dla zadanych plików zwróci odpowiednie odpowiedzi.

Opis struktury pliku

Wejściowy plik JSON przedstawia historię pewnych zdarzeń (block) i historię wartości pewnego parametru (hashrate). Jego ogólna struktura jest następująca:

{
   "blockHistory": [1519739287, 1519739455, 1519739710 ...],
   "hashrateHistory": [
      {
         "hr": 105355000000,
         "time": 1519739200
      },
      {
         "hr":104900000000,
         "time":1519739600
      }
      ...
   ]
}

Zarówno wartości w tablicy blockHistory jak i atrybutu time podawane są jako czas uniksowy, tj. jako liczbę sekund od początku 1970 roku.

Plik testowy

Zadanie będzie sprawdzane na następującym pliku.

Oczekiwany wynik działania filtra:

Zadanie 4.2 - Manipulowanie obiektami (2p.)

Dla pliku wejściowego chcemy uzyskać wspólną historię wartości hashrate i bloków posortowaną chronologicznie. Plik wynikowy ma mieć następujacą strukturę:

[
   {
      "time": 1519739200,
      "type": "hr",
   },
   {
      "time": 1519739287,
      "type": "block"
   },
   {
      "time": 1519739455,
      "type": "block"
   },
   {
      "time": 1519739600,
      "type": "hr"
   },
   {
      "time": 1519739710,
      "type": "block",
   },
   ...
]

Zadanie 4.3 - Zaawansowane jq - zmienne i funkcje (2p.)

Dla pliku wejściowego chcemy uzyskać informację o wartości parametru hashrate odnotowanej bezpośrednio przed każdym zdarzeniem, posortowaną chronologicznie. Plik wynikowy ma mieć następujacą strukturę:

[
   {
      "lastHr": 105355000000,
      "time": 1519739287
   },
   {
      "lastHr": 105355000000,
      "time": 1519739455
   },
   {
      "lastHr": 104900000000,
      "time": 1519739710
   },
   ...
]
Wskazówki
  • Wykorzystaj mechanizm zmiennych do przechwycenia głównego strumienia w celu wykorzystania go w różnych miejscach filtra.
  • Utwórz funkcję, odpowiedzialną za wyliczanie wartości hashrate przy zadanym czasie i wykorzystaj ją podczas tworzenia strumienia wynikowego.
  • Wykorzystaj parametr -f aby zapisać filtr w osobnym pliku. Znacząco ułatwi Ci to przygotowanie rozwiązania.

Dodatkowe

Zadanie D 4 - Web crawler (5p.)

Napisz prostego Robota internetowego (ang. Web Crawler), który dla zadanej strony tematu na Wikipedii, wyświetli listę wszystkich tematów z sekcji See also. Przeszukiwanie ma być wykonywane rekurencyjnie.

Przykładowo dla hasła https://en.wikipedia.org/wiki/Online_chat, oprócz tematów bezpośrednio zawartych w See also takich jak: https://en.wikipedia.org/wiki/Chat_room czy https://en.wikipedia.org/wiki/Instant_messaging w wynikach powinny znaleźć się też tematy See also tych tematów (i tak dalej) przykładowo: https://en.wikipedia.org/wiki/Social_media czy https://en.wikipedia.org/wiki/Media_psychology.