Gdybym miała podać, krótką definicję czym jest curl, zapewne napisałabym coś takiego:
cURL (Client for URLs) to konsolowe narzędzie, do transferu (odbierania i nadawania) danych przez Internet z wykorzystaniem wielu protokołów.
Krótko i zwięźle ✨
Dzisiaj ciężko sobie wyobrazić świat komunikacji po API bez curl’a. Niemal każda dokumentacja API, z którą się spotykam, zawiera przykłady użycia właśnie za pomocą tej komendy.
Curl dostarcza ujednolicony, niezależny od języka programowania, sposób na zaprezentowanie żądań i odpowiedzi http. Jest wygodnym narzędziem konsolowym, które umożliwia łatwe wysyłanie requestów HTTP/HTTPS, otrzymywanie danych w różnych formatach, a także automatyzację naszej pracy poprzez skrypty.
Niezależnie od tego, czy dopiero zaczynasz swoją przygodę z IT, czy jesteś bardziej zaawansowanym użytkownikiem, nauka korzystania z curl może oszczędzić Ci mnóstwo czasu i wysiłku przy pracy z REST API.
Więc weź filiżankę kawy i zanurzmy się w podstawach curl! ☕
Szybki przewodnik po używaniu CURL do zapytań HTTP / REST API
Spis treści:
- curl GET
- curl POST
- curl PUT
- curl PATCH
- curl DELETE
- Odczyt danych zapytania z pliku
- Zapis odpowiedzi zapytania do pliku
Otwórzcie terminal (linux / mac) lub wiersz poleceń i możemy zaczynać
Windows 11:
curl jest już dostępny w waszym systemie.Windows 10: jeśli wersja win10 jest poniżej 1803 (Maj 2018) lub masz wcześniejszego windowsa należy zainstalować curl. Instalację znajdziecie na oficjalnej stronie (są dostępne wersje 32 i 64-bit)
Lub jeśli używasz Git for Windows (pobranego z git-scm.com) curl jest już zainstalowany pod ścieżką
C:\Program Files\Git\mingw64\bin\. Wystarczy go dodać pod ścieżkę do zmiennych systemowych PATH i zrestartować wiesz poleceń.GET request
Zapytania GET są najprostsze do wysłania. Jedyne co potrzebujemy to przekazać nasz URL jako argument komendy curl
curl https://api.restful-api.dev/objects
Dostaniemy odpowiedź:
[
{
"id": "1",
"name": "Google Pixel 6 Pro",
"data": {
"color": "Cloudy White",
"capacity": "128 GB"
}
},
{
"id": "2",
"name": "Apple iPhone 12 Mini, 256GB, Blue",
"data": null
} ...
]
Możemy użyć curl z -v (skrót od --verbose), aby włączyć tryb pełnego opisu i zobaczyć więcej szczegółów zapytania.
curl -v https://api.restful-api.dev/objects
Spróbujmy przejść do innej ścieżki (path params), aby otrzymać obiekt o id wartości 1
curl https://api.restful-api.dev/objects/1
Możemy też korzystać z parametrów zapytania (query params) np.
curl https://api.restful-api.dev/objects?id=3
Przykład:
Przetestujmy na prawdziwym przykładzie, skorzystajmy ze API portalu dev.to, aby pobrać artykuły wg autora (mój profil wygląda tak dev.to/ritaly, ale chcę pobrać tylko wpisy)
curl https://dev.to/api/articles?username=ritaly
Zapytania z wieloma parametrami
Jeśli chcemy przekazać wiele parametrów, musimy je oddzielić poprzez ampersand (& – podobno polska nazwa to „etka” 😉).
➜ Documentacja API dev.to: https://developers.forem.com/api/v1
Jeszcze raz spójrzmy na dev.to API – chcemy połączyć 3 parametry
tag: artykuły zawierające #devjournaltop: najpopularniejsze artykuły z 5 dniper_page: limit 5 artykułów na stronę
curl "https://dev.to/api/articles?tag=devjournal&top=5&per_page=5"
Musimy dodać cudzysłów wokół adresu URL, inaczej komenda zostałaby błędnie wykonana – ampersand zostanie odczytany jako koniec polecenia.
POST request
Otworzymy nowy obiekt z następującymi danymi jako body:
{
"name": "Apple MacBook Pro 16",
"data": {
"year": 2019,
"price": 2049.99,
"CPU model": "Intel Core i9",
"Hard disk size": "1 TB",
"color": "silver"
}
}
Wyślemy, curlem zapytanie POST:
curl -X POST https://api.restful-api.dev/objects \
-H 'Content-Type: application/json' \
-d '{"name":"Apple MacBook Pro 16","data":{"year":2019,"price":2049.99,"CPU model":"Intel Core i9","Hard disk size":"1 TB","color":"silver"}}'
W odpowiedzi zobaczymy utworzony nowy obiekt (skopiuj wartość jego id zachwilę nam się przyda).
Przyjrzyjmy się opcjom curl:
-X <METHOD>– określa metodę HTTP zapytania np. POST, PUT, PATCH, DELETE-H– przekazuje niestandardowy nagłówek (curl używaapplication/x-www-form-urlencodedjako domyślny nagłówek typuContent-Type, my zmieniliśmy go naJSON)-d– dane / „ciało” (body) zapytania, zwane też API payload, jak wskazaliśmy w Content-Type, nasze dane są w formacie JSON-i, (--include) – nagłówki odpowiedzi mają się znaleźć w wyniku zapytania
Jeżeli chcesz wysłać więcej niż jeden nagłówek, możesz użyć opcji -H więcej niż raz np. dla zapytania GET /objects
curl -i \
-H 'Connection: keep-alive' \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
-H 'Accept-Language: en-GB,en-US;q=0.8,en;q=0.6' \
https://api.restful-api.dev/objects
Wykonując je z -v możemy przyjrzeć się jakie headery zostały zastosowane:
> GET /objects HTTP/2 > Host: api.restful-api.dev > user-agent: curl/7.79.1 > connection: keep-alive > accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 > accept-language: en-GB,en-US;q=0.8,en;q=0.6
Curl domyślnie identyfikuje się jako curl, widzimy to w polu user-agent. Możemy jednak na potrzeby naszych testów przedstawić się jako przeglądarka.
Dodajmy opcję -A (--user-agent), żeby podmienić klienta użytkownika (user agent)
curl -v \
-H 'Connection: keep-alive' \
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
-H 'Accept-Language: en-GB,en-US;q=0.8,en;q=0.6' \
-A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' \
https://api.restful-api.dev/objects
Wynik:
> GET /objects HTTP/2 > Host: api.restful-api.dev > user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 > connection: keep-alive > accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 > accept-language: en-GB,en-US;q=0.8,en;q=0.6
PUT request
Metoda PUT powoduje aktualizację obiektu poprzez zastąpienie istniejącego obiektu nowym. Musimy podać id obiektu, który chcemy zaktualizować.
Wyślij zapytanie PUT, wklej w miejsce:id id swojego obiektu.
curl -X PUT https://api.restful-api.dev/objects/:id \
-H 'Content-Type: application/json' \
-d '{"name":"Apple MacBook Pro 16","data":{"year":2022,"price":2399.99,"CPU model":"M1","Hard disk size":"1 TB","color":"space grey"}}'
PATCH request
Metoda PATCH również służy do aktualizacji obiektu, ale poprzez zmodyfikowanie wybranych pól rekordu, a nie zastąpienie całości.
Wyślij zapytanie PATCH (zastąp :id własną wartością).
curl -X PATCH https://api.restful-api.dev/objects/:id \
-H 'Content-Type: application/json' \
-d '{"name":"Fruity name"}'
Sprawdź rekord po zmianach:
curl https://api.restful-api.dev/objects/:id
DELETE request
Czas usunąć obiekt za pomocą metody DELETE. Metoda ta nie wymaga podania payloadu, ale musimy przekazać :id obiektu:
curl -X DELETE https://api.restful-api.dev/objects/:id
Twój obiekt został usunięty
Odczyt danych zapytania z pliku
Możemy odczytać payload z pliku i wykorzystać go jako body zapytania w curl, korzystając z opcji -d @requestfile, gdzie poprzedzamy nazwę pliku lub ścieżkę do pliku znakiem @.
curl -X POST https://api.restful-api.dev/objects \
-d @request.json \
-H "Content-Type: application/json"
plik request.json (musi istnieć w tej samej lokalizacji, w której wykonujemy zapytanie):
{
"name": "Apple MacBook Pro 16",
"data": {
"year": 2019,
"price": 1849.99,
"CPU model": "Intel Core i9",
"Hard disk size": "1 TB"
}
}
Zapis odpowiedzi zapytania do pliku
Curl pozwala zapisać dane otrzymane w odpowiedzi zapytania, możemy użyć -o lub --output, po czym podać nazwę pliku.
curl https://api.restful-api.dev/objects -o response.json
Hurrrra! 🥳
Właśnie przeszliśmy podstawy korzystania z API za pomocą cURL i metod http.
Oczywiście możliwości jest znacznie więcej!
Ćwiczenia
Praktyka czyni mistrza, więc czym byłby tutorial bez zadań sprawdzających?
Zadanie 1
- Wykonaj zapytanie GET do JSONPlaceholder API. Zapoznaj się z dokumentacją i pobierz wszystkich użytkowników.
- Wykonaj zapytanie POST do API udostępniającego funkcjonalność tworzenia rekordu. Możesz ponownie użyć JSONPlaceholder API (
POST /posts). - Spróbuj wykonać żądanie PUT, aby zaktualizować istniejący zasób, użyj JSONPlaceholder API
posts/1.
Zadanie 2
Zapoznaj się z dokumentacją OpenWeatherMap API (zwróć uwagę, że musisz utworzyć darmowe konto, aby uzyskać swój klucz do API, później przekazywany w parametrze jako &appid={API key}).
- Wykonaj zapytanie GET do pogodowego API, aby pobrać dane dotyczące aktualnej prognozy pogody dla wybranego miasta (np. Poznań, Madryt, Londyn).
- Wykonaj zapytanie GET, które zwróci prognozę pogody 5-dniową dla Warszawy (zwróć uwagę, że możesz zapytanie wykonać na 2 sposoby podając długość i szerokość geograficzną, albo korzystając z wbudowanej opcji query params Built-in API request by city name).
Świetne! Krótkie, ale konkretne wprowadzenie do curla.
bardzo pomocne, dziękuję