Расширенное тестирование соединения с помощью cURL
Теперь, когда вы понимаете базовое тестирование соединения, давайте рассмотрим более продвинутые функции cURL, которые могут помочь в детальной диагностике и тестировании.
Использование подробного режима для детальной отладки
Подробный режим (опция -v) неоценим для устранения проблем с подключением, поскольку он показывает весь процесс запроса и ответа:
curl -v https://example.com
Вывод будет исчерпывающим, показывая разрешение DNS, рукопожатие TLS, заголовки запроса, заголовки ответа и многое другое:
* Trying 93.184.216.34:443...
* Connected to example.com (93.184.216.34) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
* Server certificate:
* subject: C=US; ST=California; L=Los Angeles; O=Internet Corporation for Assigned Names and Numbers; CN=www.example.org
* start date: Nov 24 00:00:00 2022 GMT
* expire date: Nov 24 23:59:59 2023 GMT
* subjectAltName: host "example.com" matched cert's "example.com"
* issuer: C=US; O=DigiCert Inc; CN=DigiCert TLS RSA SHA256 2020 CA1
* SSL certificate verify ok.
* using HTTP/2
* h2 [:method: GET]
* h2 [:path: /]
* h2 [:scheme: https]
* h2 [:authority: example.com]
* h2 [user-agent: curl/7.81.0]
* h2 [accept: */*]
* Using Stream ID: 1
> GET / HTTP/2
> Host: example.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200
< age: 587269
< cache-control: max-age=604800
< content-type: text/html; charset=UTF-8
< date: Tue, 28 Mar 2023 12:40:01 GMT
< etag: "3147526947+ident"
< expires: Tue, 04 Apr 2023 12:40:01 GMT
< last-modified: Thu, 17 Oct 2019 07:18:26 GMT
< server: ECS (nyb/1D2B)
< vary: Accept-Encoding
< x-cache: HIT
< content-length: 1256
<
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<!-- More HTML content -->
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents...</p>
<!-- More content -->
</div>
</body>
</html>
* Connection #0 to host example.com left intact
Этот подробный вывод помогает вам определить, где именно может произойти сбой соединения.
Тестирование различных методов HTTP
Давайте протестируем POST-запрос к тестовой конечной точке API:
curl -X POST -d "name=test&email=test@example.com" https://httpbin.org/post
Эта команда:
-X POST: Указывает POST-запрос
-d "name=test&email=test@example.com": Отправляет данные формы в запросе
Вы должны получить JSON-ответ, показывающий отправленные вами данные:
{
"args": {},
"data": "",
"files": {},
"form": {
"email": "test@example.com",
"name": "test"
},
"headers": {
"Accept": "*/*",
"Content-Length": "32",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "curl/7.81.0",
"X-Amzn-Trace-Id": "Root=1-642295b1-0d2340ef34f2e8ea6270241a"
},
"json": null,
"origin": "198.51.100.42",
"url": "https://httpbin.org/post"
}
Тестирование с пользовательскими заголовками
Многие API требуют определенных заголовков для аутентификации или для указания типа контента. Давайте протестируем это:
curl -H "User-Agent: MyCustomAgent" -H "Authorization: Bearer test-token" https://httpbin.org/headers
Эта команда:
-H "User-Agent: MyCustomAgent": Устанавливает пользовательский заголовок User-Agent
-H "Authorization: Bearer test-token": Устанавливает заголовок Authorization
Ответ покажет заголовки, отправленные в вашем запросе:
{
"headers": {
"Accept": "*/*",
"Authorization": "Bearer test-token",
"Host": "httpbin.org",
"User-Agent": "MyCustomAgent",
"X-Amzn-Trace-Id": "Root=1-642295c3-73cac0a73b34b1c93a8ce520"
}
}
Тестирование времени отклика для разных конечных точек
Давайте создадим скрипт для сравнения времени отклика для разных серверов:
nano response_time.sh
Добавьте следующее содержимое:
#!/bin/bash
echo "Testing response times..."
for site in google.com bing.com baidu.com duckduckgo.com yahoo.com; do
echo -n "$site: "
curl -s -o /dev/null -w "%{time_total}s" "https://$site"
echo ""
done
echo "Testing complete!"
Сохраните файл и сделайте его исполняемым:
chmod +x response_time.sh
Запустите скрипт:
./response_time.sh
Вывод покажет время отклика для каждого сайта:
Testing response times...
google.com: 0.187s
bing.com: 0.232s
baidu.com: 0.412s
duckduckgo.com: 0.298s
yahoo.com: 0.342s
Testing complete!
Это полезно для сравнения производительности разных серверов или мониторинга производительности сервера с течением времени.
Тестирование TCP-соединения к определенным портам
Иногда вам нужно проверить, открыт ли определенный порт на сервере. cURL также можно использовать для этого:
curl -v telnet://example.com:80
Если порт открыт, вы увидите сообщение об успешном соединении:
* Trying 93.184.216.34:80...
* Connected to example.com (93.184.216.34) port 80 (#0)
Нажмите Ctrl+C, чтобы завершить соединение.
Аналогично, вы можете протестировать безопасные соединения:
curl -v https://example.com:443
Подробный вывод покажет, было ли соединение успешным или возникли какие-либо проблемы.