Javascript curl: Что JavaScript-разработчику следует знать о Curl / Хабр

Содержание

Что JavaScript-разработчику следует знать о Curl / Хабр

Доброго времени суток, друзья!

Представляю Вашему вниманию перевод статьи «What JavaScript Developers Should Know About Curl» автора Valery Karpov.

Curl — это популярный инструмент командной строки, часто используемый для отправки HTTP-запросов. Curl поддерживает большое количество протоколов, однако как Node.js-разработчик вы, скорее всего, будете использовать его для отпраки http-запросов к RESTful API.

Документация curl представляет собой перечень из 383 флагов командной строки, поэтому в ней очень трудно найти то, что ищешь. В этой статье я хочу поделиться с вами некоторыми часто используемыми мной шаблонами. Для примеров будет использоваться сервис httpbin.org.

Отправка http-запроса


Для начала убедитесь в том, что у вас установлен curl, выполнив команду curl --version.

$ curl --version
curl 7. 58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.1 zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL 


Для отправки запроса необходимо запустить curl url. Например, для отправки GET-запроса к https://httpbin.org/get?answer=42 следует запустить curl https://httpbin.org/get?answer=42.

$ curl https://httpbin.org/get?answer=42
{
  "args": {
    "answer": "42"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8d737-b39c6a466892725bbb52b916"
  }, 
  "origin": "69.84.111.39", 
  "url": "https://httpbin.org/get?answer=42"
}


После успешного завершения запроса curl возвращает тело http-ответа. Для того, чтобы заставить curl вернуть весь ответ, включая заголовки, используйте флаг -i.

$ curl -i https://httpbin.org/get?answer=42
HTTP/2 200 
date: Tue, 16 Jun 2020 14:30:57 GMT
content-type: application/json
content-length: 801
server: istio-envoy
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 2
{
  "args": {
    "answer": "42"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "0", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8d7a1-cb3954c09299eb9e0dff70a6", 
    "X-B3-Parentspanid": "dffc55451e64b5fc", 
    "X-B3-Sampled": "0", 
    "X-B3-Spanid": "8e233a863fb18b6c", 
    "X-B3-Traceid": "45bd12a9067fb5c0dffc55451e64b5fc", 
    "X-Envoy-External-Address": "10.100.91.201", 
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=c1ff14671b3e24ee794f9a486570abf8ccc9d622846611d3f91a322db4d480cd;Subject=\"\";URI=spiffe://cluster. local/ns/istio-system/sa/istio-ingressgateway-service-account"
  }, 
  "origin": "69.84.111.39,10.100.91.201", 
  "url": "http://httpbin.org/get?answer=42"
}


Это полный http-ответ. Заголовками ответа являются строки от date: до x-envoy-upstream-service-time:.

Загрузка файлов

Wget — самый распространенный инструмент для загрузки файлов посредством командной строки. Он входит в комплект большинства диструбутивов Linux. Однако в OSX его нет.

Команда wget url аналогична команде curl -OL url. Опция — это опция --remote-name, которая говорит curl сохранить тело ответа в локальном файле. Опция -L говорит curl следовать перенаправлениям.

Например, ниже представлено изображение с Unsplash, его URL — https://images.unsplash.com/photo-1506812574058-fc75fa93fead.

Для загрузки этого изобюражения необходимо выполнить следующее:

$ curl -OL https://images. unsplash.com/photo-1506812574058-fc75fa93fead
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12.1M  100 12.1M    0     0  3927k      0  0:00:03  0:00:03 --:--:-- 3927k


Опция -O говорит curl использовать строку после последнего / в качестве имени файла. В приведенном примере изображение будет сохранено в текущей директории с именем photo-1506812574058-fc75fa93fead. Для определения имени файла используйте опцию (строчная буква «о»).

$ curl -o miami-beach.jpg https://images.unsplash.com/photo-1506812574058-fc75fa93fead
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12.1M  100 12.1M    0     0  6083k      0  0:00:02  0:00:02 --:--:-- 6083k
$ ls -l miami-beach-jpg
-rw-rw-r-- 1 val val 12788445 Jun 16 11:03 miami-beach. jpg

Отправка авторизованного запроса


Заголовок авторизации используется для включения в запрос данных для авторизации при обращении к RESTful API. Для добавления указанных данных необходимо использовать флаг -H. Например, если ваш ключ интерфейса (API key) my-secret-token, вы можете включить его в http-запрос следующим образом:

$ curl -H "Authorization: my-secret-token" https://httpbin.org/get
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Authorization": "my-secret-token", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8e1a5-a3aa30e0765a7980b04ca4a0"
  }, 
  "origin": "69.84.111.39", 
  "url": "https://httpbin.org/get"
}


Обратите внимание, что httpbin.org возвращает заголовки http-запроса в теле ответа в свойстве headers.

Curl также поддерживает авторизацию по-умолчанию посредством флага -u. В следующем примере мы отправляем запрос с именем пользователя user и паролем pass:

$ curl -i -u "user:pass" https://httpbin.org/basic-auth/user/pass
HTTP/2 200 
date: Tue, 16 Jun 2020 15:18:45 GMT
content-type: application/json
content-length: 47
server: istio-envoy
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 1
{
  "authenticated": true, 
  "user": "user"
}


Вот что происходит при отправке неправильного имени пользователя или пароля:

$ curl -i -u "user:wrongpass" https://httpbin.org/basic-auth/user/pass
HTTP/2 401 
date: Tue, 16 Jun 2020 15:18:51 GMT
content-length: 0
server: istio-envoy
www-authenticate: Basic realm="Fake Realm"
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 12

Отправка POST-запроса, содержащего JSON


Флаг -X говорит curl, какой метод следует использовать: PUT, POST и т. д. По-умолчанию curl использует метод GET, поэтому писать curl -X GET не нужно.

Флаг -X часто используется совместно с флагом -d, позволяющим добавить тело запроса. В следующем примере показано как отправить POST-запрос, содержащий некоторый json:

$ curl -X POST -d '{"answer":42}' https://httpbin.org/post
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "{\"answer\":42}": ""
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "13", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8e3fd-8437029087be44707bd15320", 
    "X-B3-Parentspanid": "2a739cfc42d28236", 
    "X-B3-Sampled": "0", 
    "X-B3-Spanid": "8bdf030613bb9c8d", 
    "X-B3-Traceid": "75d84f317abad5232a739cfc42d28236", 
    "X-Envoy-External-Address": "10.100.91.201", 
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=ea8c3d70befa0d73aa0f07fdb74ec4700d42a72889a04630741193548f1a7ae1;Subject=\"\";URI=spiffe://cluster. local/ns/istio-system/sa/istio-ingressgateway-service-account"
  }, 
  "json": null, 
  "origin": "69.84.111.39,10.100.91.201", 
  "url": "http://httpbin.org/post"
}


Обратите внимание, что по-умолчанию значением заголовка Content-Type является application/x-www-form-urlencoded. Для json это является неверным, поэтому для определения Content-Type следует использовать флаг -H:

$ curl -X POST -d '{"answer":42}' -H "Content-Type: application/json" https://httpbin.org/post
{
  "args": {}, 
  "data": "{\"answer\":42}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "13", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8e45e-ad875af4f83efd4379b86c34", 
    "X-B3-Parentspanid": "5f4f33d1c5ea13aa", 
    "X-B3-Sampled": "0", 
    "X-B3-Spanid": "a062c9bf2ebfd4bd", 
    "X-B3-Traceid": "44aa8d62412ae34d5f4f33d1c5ea13aa", 
    "X-Envoy-External-Address": "10. 100.86.47", 
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=2f0b3331fe4d512975b4b82583a55dd5d1196023d0dfce9e0abed246991c5b67;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
  }, 
  "json": {
    "answer": 42
  }, 
  "origin": "69.84.111.39,10.100.86.47", 
  "url": "http://httpbin.org/post"
}

Отправка PUT-запроса, содержащего JSON-файл


Флаг -d также поддерживает отправку данных из локальных файлов.

Например, представим, что у нас есть файл data.js, содержащий такие данные:

{"answer": 42}


Для отправки PUT-запроса с этим файлом в качестве тела запроса вы можете присвоить флагу -d значение @data.json. Префикс @ говорит curl загрузить тело запроса из файла data.json:

$ curl -X PUT -d '@data.json' -H "Content-Type: application/json" https://httpbin. org/put
{
  "args": {}, 
  "data": "{\"answer\":42}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "13", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8e745-37c4ef06326b7b4354a16b94", 
    "X-B3-Parentspanid": "a4f8f91f4f1b051e", 
    "X-B3-Sampled": "0", 
    "X-B3-Spanid": "a018b1a3fcebdc68", 
    "X-B3-Traceid": "7b48b01dc3f632eea4f8f91f4f1b051e", 
    "X-Envoy-External-Address": "10.100.91.201", 
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=6035260d9d551af6c1907270653214e8d3195abbdd19078c1c84fd9a4106f260;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
  }, 
  "json": {
    "answer": 42
  }, 
  "origin": "69.84.111.39,10.100.91.201", 
  "url": "http://httpbin.org/put"
}

Заключение


Резюмируя, вот опции curl, которые я нахожу самыми полезными:

  • -X определяет метод запроса, например, curl -X POST url
  • -d определяет тело запроса в виде строки в PUT и POST-запросах. Используйте @ для извлечения данных из файла
  • -H определяет заголовок запроса, например, curl -H "Authorization: my-secret-token" url
  • -u аутентификационные данные для стандартной авторизации
  • -O сохраняет тело запроса в файл
  • -i показывает полный ответ, включая заголовки


Curl — полезный инструмент взаимодействия с API посредством командной строки, независимо от того, сторонний это API или API, который вы разрабатываете. Для быстрого тестирования curl подходит лучше, чем Axios в Node.js или настройка запроса в Postman, если вы знакомы с их синтаксисом.

Благодарю за потраченное время. Надеюсь, оно было потрачено не зря.

Что JavaScript-разработчику следует знать о Curl

Доброго времени суток, друзья!

Представляю Вашему вниманию перевод статьи «What JavaScript Developers Should Know About Curl» автора Valery Karpov.

Curl — это популярный инструмент командной строки, часто используемый для отправки HTTP-запросов. Curl поддерживает большое количество протоколов, однако как Node.js-разработчик вы, скорее всего, будете использовать его для отпраки http-запросов к RESTful API.

Документация curl представляет собой перечень из 383 флагов командной строки, поэтому в ней очень трудно найти то, что ищешь. В этой статье я хочу поделиться с вами некоторыми часто используемыми мной шаблонами. Для примеров будет использоваться сервис httpbin.org.

Отправка http-запроса


Для начала убедитесь в том, что у вас установлен curl, выполнив команду curl --version.

$ curl --version
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.1 zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL 


Для отправки запроса необходимо запустить curl url. Например, для отправки GET-запроса к https://httpbin.org/get?answer=42 следует запустить curl https://httpbin.org/get?answer=42.

$ curl https://httpbin.org/get?answer=42
{
  "args": {
    "answer": "42"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8d737-b39c6a466892725bbb52b916"
  }, 
  "origin": "69.84.111.39", 
  "url": "https://httpbin.org/get?answer=42"
}


После успешного завершения запроса curl возвращает тело http-ответа. Для того, чтобы заставить curl вернуть весь ответ, включая заголовки, используйте флаг -i.

$ curl -i https://httpbin.org/get?answer=42
HTTP/2 200 
date: Tue, 16 Jun 2020 14:30:57 GMT
content-type: application/json
content-length: 801
server: istio-envoy
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 2
{
  "args": {
    "answer": "42"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "0", 
    "Host": "httpbin. org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8d7a1-cb3954c09299eb9e0dff70a6", 
    "X-B3-Parentspanid": "dffc55451e64b5fc", 
    "X-B3-Sampled": "0", 
    "X-B3-Spanid": "8e233a863fb18b6c", 
    "X-B3-Traceid": "45bd12a9067fb5c0dffc55451e64b5fc", 
    "X-Envoy-External-Address": "10.100.91.201", 
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=c1ff14671b3e24ee794f9a486570abf8ccc9d622846611d3f91a322db4d480cd;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
  }, 
  "origin": "69.84.111.39,10.100.91.201", 
  "url": "http://httpbin.org/get?answer=42"
}


Это полный http-ответ. Заголовками ответа являются строки от date: до x-envoy-upstream-service-time:.

Загрузка файлов


Wget — самый распространенный инструмент для загрузки файлов посредством командной строки. Он входит в комплект большинства диструбутивов Linux. Однако в OSX его нет.

Команда wget url аналогична команде curl -OL url. Опция — это опция --remote-name, которая говорит curl сохранить тело ответа в локальном файле. Опция -L говорит curl следовать перенаправлениям.

Например, ниже представлено изображение с Unsplash, его URL — https://images.unsplash.com/photo-1506812574058-fc75fa93fead.

Для загрузки этого изобюражения необходимо выполнить следующее:

$ curl -OL https://images.unsplash.com/photo-1506812574058-fc75fa93fead
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12.1M  100 12.1M    0     0  3927k      0  0:00:03  0:00:03 --:--:-- 3927k


Опция -O говорит curl использовать строку после последнего / в качестве имени файла. В приведенном примере изображение будет сохранено в текущей директории с именем photo-1506812574058-fc75fa93fead. Для определения имени файла используйте опцию (строчная буква «о»).

$ curl -o miami-beach.jpg https://images.unsplash.com/photo-1506812574058-fc75fa93fead
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12.1M  100 12.1M    0     0  6083k      0  0:00:02  0:00:02 --:--:-- 6083k
$ ls -l miami-beach-jpg
-rw-rw-r-- 1 val val 12788445 Jun 16 11:03 miami-beach.jpg

Отправка авторизованного запроса


Заголовок авторизации используется для включения в запрос данных для авторизации при обращении к RESTful API. Для добавления указанных данных необходимо использовать флаг -H. Например, если ваш ключ интерфейса (API key) my-secret-token, вы можете включить его в http-запрос следующим образом:

$ curl -H "Authorization: my-secret-token" https://httpbin. org/get
{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Authorization": "my-secret-token", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8e1a5-a3aa30e0765a7980b04ca4a0"
  }, 
  "origin": "69.84.111.39", 
  "url": "https://httpbin.org/get"
}


Обратите внимание, что httpbin.org возвращает заголовки http-запроса в теле ответа в свойстве headers.

Curl также поддерживает авторизацию по-умолчанию посредством флага -u. В следующем примере мы отправляем запрос с именем пользователя user и паролем pass:

$ curl -i -u "user:pass" https://httpbin.org/basic-auth/user/pass
HTTP/2 200 
date: Tue, 16 Jun 2020 15:18:45 GMT
content-type: application/json
content-length: 47
server: istio-envoy
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 1
{
  "authenticated": true, 
  "user": "user"
}


Вот что происходит при отправке неправильного имени пользователя или пароля:

$ curl -i -u "user:wrongpass" https://httpbin. org/basic-auth/user/pass
HTTP/2 401 
date: Tue, 16 Jun 2020 15:18:51 GMT
content-length: 0
server: istio-envoy
www-authenticate: Basic realm="Fake Realm"
access-control-allow-origin: *
access-control-allow-credentials: true
x-envoy-upstream-service-time: 12

Отправка POST-запроса, содержащего JSON


Флаг -X говорит curl, какой метод следует использовать: PUT, POST и т.д. По-умолчанию curl использует метод GET, поэтому писать curl -X GET не нужно.

Флаг -X часто используется совместно с флагом -d, позволяющим добавить тело запроса. В следующем примере показано как отправить POST-запрос, содержащий некоторый json:

$ curl -X POST -d '{"answer":42}' https://httpbin.org/post
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "{\"answer\":42}": ""
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "13", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin. org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8e3fd-8437029087be44707bd15320", 
    "X-B3-Parentspanid": "2a739cfc42d28236", 
    "X-B3-Sampled": "0", 
    "X-B3-Spanid": "8bdf030613bb9c8d", 
    "X-B3-Traceid": "75d84f317abad5232a739cfc42d28236", 
    "X-Envoy-External-Address": "10.100.91.201", 
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=ea8c3d70befa0d73aa0f07fdb74ec4700d42a72889a04630741193548f1a7ae1;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
  }, 
  "json": null, 
  "origin": "69.84.111.39,10.100.91.201", 
  "url": "http://httpbin.org/post"
}


Обратите внимание, что по-умолчанию значением заголовка Content-Type является application/x-www-form-urlencoded. Для json это является неверным, поэтому для определения Content-Type следует использовать флаг -H:

$ curl -X POST -d '{"answer":42}' -H "Content-Type: application/json" https://httpbin. org/post
{
  "args": {}, 
  "data": "{\"answer\":42}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "13", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8e45e-ad875af4f83efd4379b86c34", 
    "X-B3-Parentspanid": "5f4f33d1c5ea13aa", 
    "X-B3-Sampled": "0", 
    "X-B3-Spanid": "a062c9bf2ebfd4bd", 
    "X-B3-Traceid": "44aa8d62412ae34d5f4f33d1c5ea13aa", 
    "X-Envoy-External-Address": "10.100.86.47", 
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=2f0b3331fe4d512975b4b82583a55dd5d1196023d0dfce9e0abed246991c5b67;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
  }, 
  "json": {
    "answer": 42
  }, 
  "origin": "69.84.111.39,10.100.86.47", 
  "url": "http://httpbin.org/post"
}

Отправка PUT-запроса, содержащего JSON-файл


Флаг -d также поддерживает отправку данных из локальных файлов.

Например, представим, что у нас есть файл data.js, содержащий такие данные:

{"answer": 42}


Для отправки PUT-запроса с этим файлом в качестве тела запроса вы можете присвоить флагу -d значение @data.json. Префикс @ говорит curl загрузить тело запроса из файла data.json:

$ curl -X PUT -d '@data.json' -H "Content-Type: application/json" https://httpbin.org/put
{
  "args": {}, 
  "data": "{\"answer\":42}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "13", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.58.0", 
    "X-Amzn-Trace-Id": "Root=1-5ee8e745-37c4ef06326b7b4354a16b94", 
    "X-B3-Parentspanid": "a4f8f91f4f1b051e", 
    "X-B3-Sampled": "0", 
    "X-B3-Spanid": "a018b1a3fcebdc68", 
    "X-B3-Traceid": "7b48b01dc3f632eea4f8f91f4f1b051e", 
    "X-Envoy-External-Address": "10. 100.91.201", 
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=6035260d9d551af6c1907270653214e8d3195abbdd19078c1c84fd9a4106f260;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
  }, 
  "json": {
    "answer": 42
  }, 
  "origin": "69.84.111.39,10.100.91.201", 
  "url": "http://httpbin.org/put"
}

Заключение


Резюмируя, вот опции curl, которые я нахожу самыми полезными:

  • -X определяет метод запроса, например, curl -X POST url
  • -d определяет тело запроса в виде строки в PUT и POST-запросах. Используйте @ для извлечения данных из файла
  • -H определяет заголовок запроса, например, curl -H "Authorization: my-secret-token" url
  • -u аутентификационные данные для стандартной авторизации
  • -O сохраняет тело запроса в файл
  • -i показывает полный ответ, включая заголовки


Curl — полезный инструмент взаимодействия с API посредством командной строки, независимо от того, сторонний это API или API, который вы разрабатываете. Для быстрого тестирования curl подходит лучше, чем Axios в Node.js или настройка запроса в Postman, если вы знакомы с их синтаксисом.

Благодарю за потраченное время. Надеюсь, оно было потрачено не зря.

Что разработчики JavaScript должны знать о Curl

Curl — популярный инструмент командной строки, часто используемый для
выполнение HTTP-запросов. Curl поддерживает множество других протоколов,
но, как разработчик Node.js, вы, скорее всего, будете использовать его для создания HTTP
запросы к RESTful API.

К сожалению, список документов curl поддерживает 383 флага командной строки, что затрудняет поиск того, что вы ищете. В этой статье,
Я перечислю шаблоны, которые я чаще всего использую с
curl на примере отличного сервиса httpbin.org.

Выполнение запроса HTTP GET

Во-первых, дважды проверьте, установлен ли у вас curl, запустив curl --version .

 $ curl --версия
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1. 1.1 zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30. 0 либртмп/2.3
Дата выпуска: 2018-01-24
Протоколы: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Возможности: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL 

Чтобы сделать запрос HTTP GET, вам просто нужно запустить curl . Например,
чтобы сделать запрос HTTP GET на https://httpbin.org/get?answer=42 , вы
можно запустить curl https://httpbin.org/get?answer=42 .

 $ завиток https://httpbin.org/get?answer=42
{
  "аргументы": {
    "ответ": "42"
  },
  "заголовки": {
    "Принимать": "*/*",
    «Хост»: «httpbin.org»,
    «Агент пользователя»: «curl/7.58.0»,
    "X-Amzn-Trace-Id": "Корень=1-5ee8d737-b39c6a466892725bbb52b916 дюймов
  },
  "происхождение": "69.84.111.39",
  "url": "https://httpbin.org/get?answer=42"
}
$ 

Когда HTTP-запрос выполнен успешно, curl распечатывает тело ответа HTTP.
Чтобы заставить curl напечатать весь ответ, включая заголовки ответов, используйте флаг -i .

 $ curl -i https://httpbin.org/get?answer=42
HTTP/2 200
дата: вторник, 16 июня 2020 г., 14:30:57 по Гринвичу
тип содержимого: приложение/json
длина содержимого: 801
сервер: istio-envoy
разрешение-управления-происхождением: *
разрешения-управления-доступом-учетные данные: правда
x-envoy-upstream-time-service: 2
{
  "аргументы": {
    "ответ": "42"
  },
  "заголовки": {
    "Принимать": "*/*",
    "Длина содержания": "0",
    «Хост»: «httpbin.org»,
    «Агент пользователя»: «curl/7.58.0»,
    "X-Amzn-Trace-Id": "Корень=1-5ee8d7a1-cb3954c09299eb9e0dff70a6",
    "X-B3-Parentspanid": "dffc55451e64b5fc",
    «X-B3-выборка»: «0»,
    "X-B3-Испания": "8e233a863fb18b6c",
    "X-B3-Traceid": "45bd12a9067fb5c0dffc55451e64b5fc",
    "X-Envoy-External-Address": "10.100.91.201",
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=c1ff14671b3e24ee794f9a486570abf8ccc9d622846611d3f91a322db4d480cd;Subject=\"\";URI=spiffe://cluster.  local/ns/istio-system/sa/istio-ingressgateway-service-account"
  },
  "происхождение": "69.84.111.39,10.100.91.201",
  "url": "http://httpbin.org/get?answer=42"
} 

Приведенный выше вывод представляет собой необработанный HTTP-ответ. Заголовки ответов — это строки из
дата: от до x-envoy-upstream-service-time: .

Загрузка файла

Wget — распространенный инструмент для загрузки
файлы через командную строку. Большинство дистрибутивов Linux поставляются со встроенным wget, но
заметно, что OSX не поставляется с wget.

На практике wget url эквивалентен завиток-OL URL-адрес .
option — это параметр --remote-name , который указывает curl сохранить ответ
тело в локальном файле. Опция -L указывает curl следовать перенаправлениям.

Например, ниже изображение из Unsplash,
URL-адрес https://images.unsplash.com/photo-1506812574058-fc75fa93fead .

Чтобы загрузить это изображение с помощью curl, вы можете запустить:

 $ curl -OL https://images.unsplash.com/photo-1506812574058-fc75fa93fead
  % Всего % Получено % Xferd Средняя скорость Время Время Время Текущее
                                 Dload Upload Общая потраченная левая скорость
100 12.1M 100 12.1M 0 0 3927k 0 0:00:03 0:00:03 --:--:-- 3927k
$ 

Опция -O указывает curl использовать все после последних / в URL
как имя файла. Итак, в приведенном выше примере изображение будет храниться в
текущий каталог с именем файла photo-1506812574058-fc75fa93fead .
Чтобы указать имя файла, используйте параметр -o (нижняя буква «o»).

 $ curl -o miami-beach.jpg https://images.unsplash.com/photo-1506812574058-fc75fa93fead
  % Всего % Получено % Xferd Средняя скорость Время Время Время Текущее
                                 Dload Upload Общая потраченная левая скорость
100 12.1M 100 12.1M 0 0 6083k 0 0:00:02 0:00:02 --:--:-- 6083k
$ ls -l Майами-Бич-jpg
-rw-rw-r-- 1 val val 12788445 16 июня 11:03 miami-beach. jpg
$ 

Создание запроса с авторизацией

Заголовок авторизации
где вам обычно нужно указывать учетные данные для аутентификации при обращении к RESTful API.
Для установки заголовка авторизации вручную необходимо использовать флаг -H , который
устанавливает собственный заголовок запроса. Например, если ваш ключ API my-secret-token ,
вы можете прикрепить его к HTTP-запросу curl, как показано ниже.

 $ curl -H "Авторизация: мой секретный токен" https://httpbin.org/get
{
  "аргументы": {},
  "заголовки": {
    "Принимать": "*/*",
    "Авторизация": "мой секретный токен",
    «Хост»: «httpbin.org»,
    «Агент пользователя»: «curl/7.58.0»,
    "X-Amzn-Trace-Id": "Корень = 1-5ee8e1a5-a3aa30e0765a7980b04ca4a0"
  },
  "происхождение": "69.84.111.39",
  "url": "https://httpbin.org/get"
}
$ 

Обратите внимание, что httpbin.org/get возвращает заголовки HTTP-запроса в
тело ответа под свойством заголовков .

Curl также поддерживает базовую аутентификацию
используя флаг -u . Например, ниже показано, как вы отправляете запрос с помощью
имя пользователя пользователь и пароль пароль :

 $ curl -i -u "user:pass" https://httpbin.org/basic-auth/user/pass
HTTP/2 200
дата: вторник, 16 июня 2020 г., 15:18:45 по Гринвичу
тип содержимого: приложение/json
длина содержимого: 47
сервер: istio-envoy
разрешение-управления-происхождением: *
разрешения-управления-доступом-учетные данные: правда
x-envoy-upstream-service-time: 1
{
  "аутентифицированный": правда,
  "пользователь": "пользователь"
}
$ 

Вот что происходит, когда вы отправляете неверное имя пользователя и пароль.

 $ curl -i -u "пользователь: неправильный пароль" https://httpbin.org/basic-auth/user/pass
HTTP/2 401
дата: вторник, 16 июня 2020 г., 15:18:51 по Гринвичу
длина содержимого: 0
сервер: istio-envoy
www-authenticate: Basic realm="Fake Realm"
разрешение-управления-происхождением: *
разрешения-управления-доступом-учетные данные: правда
x-envoy-upstream-service-time: 12
$ 

Выполнение запроса POST с помощью JSON

Флаг -X указывает curl, какой метод HTTP использовать: PUT, POST и т. д.
По умолчанию curl использует GET, так что вам не нужно делать завиток -X ПОЛУЧИТЬ .

Флаг -X часто используется с флагом -d , что позволяет
установить тело запроса.
Ниже показано, как вы можете отправить запрос POST с некоторым JSON.

 $ curl -X POST -d '{"answer":42}' https://httpbin.org/post
{
  "аргументы": {},
  "данные": "",
  "файлы": {},
  "форма": {
    "{\"ответ\":42}": ""
  },
  "заголовки": {
    "Принимать": "*/*",
    "Длина содержания": "13",
    "Content-Type": "application/x-www-form-urlencoded",
    «Хост»: «httpbin.org»,
    «Агент пользователя»: «curl/7.58.0»,
    "X-Amzn-Trace-Id": "Корень = 1-5ee8e3fd-8437029087be44707bd15320",
    "X-B3-Parentspanid": "2a739cfc42d28236",
    «X-B3-выборка»: «0»,
    "X-B3-Испания": "8bdf030613bb9c8d",
    "X-B3-Traceid": "75d84f317abad5232a739cfc42d28236",
    "X-Envoy-External-Address": "10.100.91.201",
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=ea8c3d70befa0d73aa0f07fdb74ec4700d42a72889a04630741193548f1a7ae1;Subject=\"\";URI=spiffe://cluster.  local/ns/istio-system/sa/istio-ingressgateway-service-account"
  },
  "json": ноль,
  "происхождение": "69.84.111.39,10.100.91.201",
  "url": "http://httpbin.org/post"
}
$ 

Обратите внимание, что по умолчанию curl устанавливает для заголовка «Content-Type» запроса значение
приложение/x-www-form-urlencoded . Это неверно для JSON, поэтому
для запросов JSON вам также необходимо установить заголовок «Content-Type»
используя флаг -H .

 $ curl -X POST -d '{"answer":42}' -H "Тип содержимого: приложение/json" https://httpbin.org/post
{
  "аргументы": {},
  "данные": "{\"ответ\":42}",
  "файлы": {},
  "форма": {},
  "заголовки": {
    "Принимать": "*/*",
    "Длина содержания": "13",
    "Тип контента": "приложение/json",
    «Хост»: «httpbin.org»,
    «Агент пользователя»: «curl/7.58.0»,
    "X-Amzn-Trace-Id": "Корень = 1-5ee8e45e-ad875af4f83efd4379б86с34",
    "X-B3-Parentspanid": "5f4f33d1c5ea13aa",
    «X-B3-выборка»: «0»,
    "X-B3-Spanid": "a062c9bf2ebfd4bd",
    «X-B3-Traceid»: «44aa8d62412ae34d5f4f33d1c5ea13aa»,
    "X-Envoy-External-Address": "10. 100.86.47",
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=2f0b3331fe4d512975b4b82583a55dd5d1196023d0dfce9e0abed246991c5b67;Subject=\"\";URI=spiffe://cluster. local/ns/istio-system/sa/istio-ingressgateway-service-account"
  },
  "жсон": {
    "ответ": 42
  },
  "происхождение": "69.84.111.39,10.100.86.47",
  "url": "http://httpbin.org/post"
} 

Выполнение запроса PUT с файлом JSON

Флаг -d сам по себе удобен для небольших запросов, но он может
громоздко иметь дело с огромными полезными нагрузками JSON. К счастью, флаг -d
поддерживает извлечение данных из локального файла.

Например, предположим, что у вас есть файл data.json со следующим содержимым:

 {"answer":42} 

Чтобы сделать запрос HTTP PUT с этим файлом в качестве тела запроса, вы
можно установить -d флаг для '@data.json' . Префикс @ сообщает curl
для загрузки тела запроса из файла data. json.

 $ curl -X PUT -d '@data.json' -H "Тип содержимого: приложение/json" https://httpbin.org/put
{
  "аргументы": {},
  "данные": "{\"ответ\":42}",
  "файлы": {},
  "форма": {},
  "заголовки": {
    "Принимать": "*/*",
    "Длина содержания": "13",
    "Тип контента": "приложение/json",
    «Хост»: «httpbin.org»,
    «Агент пользователя»: «curl/7.58.0»,
    "X-Amzn-Trace-Id": "Корень = 1-5ee8e745-37c4ef06326b7b4354a16b94",
    "X-B3-Parentspanid": "a4f8f91f4f1b051e",
    «X-B3-выборка»: «0»,
    "X-B3-Spanid": "a018b1a3fcebdc68",
    "X-B3-Traceid": "7b48b01dc3f632eea4f8f91f4f1b051e",
    "X-Envoy-External-Address": "10.100.91.201",
    "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/httpbin-istio/sa/httpbin;Hash=6035260d9d551af6c10653214e8d3195abbdd19078c1c84fd9a4106f260;Subject=\"\";URI=spiffe://cluster. local/ns/istio-system/sa/istio-ingressgateway-service-account"
  },
  "жсон": {
    "ответ": 42
  },
  "происхождение": "69.84.111.39,10.100.91.201",
  "url": "http://httpbin. org/put"
}
$ 

Двигаемся дальше

Подводя итог, вот варианты завитков, которые я считаю наиболее полезными.

  • -X : установить метод HTTP, например curl -X POST url
  • -d : установить тело запроса в виде строки для запросов PUT и POST. Используйте @ для извлечения данных из файла.
  • -H : установить заголовок запроса, например curl -H "Авторизация: мой секретный токен" url
  • -u : Учетные данные для базовой аутентификации
  • -O : сохранить тело ответа в файле
  • -i : показать необработанный ответ, включая заголовки ответа

Curl — полезный инструмент для работы с API из командной строки,
будь то API, на который вы подписались, или тот, который вы разрабатываете локально.
Для быстрых тестов curl может быть проще, чем написание Axios.
запрос в Node.js или настройка запроса в Postman,
пока вы знакомы с синтаксисом.

Нашли опечатку или ошибку? Откройте запрос на включение! Этот пост
доступно в виде уценки на Github

Пожалуйста, включите JavaScript для просмотра комментариев на платформе Disqus. Этот документ предполагает, что вы знакомы с HTML и общими сетями.

Увеличение количества приложений, перемещаемых в Интернет, привело к тому, что "Сценарии HTTP" стали более востребованными и востребованными. Иметь возможность автоматически извлекать информацию из Интернета, подделывать пользователей, публиковать или загружать данные на веб-серверы — все это важные задачи сегодня.

Curl — это инструмент командной строки для выполнения всех видов манипуляций с URL-адресами и их передачи, но в этом конкретном документе основное внимание будет уделено тому, как использовать его при выполнении HTTP-запросов для развлечения и получения прибыли. Я предполагаю, что вы знаете, как вызвать curl --help или curl --manual , чтобы получить основную информацию об этом.

Программа Curl не предназначена для того, чтобы делать все за вас. Он делает запросы, получает данные, отправляет данные и извлекает информацию. Вероятно, вам нужно склеить все вместе, используя какой-то скриптовый язык или повторяющиеся ручные вызовы.

Протокол HTTP

HTTP — это протокол, используемый для получения данных с веб-серверов. Это простой протокол, основанный на TCP/IP. Протокол также позволяет отправлять информацию на сервер от клиента, используя несколько различных методов, как будет показано здесь.

HTTP представляет собой простые текстовые строки ASCII, отправляемые клиентом на сервер для запроса определенного действия, а затем сервер отвечает несколькими текстовыми строками, прежде чем фактическое запрошенное содержимое будет отправлено клиенту.

Клиент curl отправляет HTTP-запрос. Запрос содержит метод (например, GET, POST, HEAD и т. д.), ряд заголовков запроса и иногда тело запроса. HTTP-сервер отвечает строкой состояния (указывающей, все ли прошло хорошо), заголовками ответа и чаще всего также телом ответа. Часть «тело» — это запрошенные вами простые данные, такие как фактический HTML или изображение и т. д. команд, которые curl отправляет на сервер, а также несколько других информационных текстов.

--verbose — самая полезная опция, когда дело доходит до отладки или даже понимания взаимодействия curl<->сервера.

Иногда даже --verbose недостаточно. Затем --trace и --trace-ascii предлагают еще больше подробностей, поскольку они показывают все, что curl отправляет и получает. Используйте его так:

 curl --trace-ascii debugdump.txt http://www.example.com/
 

См. время

Много раз вы можете задаться вопросом, что именно занимает все время, или вы просто хотите знать количество миллисекунд между двумя точками в передаче. Для тех и других подобных ситуаций --trace-time — это то, что вам нужно. Он будет добавлять время к каждой строке вывода трассировки:

 curl --trace-ascii d. txt --trace-time http://example.com/
 

См. ответ

По умолчанию curl отправляет ответ на стандартный вывод. Вам нужно перенаправить его куда-нибудь, чтобы избежать этого, чаще всего это делается с помощью -o или -O .

Spec

Формат унифицированного указателя ресурсов определяет адрес конкретного ресурса в Интернете. Вы знаете это, вы видели такие URL-адреса, как https://curl.se или https://example.com, миллион раз. RFC 3986 - каноническая спецификация. И да, официальное имя не URL, а URI.

Хост

Имя хоста обычно преобразуется с помощью DNS или вашего файла /etc/hosts в IP-адрес, и это то, с чем curl будет взаимодействовать. В качестве альтернативы вы указываете IP-адрес непосредственно в URL-адресе вместо имени.

Для разработки и других тестовых ситуаций вы можете указать другой IP-адрес для имени хоста, чем тот, который использовался бы в противном случае, с помощью curl --resolve вариант:

 curl --resolve www. example.org:80:127.0.0.1 http://www.example.org/
 

Номер порта

Каждый поддерживаемый curl протокол работает с номером порта по умолчанию, будь то TCP или, в некоторых случаях, UDP. Обычно вам не нужно принимать это во внимание, но иногда вы запускаете тестовые серверы на других портах или подобных. Затем вы можете указать номер порта в URL-адресе с двоеточием и номером сразу после имени хоста. Например, при выполнении HTTP на порт 1234:

 завиток http://www.example.org:1234/
 

Номер порта, который вы указываете в URL-адресе, — это номер, который сервер использует для предоставления своих услуг. Иногда вы можете использовать прокси-сервер, и тогда вам может потребоваться указать номер порта этого прокси-сервера отдельно от того, какой curl должен подключиться к серверу. Например, при использовании HTTP-прокси на порту 4321:

 curl --proxy http://proxy.example.org:4321 http://remote.example.org/
 

Имя пользователя и пароль

Для некоторых служб требуется HTTP-аутентификация, после чего вам необходимо указать имя и пароль, которые затем передаются на удаленный сайт различными способами в зависимости от используемого протокола аутентификации.

Вы можете либо вставить пользователя и пароль в URL-адрес, либо указать их отдельно:

 curl http://user:[email protected]/
 

или

 curl -u пользователь: пароль http://example.org/
 

Обратите внимание, что этот вид аутентификации HTTP не является тем, что обычно делается и запрашивается веб-сайтами, ориентированными на пользователя, в наши дни. Вместо этого они, как правило, используют формы и файлы cookie.

Часть пути

Часть пути просто отправляется на сервер, чтобы запросить отправку связанного ответа. Путь — это то, что находится справа от косой черты, следующей за именем хоста и, возможно, номером порта.

GET

Самый простой и наиболее распространенный запрос/операция, выполняемая с использованием HTTP, — это ПОЛУЧИТЬ URL-адрес. Сам URL-адрес может относиться к веб-странице, изображению или файлу. Клиент отправляет запрос GET на сервер и получает запрошенный документ. Если вы введете командную строку

 curl https://curl. se
 

вы получите веб-страницу, возвращенную в окно терминала. Весь HTML-документ, который содержит этот URL-адрес.

Все ответы HTTP содержат набор заголовков ответов, которые обычно скрыты, используйте curl --включите параметр ( -i ), чтобы отобразить их, а также остальную часть документа.

HEAD

Вы можете запросить у удаленного сервера ТОЛЬКО заголовки, используя параметр --head ( -I ), который заставит curl выдать запрос HEAD. В некоторых особых случаях серверы отвергают метод HEAD, в то время как другие все еще работают, что вызывает особое раздражение.

Метод HEAD определен и сделан таким образом, что сервер возвращает заголовки точно так же, как и для GET, но без тела. Это означает, что вы можете увидеть Content-Length: в заголовках ответа, но в ответе HEAD не должно быть фактического тела.

Одна командная строка curl может включать один или несколько URL-адресов. Наиболее распространенным случаем, вероятно, является использование одного, но вы можете указать любое количество URL-адресов. Да любой. Без ограничений. Затем вы будете получать запросы, повторяющиеся снова и снова для всех заданных URL-адресов.

Пример, отправьте два запроса GET:

 curl http://url1.example.com http://url2.example.com
 

Если вы используете --data для POST на URL-адрес, использование нескольких URL-адресов означает, что вы отправляете один и тот же POST на все указанные URL-адреса.

Пример, отправьте два сообщения POST:

 curl --data name=curl http://url1.example.com http://url2.example.com
 

Иногда вам нужно работать с несколькими URL-адресами в одной командной строке и использовать разные методы HTTP для каждого. Для этого вам понравится опция --next . По сути, это разделитель, который отделяет несколько вариантов от следующего. Все URL до --next получит тот же метод и объединит все данные POST в один.

Когда curl достигает --next в командной строке, он как бы сбрасывает метод и данные POST и разрешает новый набор.

Возможно, это лучше всего показать на нескольких примерах. Чтобы отправить сначала HEAD, а затем GET:

 curl -I http://example.com --next http://example.com
 

Чтобы сначала отправить POST, а затем GET:

 curl -d score=10 http://example.com/post.cgi --next http://example.com/results.html
 

Объяснение форм

Формы — это общий способ, которым веб-сайт может представить HTML-страницу с полями, в которые пользователь может ввести данные, а затем нажать кнопку «ОК» или «Отправить», чтобы эти данные были отправлены на сервер. . Затем сервер обычно использует отправленные данные, чтобы решить, как действовать. Например, использование введенных слов для поиска в базе данных или добавление информации в систему отслеживания ошибок, отображение введенного адреса на карте или использование информации в качестве подсказки для входа в систему, подтверждающей, что пользователю разрешено видеть, о чем идет речь. чтобы увидеть.

Конечно, на стороне сервера должна быть какая-то программа для приема отправляемых вами данных. Вы не можете просто изобрести что-то из воздуха.

GET

GET-форма использует метод GET, как указано в HTML, например:

 

В вашем любимом браузере появится эта форма с текстовым полем для заполнения и кнопкой "ОК". Если вы заполните '1905' и нажмите кнопку OK, после чего ваш браузер создаст новый URL-адрес для вас. URL-адрес получит junk.cgi?birthyear=1905&press=OK , добавленный к части пути предыдущего URL-адреса.

Если исходная форма была видна на странице www.example.com/when/birth.html , вторая страница, которую вы получите, станет www.example.com/when/junk.cgi?birthyear=1905&press= ОК .

Так работает большинство поисковых систем.

Чтобы заставить curl сделать сообщение формы GET для вас, просто введите ожидаемый созданный URL:

 curl "http://www. example.com/when/junk.cgi?birthyear=1905&press=OK"
 

POST

Метод GET отображает все имена полей ввода в поле URL вашего браузера. Как правило, это хорошо, когда вы хотите добавить эту страницу в закладки с вашими данными, но это явный недостаток, если вы ввели секретную информацию в одно из полей или если имеется большое количество полей, создающих длинный и нечитаемый URL.

Затем протокол HTTP предлагает метод POST. Таким образом, клиент отправляет данные отдельно от URL-адреса, и поэтому вы не увидите их в поле URL-адреса.

Форма будет похожа на предыдущую:

 

И чтобы использовать curl для публикации этой формы с теми же данными, что и раньше, мы могли бы сделать это так:

 curl --data "birthyear=1905&press=%20OK%20" http://www .example.com/when/junk.cgi
 

Этот тип POST будет использовать Content-Type application/x-www-form-urlencoded и является наиболее широко используемым типом POST.

Данные, которые вы отправляете на сервер, ДОЛЖНЫ уже быть правильно закодированы, curl не сделает этого за вас. Например, если вы хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел на %20 и т. д. Невыполнение этого требования, скорее всего, приведет к тому, что ваши данные будут получены неправильно и испорчены.

Последние версии curl могут на самом деле кодировать данные POST для вас, например:

 curl --data-urlencode "name=I am Daniel" http://www.example.com
 

Если вы повторите --data несколько раз в командной строке, curl объединит все заданные фрагменты данных и поместит символы и между каждым сегментом данных.

Загрузка файла POST

Еще в конце 1995 года был определен дополнительный способ отправки данных через HTTP. Это задокументировано в RFC 1867, поэтому этот метод иногда называют RFC1867-posting.

Этот метод в основном предназначен для лучшей поддержки загрузки файлов. Форма, позволяющая пользователю загрузить файл, может быть написана в HTML следующим образом:

 
<тип ввода=имя файла=загрузить>

Это ясно показывает, что Content-Type, который должен быть отправлен, имеет значение multipart/form-data .

Чтобы опубликовать сообщение в подобной форме с помощью curl, введите команду, например:

 curl --form upload=@localfilename --form press=OK [URL]
 

Скрытые поля

Распространенным способом передачи информации о состоянии между страницами для приложений на основе HTML является добавление скрытых полей в формы. Скрытые поля уже заполнены, они не отображаются пользователю и передаются так же, как и все остальные поля.

Аналогичный пример формы с одним видимым полем, одним скрытым полем и одной кнопкой отправки может выглядеть так:

 
cgi">

Чтобы отправить это с помощью curl, вам не придется думать о том, скрыты поля или нет. Для завивки они все одинаковые:

 curl --data "год рождения=1905&press=OK&person=daniel" [URL]
 

Выясните, как выглядит POST

Когда вы собираетесь заполнить форму и отправить ее на сервер с помощью curl вместо браузера, вы, конечно, заинтересованы в отправке POST точно так же, как это делает ваш браузер.

Простой способ увидеть это — сохранить HTML-страницу с формой на локальном диске, изменить «метод» на GET и нажать кнопку отправки (вы также можете изменить URL-адрес действия, если хотите к).

Затем вы ясно увидите, что данные добавляются к URL-адресу, разделенному символом ? -буква, как и положено GET-формам.

PUT

Возможно, лучший способ загрузить данные на HTTP-сервер — использовать PUT. Опять же, для этого, конечно, требуется, чтобы кто-то поместил на сервер программу или скрипт, который знает, как получать HTTP-поток PUT.

Поместите файл на HTTP-сервер с помощью curl:

 curl --upload-file uploadfile http://www.example.com/receive.cgi
 

Базовая аутентификация

HTTP-аутентификация — это возможность сообщить серверу ваше имя пользователя и пароль, чтобы он мог проверить, разрешено ли вам выполнять выполняемый вами запрос. Обычная аутентификация, используемая в HTTP (это тип, который curl использует по умолчанию), основана на открытом тексте , что означает, что он отправляет имя пользователя и пароль, слегка запутанные, но все еще полностью читаемые любым, кто прослушивает сеть между вами и удаленным сервер.

Чтобы указать curl использовать пользователя и пароль для аутентификации:

 curl --имя пользователя:пароль http://www.example.com
 

Другая аутентификация

Для сайта может потребоваться другой метод аутентификации (проверьте заголовки, возвращаемые сервером), а затем --ntlm , --digest , --negotiate или даже --anyauth могут быть варианты, которые подходят вам.

Аутентификация прокси-сервера

Иногда доступ к HTTP возможен только при использовании прокси-сервера HTTP. Это, кажется, особенно распространено в различных компаниях. Прокси-серверу HTTP может потребоваться собственный пользователь и пароль, чтобы позволить клиенту получить доступ к Интернету. Чтобы указать те, у которых есть curl, запустите что-то вроде:

 curl --proxy-user proxyuser:proxypassword curl.se
 

Если ваш прокси-сервер требует аутентификации с использованием метода NTLM, используйте --proxy-ntlm , если для этого требуется дайджест, используйте --proxy-digest .

Если вы используете любую из этих опций пользователя и пароля, но пропускаете часть пароля, curl запросит пароль в интерактивном режиме.

Скрытие учетных данных

Учтите, что при запуске программы ее параметры можно будет увидеть в списке запущенных процессов системы. Таким образом, другие пользователи смогут просматривать ваши пароли, если вы передадите их как простые параметры командной строки. Есть способы обойти это.

Стоит отметить, что хотя именно так работает HTTP-аутентификация, многие веб-сайты не будут использовать эту концепцию, когда они предоставляют логины и т. д. См. главу «Вход через Интернет» ниже для получения более подробной информации об этом.

Referer

HTTP-запрос может включать поле «referer» (да, оно написано с ошибкой), которое можно использовать, чтобы определить, с какого URL-адреса клиент перешел к этому конкретному ресурсу. Некоторые программы/скрипты проверяют поле реферера запросов, чтобы убедиться, что они не приходят с внешнего сайта или неизвестной страницы. Хотя это глупый способ проверить что-то, что так легко подделать, многие скрипты все еще делают это. Используя curl, вы можете поместить все, что хотите, в поле referer и, таким образом, легче обмануть сервер, заставив его обслужить ваш запрос.

Используйте curl для установки поля реферера с помощью:

 curl --referer http://www.example.com http://www. example.com
 

User Agent

Подобно полю referer, все HTTP-запросы могут устанавливать поле User-Agent. Он указывает, какой пользовательский агент (клиент) используется. Многие приложения используют эту информацию, чтобы решить, как отображать страницы. Глупые веб-программисты пытаются создать разные страницы для пользователей разных браузеров, чтобы они выглядели как можно лучше для их конкретных браузеров. Обычно они также используют различные виды JavaScript и т. д.

Иногда вы увидите, что получение страницы с помощью curl не возвращает ту же страницу, которую вы видите при получении страницы с помощью вашего браузера. Тогда вы знаете, что пришло время установить поле User Agent, чтобы обмануть сервер, заставив его думать, что вы один из этих браузеров.

Чтобы curl выглядел как Internet Explorer 5 на компьютере с Windows 2000:

 curl --user-agent "Mozilla/4.0 (совместимый; MSIE 5.01; Windows NT 5.0)" [URL]
 

Или почему бы не выглядеть так, будто вы используете Netscape 4. 73 на старой Linux-системе:

 curl --user-agent "Mozilla/4.73 [ru] (X11; U; Linux 2.2.15 i686)" [URL]
 

Перенаправления

Когда ресурс запрашивается с сервера, ответ сервера может включать подсказку о том, куда браузеру следует перейти, чтобы найти эту страницу, или новую страницу, содержащую вновь сгенерированный вывод. Заголовок, сообщающий браузеру о перенаправлении, имеет вид Location: .

Curl не следует за заголовками Location: по умолчанию, но просто отображает такие страницы так же, как отображает все ответы HTTP. Однако у него есть опция, которая заставит его попытаться следовать Местоположение: указателей.

Чтобы указать curl следовать по местоположению:

 curl --location http://www.example.com
 

Если вы используете curl для POST на сайт, который немедленно перенаправляет вас на другую страницу, вы можете безопасно использовать --location ( -L ) и --data / --form вместе. Curl будет использовать POST только в первом запросе, а затем вернется к GET в следующих операциях.

Другие перенаправления

Браузеры обычно поддерживают как минимум два других способа перенаправления, которые не поддерживает curl: во-первых, html может содержать мета-тег обновления, который просит браузер загрузить определенный URL-адрес через заданное количество секунд, или он может использовать JavaScript для этого.

Основы работы с файлами cookie

Веб-браузеры осуществляют «управление состоянием на стороне клиента» с помощью файлов cookie. Файлы cookie — это просто имена с соответствующим содержимым. Файлы cookie отправляются клиенту сервером. Сервер сообщает клиенту, для какого пути и имени хоста он хочет, чтобы файл cookie был отправлен обратно, а также отправляет дату истечения срока действия и еще несколько свойств.

Когда клиент связывается с сервером с именем и путем, ранее указанными в полученном файле cookie, клиент отправляет файлы cookie и их содержимое обратно на сервер, если, конечно, срок их действия не истек.

Многие приложения и серверы используют этот метод для соединения серии запросов в один логический сеанс. Чтобы иметь возможность использовать curl в таких случаях, мы должны иметь возможность записывать и отправлять файлы cookie так, как их ожидает веб-приложение. Так же, как браузеры работают с ними.

Параметры cookie

Самый простой способ отправить несколько файлов cookie на сервер при получении страницы с curl — добавить их в командную строку, например:

 curl --cookie "name=Daniel" http://www. пример.com
 

Файлы cookie отправляются как обычные заголовки HTTP. Это практично, поскольку позволяет curl записывать файлы cookie, просто записывая заголовки. Запишите файлы cookie с помощью curl, используя параметр --dump-header ( -D ), например:

 curl --dump-header headers_and_cookies http://www.example.com
 

(Обратите внимание, что описанная ниже опция --cookie-jar является лучшим способом хранения файлов cookie. ) сервера и использовать файлы cookie, которые были сохранены из предыдущего подключения (или созданы вручную, чтобы обмануть сервер, заставив его поверить, что у вас было предыдущее подключение). Чтобы использовать ранее сохраненные файлы cookie, вы запускаете curl, например:

 curl --cookie store_cookies_in_file http://www.example.com
 

"Cookie Engine" Curl включается при использовании параметра --cookie . Если вы хотите, чтобы curl понимал только полученные файлы cookie, используйте --cookie с несуществующим файлом. Например, если вы хотите, чтобы curl понимал файлы cookie со страницы и следовал по местоположению (и, таким образом, возможно, отправлял полученные файлы cookie), вы можете вызвать его следующим образом:

 curl --cookie nada --location http://www. пример.com
 

Curl может читать и записывать файлы cookie, которые используют тот же формат файлов, который когда-то использовали Netscape и Mozilla. Это удобный способ обмена файлами cookie между сценариями или вызовами. Параметр --cookie ( -b ) автоматически определяет, является ли данный файл таким файлом cookie, и анализирует его, а с помощью параметра --cookie-jar ( -c ) вы сделаете curl записать новый файл cookie в конце операции:

 curl --cookie cookies.txt --cookie-jar newcookies.txt http://www.example.com
 

HTTPS защищен HTTP

Существует несколько способов безопасной передачи HTTP. На сегодняшний день наиболее распространенным протоколом для этого является то, что обычно известно как HTTPS, HTTP через SSL. SSL шифрует все данные, отправляемые и получаемые по сети, что затрудняет шпионаж конфиденциальной информации для злоумышленников.

SSL (или TLS, как называется текущая версия стандарта) предлагает набор расширенных функций для безопасной передачи по протоколу HTTP.

Curl поддерживает зашифрованные выборки, если он создан для использования библиотеки TLS, и его можно настроить для использования одной из довольно большого набора библиотек — curl -V покажет, для какого из них был создан ваш curl (если есть!). Чтобы получить страницу с HTTPS-сервера, просто запустите curl, например:

 curl https://secure.example.com
 

Сертификаты

В мире HTTPS вы используете сертификаты для подтверждения того, что вы являетесь тем, за кого себя выдаете, в дополнение к обычным паролям. Curl поддерживает клиентские сертификаты. Все сертификаты заблокированы парольной фразой, которую необходимо ввести, прежде чем curl сможет использовать сертификат. Парольную фразу можно указать в командной строке или, если нет, ввести интерактивно, когда curl запрашивает ее. Используйте сертификат с завитком на HTTPS-сервере, например:

 curl --cert mycert.pem https://secure.example.com
 

curl также пытается проверить, является ли сервер тем, за кого себя выдает, путем проверки сертификата сервера по локально хранящемуся пакету сертификатов ЦС. Неудачная проверка приведет к тому, что curl откажет в соединении. Затем вы должны использовать --insecure ( -k ), если вы хотите указать curl игнорировать тот факт, что сервер не может быть проверен.

Подробнее о проверке сертификата сервера и пакетах сертификатов ca можно прочитать в Документ SSLCERTS .

Иногда вы можете получить собственное хранилище сертификатов ЦС, и тогда вы можете указать curl использовать его для проверки сертификата сервера:

 curl --cacert ca-bundle.pem https://example.com/
 

Делая необычные вещи, вам может понадобиться добавить или изменить элементы одного запроса curl.

Например, вы можете изменить метод POST на PROPFIND и отправить данные как Content-Type: text/xml (вместо стандартного Content-Type ) например:

 curl --data "" --header "Content-Type: text/xml" --request PROPFIND example.com
 

Вы можете удалить заголовок по умолчанию, предоставив его без содержимого. Например, вы можете испортить запрос, отрезав заголовок Host: :

 curl --header "Host:" http://www.example.com
 

Таким же образом можно добавить заголовки. Вашему серверу может понадобиться заголовок Destination: , и вы можете добавить его:

 curl --header "Destination: http://nowhere" http://example.com
 

Подробнее об измененных методах

Следует отметить, что curl самостоятельно выбирает, какие методы использовать, в зависимости от запрашиваемого действия. -d будет выполнять POST, -I будет выполнять HEAD и так далее. Если вы используете параметр --request / -X , вы можете изменить выбор ключевого слова метода, но вы не измените поведение curl. Это означает, что если вы, например, используете -d "данные" для выполнения POST, вы можете изменить метод на PROPFIND с -X и curl все равно будет думать, что отправляет POST . Вы можете изменить обычный метод GET на метод POST, просто добавив -X POST в командную строку, например:

 curl -X POST http://example.org/
 

... но curl по-прежнему будет думать и действовать так, как если бы он отправил GET, поэтому он не будет отправлять тело запроса и т. д.

Некоторые приемы входа в систему Итак, вот краткое изложение того, как работает подавляющее большинство всех форм входа и как войти в них с помощью curl.

Можно также отметить, что для того, чтобы сделать это должным образом в автоматическом режиме, вам, безусловно, потребуется создавать сценарии и выполнять несколько вызовов curl и т. д.

Во-первых, серверы в основном используют файлы cookie для отслеживания состояния входа клиента в систему. , поэтому вам нужно будет перехватывать файлы cookie, которые вы получаете в ответах. Кроме того, многие сайты также устанавливают специальный файл cookie на странице входа (чтобы убедиться, что вы попали туда через их страницу входа), поэтому вы должны иметь привычку сначала получать страницу формы входа для захвата установленных там файлов cookie.

Некоторые веб-системы входа в систему содержат различное количество JavaScript, и иногда они используют такой код для установки или изменения содержимого файлов cookie. Возможно, они делают это, чтобы предотвратить запрограммированный вход в систему, как это руководство описывает, как... В любом случае, если чтения кода недостаточно, чтобы позволить вам повторить поведение вручную, захват HTTP-запросов, выполняемых вашими браузерами, и анализ отправленных файлов cookie обычно рабочий метод, чтобы решить, как сократить потребность в JavaScript.

Фактически Тег

для входа в систему, многие сайты заполняют случайные/сеансовые или иным образом тайно сгенерированные скрытые теги, и вам может потребоваться сначала захватить HTML-код для формы входа и извлечь все скрытые поля, чтобы иметь возможность делать правильный логин POST. Помните, что содержимое должно быть закодировано в URL-адресе при отправке обычным POST.

Некоторые приемы отладки

Много раз, когда вы запускаете curl на сайте, вы замечаете, что сайт не отвечает на ваши запросы curl так же, как на запросы вашего браузера.

Затем вам нужно начать делать ваши запросы curl более похожими на запросы вашего браузера:

  • Используйте параметр --trace-ascii для хранения полных подробных журналов запросов для облегчения анализа и лучшего понимания

  • Убедитесь, что вы проверяете и используете файлы cookie, когда это необходимо (как для чтения с помощью --cookie , так и для записи с помощью --cookie-jar )

  • Установить пользовательский агент (с -A ) равным единице, как это делает недавний популярный браузер

  • Установить реферер (с -E ), как это установлено в браузере

  • Если вы используете POST, убедитесь, что вы отправляете все поля и в том же порядке, что и браузер.