Skip to main content
  • »
  • EODATA »
  • Używanie Pythona do wysyłania żądań do katalogu EODATA na NSIS

Używanie Pythona do wysyłania żądań do katalogu EODATA na NSIS

Ten artykuł zawiera przykłady wysyłania zapytań do katalogów EODATA opisanych w tym artykule Podręcznik API katalogu EOData na NSIS.

Adresy URL używane do wysyłania tych żądań mogą powodować problemy podczas korzystania na przykład z polecenia curl w Bashu. Na przykład następujący adres URL:

https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products?$filter=not contains(Name,'S2') and ContentDate/Start gt 2022-05-03T00:00:00.000Z and ContentDate/Start lt 2022-05-03T00:10:00.000Z

zawiera między innymi znak dolara, spacje i nawiasy. Muszą one być odpowiednio poprzedzone odwrotnym ukośnikiem i/lub zakodowane, aby upewnić się, że żądanie jest prawidłowe. Na przykład Bash może zinterpretować $filter jako zmienną $filter, gdy w rzeczywistości jest ona częścią adresu URL.

W tym artykule omawiamy ten problem poprzez:

  • wklejenie adresu URL do jednego pliku,

  • wklejenie treści żądania do innego pliku (w razie potrzeby),

  • utworzenie kolejnego pliku z kodem w języku Python

  • a następnie jego wykonanie.

Wymagania wstępne

Nr 1 Zainstalowane środowisko Python

Ten artykuł został napisany dla prostych środowisk Python działających w systemie Ubuntu 22.04 i Windows Server 2022. Inne systemy operacyjne (takie jak Windows 11) i środowiska (takie jak PyCharm) mogą również działać, ale wykracza to ą poza zakres tego artykułu.

Poniższe artykuły zawierają sekcje dotyczące instalacji środowiska Python:

Jeśli twój system to Ubuntu możesz też użyć virtualenvwrapper: Jak zainstalować Python virtualenv lub virtualenvwrapper na NSIS Cloud

Nr 2 Biblioteka Pythona o nazwie requests

Musisz zainstalować pakiet Pythona o nazwie requests. Można to zrobić za pomocą narzędzia pip:

pip install requests

W systemie Ubuntu 22.04 można również zainstalować tę bibliotekę globalnie za pomocą narzędzia apt:

sudo apt install python3-requests

Co zostanie omówione?

  • Wysyłanie żądań GET

  • Wysyłanie żądań POST

Wysyłanie żądań GET

Większość linków znalezionych w instrukcjach API to żądania GET, które nie mają żadnej treści.

Utwórz skrypt o nazwie send_get.py i wprowadź do niego następującą treść:

Wyślij zapytanie GET do serwera
import requests
from requests.utils import requote_uri
# Open URL from file
url = open('link1.txt').read()
# Encode URL
url_encoded = requote_uri(url)
# Remove unnecessasary characters from encoded URL
url_encoded_cleared = url_encoded.replace('%0A', '')
# Obtain and print the response
response = requests.get(url_encoded_cleared)
print(response.json())

Utwórz plik o nazwie link1.txt w tym samym katalogu co skrypt send_get.py, który zawiera link, do którego chcesz uzyskać dostęp. W tym pliku może być tylko jeden adres URL.

Za pomocą terminala przejdź do katalogu, w którym znajduje się skrypt i plik link1.txt i uruchom skrypt:

python3 send_get.py

Dane wyjściowe powinny zawierać odpowiedzi z API Katalogu.

Przykład 1: OData API

Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):

https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products?$filter=contains(Name,'S1A') and ContentDate/Start gt 2022-05-03T00:00:00.000Z and ContentDate/Start lt 2022-05-21T00:00:00.000Z

Ten link wyszukuje produkty, które:

  • zawierają w swojej nazwie frazę S1A, oraz

  • mają datę rozpoczęcia wykrywania późniejszą niż 2022-05-03T00:00:00.000Z i wcześniejszą niż 2022-05-21T00:00:00.000Z.

Powinno to zwrócić 20 najlepszych wyników.

Wykonaj skrypt. W tym przykładzie użyto terminala GNOME i gedit w systemie Ubuntu 22.04. Zwróć uwagę, że gedit opisuje ten kod jako Python 2, mimo że w rzeczywistości jest używany Python 3.

../_images/using-python-eodata-catalogue-requests-01_nsis_pl.png

Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.

Przykład 2: Usunięte produkty ODATA API

Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):

https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/DeletedProducts?$filter=not contains(Name,'S1') and DeletionDate gt 2023-04-01T00:00:00.000Z and DeletionDate lt 2023-05-30T23:59:59.999Z&$orderby=DeletionDate

Ten link wyszukuje usunięte produkty, które:

  • mają nazwę, która nie zawiera frazy S1, oraz

  • mają datę usunięcia ustawioną na późniejszą niż 2023-04-01T00:00:00.000Z i wcześniejszą niż 2023-05-30T23:59:59.999Z.

Wyniki są sortowane według daty usunięcia. Powinno zostać zwrócone 20 najlepszych wyników.

Wykonaj skrypt:

../_images/using-python-eodata-catalogue-requests-02_nsis_pl.png

Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.

Przykład 3: API OpenSearch

Wprowadź poniższy link do pliku link1.txt (należy pamiętać, że ten plik musi zawierać dokładnie jeden adres URL):

https://catalogue.nsiscloud.polsa.gov.pl/resto/api/collections/Sentinel2/search.json?startDate=2021-07-01&completionDate=2021-07-31

Ten link wyszukuje produkty Sentinel-2, które mają 2021-07-01 i 2021-07-31 jako odpowiednio początkową i końcową datę obserwacji.

Wykonaj skrypt:

../_images/using-python-eodata-catalogue-requests-03_nsis_pl.png

Powyższy zrzut ekranu zawiera tylko początek odpowiedzi.

Wysyłanie żądań POST

Utwórz plik o nazwie send_post.py i wprowadź do niego następujący kod:

Wyślij zapytanie POST do serwera
import requests
import json
from requests.utils import requote_uri
# Open URL from file
url = open('link2.txt').read()
# Open body from file and convert it to JSON object
query = open('body.json')
body = json.load(query)
# Encode URL
url_encoded = requote_uri(url)
# Remove unnecessasary characters from encoded URL
url_encoded_cleared = url_encoded.replace('%0A', '')
# Obtain and print the response
response = requests.post(url_encoded_cleared, json=body)
print(response.json())

Przedstawiony powyżej skrypt działa podobnie jak skrypt przedstawiony w poprzedniej sekcji.

Adres URL powinien jednak tym razem zostać umieszczony w pliku link2.txt, a nie link1.txt.

Treść żądania należy umieścić w pliku body.json.

Wszystkie pliki wymienione w tej sekcji powinny znajdować się w tym samym katalogu.

Przejdź do tego katalogu za pomocą terminala i uruchom kod w języku Python:

python3 send_post.py

Dane wyjściowe powinny zawierać odpowiedzi z API Katalogu.

Przykład: OData API

Użyjmy linku z sekcji ** Zapytanie według listy** z artykułu

/eodata/OData-API-Manual-for-NSIS-CloudEODATA-Catalogue

aby wyszukiwać wiele nazw produktów jednocześnie:

https://catalogue.nsiscloud.polsa.gov.pl/odata/v1/Products/OData.CSC.FilterList

Umieść ten link w pliku link2.txt.

Umieść treść znalezioną w tym artykule w pliku body.json:

{
    "FilterProducts":
    [
        {"Name": "S1A_IW_GRDH_1SDV_20141031T161924_20141031T161949_003076_003856_634E.SAFE"},
        {"Name": "S3B_SL_1_RBT____20190116T050535_20190116T050835_20190117T125958_0179_021_048_0000_LN2_O_NT_003.SEN3"},
        {"Name": "xxxxxxxx.06.tar"}
    ]
}

Wykonaj skrypt:

../_images/using-python-eodata-catalogue-requests-04_nsis_pl.png