curl - отличный инструмент, который позволяет создавать сетевые запросы из командной строки.
curl - это инструмент командной строки, который позволяет передавать данные по сети.
Он поддерживает множество протоколов "из коробки", включая HTTP, HTTPS, FTP, FTPS, SFTP, IMAP, SMTP, POP3 и многие другие.
Когда дело доходит до отладки сетевых запросов, curl - один из лучших инструментов, которые вы можете найти.
Это один из тех инструментов, к которому, как только знаешь, как пользоваться, всегда возвращаешься. Лучший друг программиста.
Он универсален, работает на Linux, Mac, Windows. Обратитесь кофициальное руководство по установкечтобы установить его в вашей системе.
Интересный факт: автор и сопровождающий curl, шведский, был награжден королем Швеции за вклад, который его работа (curl и libcurl) внесла в компьютерный мир.
Давайте погрузимся в некоторые команды и операции, которые вы, скорее всего, захотите выполнять при работе с HTTP-запросами.
Эти примеры включают работу с HTTP, самым популярным протоколом.
- Выполните HTTP-запрос GET
- Получить заголовки ответа HTTP
- Получить только заголовки ответа HTTP
- Выполните запрос HTTP POST
- Выполните HTTP-запрос POST, отправив JSON
- Выполните запрос HTTP PUT
- Следуйте перенаправлению
- Сохранить ответ в файл
- Использование HTTP-аутентификации
- Установить другой пользовательский агент
- Проверка всех деталей запроса и ответа
- Копирование любого сетевого запроса браузера в команду curl
Выполните HTTP-запрос GET
Когда вы выполняете запрос, curl вернет тело ответа:
curl https://flaviocopes.com/
Получить заголовки ответа HTTP
По умолчанию заголовки ответов скрыты в выводе curl. Чтобы показать их, используйтеi
вариант:
curl -i https://flaviocopes.com/
Получить только заголовки ответа HTTP
С использованиемI
вариант, вы можете получитьТолькозаголовки, а не тело ответа:
curl -I https://flaviocopes.com/
Выполните запрос HTTP POST
ВX
опция позволяет вам изменить используемый HTTP-метод. По умолчанию используется GET, и это то же самое, что и запись
curl -X GET https://flaviocopes.com/
С помощью-X POST
выполнит запрос POST.
Вы можете выполнить запрос POST, передав URL-адрес данных в кодировке:
curl -d "option=value&something=anothervalue" -X POST https://flaviocopes.com/
В этом случаеapplication/x-www-form-urlencoded
Content-Type отправлен.
Выполните HTTP-запрос POST, отправив JSON
Вместо публикации данных в кодировке URL, как в приведенном выше примере, вы можете отправить JSON.
В этом случае вам нужно явно установить заголовок Content-Type, используяH
вариант:
curl -d '{"option": "value", "something": "anothervalue"}' -H "Content-Type: application/json" -X POST https://flaviocopes.com/
Вы также можете отправить файл JSON со своего диска:
curl -d "@my-file.json" -X POST https://flaviocopes.com/
Выполните запрос HTTP PUT
Концепция такая же, как и для запросов POST, просто измените метод HTTP, используя-X PUT
Следуйте перенаправлению
Ответ перенаправления, например 301, который указываетLocation
заголовок ответа, может автоматически сопровождаться указаниемL
вариант:
curl http://flaviocopes.com/
не будет автоматически следовать за версией HTTPS, на которую я настроил перенаправление, но это будет:
curl -L http://flaviocopes.com/
Сохранить ответ в файл
С использованиемo
вариант, который вы можете указать curl, чтобы сохранить ответ в файл:
curl -o file.html https://flaviocopes.com/
Вы также можете просто сохранить файл по его имени на сервере, используяO
вариант:
curl -O https://flaviocopes.com/index.html
Использование HTTP-аутентификации
Если для ресурса требуется базовая HTTP-аутентификация, вы можете использоватьu
возможность передать значения user: password:
curl -u user:pass https://flaviocopes.com/
Установить другой пользовательский агент
Пользовательский агент сообщает серверу, какой клиент выполняет запрос. По умолчанию curl отправляетcurl/<version>
пользовательский агент, например:curl/7.54.0
.
Вы можете указать другой пользовательский агент, используя--user-agent
вариант:
curl --user-agent "my-user-agent" https://flaviocopes.com
Проверка всех деталей запроса и ответа
Использовать--verbose
возможность заставить curl выводить все детали запроса и ответа:
curl --verbose -I https://flaviocopes.com/
* Trying 178.128.202.129...
* TCP_NODELAY set
* Connected to flaviocopes.com (178.128.202.129) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate: flaviocopes.com
* Server certificate: Let's Encrypt Authority X3
* Server certificate: DST Root CA X3
> HEAD / HTTP/1.1
> Host: flaviocopes.com
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Cache-Control: public, max-age=0, must-revalidate
Cache-Control: public, max-age=0, must-revalidate
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8
< Date: Mon, 30 Jul 2018 08:08:41 GMT
Date: Mon, 30 Jul 2018 08:08:41 GMT
...Copying any browser network request to a curl command
When inspecting any network request using the Chrome Developer Tools, you have the option to copy that request to a curl request:

curl 'https://github.com/curl/curl' -H 'Connection: keep-alive' -H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'Upgrade-Insecure-Requests: 1' -H 'DNT: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Referer: https://www.google.it/' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: en-US,en;q=0.9,it;q=0.8' -H 'Cookie: _octo=GH1.1.933116459.1507545550; _ga=GA1.2.643383860.1507545550; tz=Europe%2FRome; user_session=XXXXX; __Host-user_session_same_site=YYYYYY; dotcom_user=flaviocopes; logged_in=yes; has_recent_activity=1; _gh_sess=ZZZZZZ' --compressed
More network tutorials:
- Introduction to WebSockets
- How HTTP requests work
- The HTTP Request Headers List
- The HTTP Response Headers List
- HTTP vs HTTPS
- What is an RFC?
- The HTTP protocol
- The HTTPS protocol
- The curl guide to HTTP requests
- Caching in HTTP
- The HTTP Status Codes List
- What is a CDN?
- The HTTP/2 protocol
- What is a port
- DNS, Domain Name System
- The TCP Protocol
- The UDP Protocol
- An introduction to REST APIs
- How to install a local SSL certificate in macOS
- How to generate a local SSL certificate
- How to configure Nginx for HTTPS
- A simple nginx reverse proxy for serving multiple Node.js apps from subfolders
- What is a reverse proxy?