Как сделать вызов Curl POST в Windows?

It looks like you’re using cmd.exe
. Command Prompt’s character escaping rules are both archaic and awful. I recommend using Powershell instead; it uses rules much more similar to those of bash
on other *nix shells (though not identical, notably because it uses ` (backtick) as the escape character instead of backslash).

Here’s the command in Powershell on my system:

   & 'C:\Program Files\Git\mingw64\bin\curl' -i -X POST -H "Content-Type:application/json" -d '{  "firstName" : "Frodo",  "lastName" : "Baggins" }' http://localhost:8080/people
  
  

The leading &
is required because the path to the program is a quoted string. I had to specify the path because I don’t have a curl.exe
in my Windows PATH
. However, I could just escape the space in “Program Files”:

   C:\Program` Files\Git\mingw64\bin\curl -i -X POST -H "Content-Type:application/json" -d '{  "firstName" : "Frodo",  "lastName" : "Baggins" }' http://localhost:8080/people
  
  

Single and double quotes otherwise work as you’re using them, with the '
delimiting the start of a string and the "
appearing just as literal characters inside it.

Note that you do
have to provide the path to a curl
executable, or at least specify curl.exe
; curl
by itself is a Powershell alias for the Invoke-WebRequest
cmdlet, which can do most of what the cURL program can do but has very different argument syntax.

Also, while you can
invoke Powershell from cmd
using powershell -c <command>
, that wouldn’t really help here because you’d have to escape the string using cmd
‘s silly syntax anyhow.


Another option is just to use the Windows Subsystem for Linux (WSL), which lets you run Linux programs (including the default Ubuntu versions of bash
and curl
) directly on Windows, no VM or rebooting needed. Full details about this can be found at https://msdn.microsoft.com/en-us/commandline/wsl/about
, but the short version is try running bash
(or bash.exe
) from any Command Prompt or Powershell window, and it will install the Linux subsystem or at least tell you how.

CURL — утилита командной строки для Linux или Windows, поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах сайтов и других операций с URL адресами. Поддержка CURL добавлена в множество различных языков программирования и платформ.

Для начала скачаем саму утилиту, для этого переходим на официальный сайт утилиты, в раздел Download
. После скачивания архива для своей платформы (у меня это Windows 64 bit), распаковываем архив. Чтобы иметь возможность работать с HTTPS и FTPS, устанавливаем сертификат безопасности url-ca-bundle.crt
, который находится в папке curl/bin
.

Как сделать вызов Curl POST в Windows?

  
 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>
</BODY></HTML>  

Опция -X
позволяет задать тип HTTP-запроса вместо используемого по умолчанию GET. Дополнительные запросы могут быть POST, PUT и DELETE или связанные с WebDAV — PROPFIND, COPY, MOVE и т.п.

Следовать за редиректами

Сервер Google сообщил нам, что страница google.com
перемещена (301 Moved Permanently), и теперь надо запрашивать страницу www.google.com
. С помощью опции -L
укажем CURL следовать редиректам:

     curl -L google.com    

<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru">
<head>
<meta content="Поиск информации в интернете: веб страницы, картинки, видео и многое другое." name="description">
<meta content="noodp" name="robots">
<meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image">
<meta content="origin" name="referrer">
<title>Google</title>
.    

Сохранить вывод в файл

Чтобы сохранить вывод в файл, надо использовать опции -o
или -O
:

  • -o
    ( o
    нижнего регистра) — результат будет сохранён в файле, заданном в командной строке;
  • -O
    ( O
    верхнего регистра) — имя файла будет взято из URL и будет использовано для сохранения полученных данных.

Сохраняем страницу Google в файл google.html
:

     curl -L -o google.html google.com    

 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 219 100 219 0 0 2329 0 --:--:-- --:--:-- --:--:-- 2329
100 14206 0 14206 0 0 69980 0 --:--:-- --:--:-- --:--:-- 69980  

Сохраняем документ gettext.html
в файл gettext.html
:

     curl -O http://www.gnu.org/software/gettext/manual/gettext.html    

 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 1375k 100 1375k 0 0 800k 0 0:00:01 0:00:01 --:--:-- 800k  

Загрузить файл, только если он изменён

Опция -z
позволяет получить файлы, только если они были изменены после определённого времени. Это будет работать и для FTP и для HTTP. Например, файл archive.zip
будет получен, если он изменялся после 20 августа 2018 года:

:/>  Изменение даты создания и изменения файлов несколькими способами

     curl -z 20-Aug-18 http://www.example.com/archive.zip    
  

Команда ниже загрузит файл archive.zip
, если он изменялся до 20 августа 2018 года:

     curl -z -20-Aug-18 http://www.example.com/archive.zip    
  

Прохождение аутентификации HTTP

Опция -u
позволяет указать данные пользователя (имя и пароль) для прохождения базовой аутентификаци (Basic HTTP Authentication):

     curl -u evgeniy:qwerty -O http://www.example.com/archive.zip    
  

Получение и отправка cookie

Cookie используются сайтами для хранения некой информации на стороне пользователя. Сервер сохраняет cookie на стороне клиента (т.е. в браузере), отправляя заголовки:

  Set-Cookie: PHPSESSID=svn7eb593i8d2gv471rs94og58; path=/
Set-Cookie: visitor=fa867bd917ad0d715830a6a88c816033; expires=Mon, 16-Sep-2019 08:20:53 GMT; Max-Age=31536000; path=/
Set-Cookie: lastvisit=1537086053; path=/  

А браузер, в свою очередь, отправляет полученные cookie обратно на сервер при каждом запросе. Разумеется, тоже в заголовках:

  Cookie: PHPSESSID=svn7eb593i8d2gv471rs94og58; visitor=fa867bd917ad0d715830a6a88c816033; lastvisit=1537086053  

Передать cookie на сервер, как будто они были ранее получены от сервера:

     curl -b lastvisit=1537086053 http://www.example.com/    
  

Чтобы сохранить полученные сookie в файл:

     curl -c cookie.txt http://www.example.com/    
  

Затем можно отправить сохраненные в файле cookie обратно:

     curl -b cookie.txt http://www.example.com/catalog/    
  

Файл cookie.txt
имеет вид:

  # Netscape HTTP Cookie File
# https://curl.haxx.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.

www.example.com FALSE / FALSE 0 lastvisit 1537085301
www.example.com FALSE / FALSE 1568621304 visitor 60f7c17ba4b5d77975dfd020f06ac8ca
www.example.com FALSE / FALSE 0 PHPSESSID p23cr2d14rlgj5kls58kd7l6a6  

Получение и отправка заголовков

По умолчанию, заголовки ответа сервера не показываются. Но это можно исправить:

     curl -i google.com    



<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>
</BODY></HTML>  

Если содержимое страницы не нужно, а интересны только заголовки (будет отправлен HEAD
запрос):

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

HTTP/1.1 200 OK
Date: Sun, 16 Sep 2018 08:20:52 GMT
Server: Apache/2.4.34 (Win64) mod_fcgid/2.3.9
X-Powered-By: PHP/7.1.10
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: PHPSESSID=svn7eb593i8d2gv471rs94og58; path=/
Set-Cookie: visitor=fa867bd917ad0d715830a6a88c816033; expires=Mon, 16-Sep-2019 08:20:53 GMT; Max-Age=31536000; path=/
Set-Cookie: lastvisit=1537086053; path=/
Content-Length: 132217
Content-Type: text/html; charset=utf-8  
     curl -v google.com    
  
  • Строка, начинающаяся с >
    означает заголовок, отправленный серверу
  • Строка, начинающаяся с <
    означает заголовок, полученный от сервера
  • Строка, начинающаяся с *
    означает дополнительные данные от CURL
  * Rebuilt URL to: http://google.com/
* Trying 173.194.32.206.
* TCP_NODELAY set
* Connected to google.com (173.194.32.206) port 80 (#0)  
  <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>
</BODY></HTML>  
  * Connection #0 to host google.com left intact  

Если этой информации недостаточно, можно использовать опции --trace
или --trace-ascii
.

А вот так можно отправить свой заголовок:

   

Отправка данных методом POST

Команда ниже отправляет POST запрос на сервер аналогично тому, как пользователь, заполнив HTML форму, нажал бы кнопку «Отправить». Данные будут отправлены в формате application/x-www-form-urlencoded
.

     curl -d "key1=value1&key2=value2" http://www.example.com    
  
     curl --data "key1=value1&key2=value2" http://www.example.com    
  

Параметр --data
аналогичен --data-ascii
, для отправки двоичных данных необходимо использовать параметр --data-binary
. Для URL-кодирования полей формы нужно использовать --data-urlencode
.

     curl --data-urlencode "name=Василий" --data-urlencode "surname=Пупкин" http://www.example.com    
  
   

Содержимое файла data.txt
:

  key1=value1&key2=value2  

Массив $_POST
, который будет содержать данные этого запроса:

  Array
(
 [key1] => value1
 [key2] => value2
)  

Пример URL-кодирования данных из файла перед отправкой POST-запроса:

   
  Иванов Иван Иванович  

Массив $_POST
, который будет содержать данные этого запроса:

  Array
(
 [name] = Иванов Иван Иванович
)  

Загрузка файлов методом POST

Для HTTP запроса типа POST существует два варианта передачи полей из HTML форм, а именно, используя алгоритм application/x-www-form-urlencoded
и multipart/form-data
. Алгоритм первого типа создавался давным-давно, когда в языке HTML еще не предусматривали возможность передачи файлов через HTML формы.

Со временем возникла необходимость через формы отсылать еще и файлы. Тогда консорциум W3C взялся за доработку формата POST запроса, в результате чего появился документ RFC 1867. Форма, которая позволяет пользователю загрузить файл, используя алгоритм multipart/form-data
, выглядит примерно так:

     <form = = =>    

    <input = =>    

    <input = = =>    

  

Чтобы отправить на сервер данные такой формы:

   

Скрипт upload.php
, который принимает данные формы:

  
  
  Array
(
 [submit] => OK
)
Array
(
 [upload] => Array
 (
 [name] => image.jpg
 [type] => image/jpeg
 [tmp_name] => D:\work\temp\phpB02F.tmp
 [error] => 0
 [size] => 2897
 )
)  

Работа по протоколу FTP

   

Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней:

:/>  Установка и настройка KMS сервера на базе Windows Server 2012 R2 -

   

Выгрузить файл на FTP-сервер

   

Получить вывод из стандартного ввода и сохранить содержимое на сервере под именем data.txt
:

   

Дополнительно:

Поиск:
CLI
 • CURL
 • Cookie
 • FTP
 • GET
 • HTTP
 • Linux
 • POST
 • URL
 • Web-разработка
 • Windows
 • Форма

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

GNU Wget — консольная программа для загрузки файлов по сети. Поддерживает протоколы HTTP, FTP и HTTPS, а также работу через HTTP прокси-сервер. Программа включена почти во все дистрибутивы Linux. Утилита разрабатывалась для медленных соединений, поэтому она поддерживает докачку файлов при обрыве соединения.

Для работы с Wget под Windows, переходим по ссылке
и скачиваем файл wget.exe
. Создаем директорию C:\Program Files\Wget-Win64
и размещаем в ней скачанный файл. Для удобства работы добавляем в переменную окружения PATH
путь до исполняемого файла.

  
--2018-09-14 10:34:09-- https://home.apache.org/~steffenal/VC15/binaries/httpd-2.4.35-win64-VC15.zip
Resolving home.apache.org (home.apache.org).  163.172.16.173
Connecting to home.apache.org (home.apache.org)|163.172.16.173|:443.  connected.
HTTP request sent, awaiting response.  200 OK
Length: 17856960 (17M) [application/zip]
Saving to: 'httpd-2.4.35-win64-VC15.zip'

httpd-2.4.35-win64-VC15.zip 100%[=================================================>] 17,03M 8,50MB/s in 2,0s

2018-09-14 10:34:12 (8,50 MB/s) - 'httpd-2.4.35-win64-VC15.zip' saved [17856960/17856960]  

Если утилита ругается на сертификаты при скачивании по HTTPS, нужно использовать дополнительную опцию --no-check-certificate
.

Примеры

Загрузка всех URL, указанных в файле (каждая ссылка с новой строки):

     wget -i download.txt    
  

Скачивание файлов в указанный каталог:

     wget -P /path/for/save ftp://ftp.example.org/image.iso    
  

Скачивание файла file.zip
и сохранение под именем archive.zip
:

     wget -O archive.zip http://example.com/file.zip    
  

Продолжить загрузку ранее не полностью загруженного файла:

     wget -c http://example.org/image.iso    
  

Вывод заголовков HTTP серверов и ответов FTP серверов:

     wget -S http://example.org/    
  
     wget -r --no-parent http://example.org/some/archive/    
  

Использование имени пользователя и пароля на FTP/HTTP:

   
   

Отправить POST-запрос в формате application/x-www-form-urlencoded
:

   

Сохранение cookie
в файл cookie.txt
для дальнейшей отправки серверу:

     wget --save-cookie cookie.txt http://example.org/    
  

Сохраненный файл cookie.txt
:

  # HTTP cookie file.
# Generated by Wget on 2018-09-14 11:40:37.
# Edit at your own risk.

example.org FALSE / FALSE 1570196437 visitor 71f61d2a01de1394f60120c691a52c56  

Отправка cookie
, сохраненных ранее в файле cookie.txt
:

     wget --load-cookie cookie.txt http://example.org/    
  
   

Справка по утилите:

  
GNU Wget 1.11.4, программа для загрузки файлов из сети в автономном режиме.
Использование: wget [ОПЦИЯ].  [ URL].    
  -V, --version вывод версии Wget и выход.
 -h, --help вывод этой справки.
 -b, --background после запуска перейти в фоновый режим.
 -e, --execute=КОМАНДА выполнить команду в стиле .wgetrc.

    Журналирование и входной файл:    

 -o, --output-file=ФАЙЛ записывать сообщения в ФАЙЛ.
 -a, --append-output=ФАЙЛ дописывать сообщения в конец ФАЙЛА.
 -d, --debug вывод большого количества отладочной информации.
 -q, --quiet молча (без выходных данных).
 -v, --verbose подробный вывод (по умолчанию).
 -nv, --no-verbose отключение подробного режима, но не полностью.
 -i, --input-file=ФАЙЛ загрузка URL-ов, найденных в ФАЙЛЕ.
 -F, --force-html считать, что входной файл - HTML.
 -B, --base=URL добавление URL в начало относительных ссылок в файле -F -i.


 -t, --tries=ЧИСЛО установить ЧИСЛО повторных попыток (0 без ограничения).
 --retry-connrefused повторять, даже если в подключении отказано.
 -O, --output-document=ФАЙЛ записывать документы в ФАЙЛ.
 -nc, --no-clobber пропускать загрузки, которые приведут к загрузке уже существующих файлов.
 -c, --continue возобновить загрузку частично загруженного файла.
 --progress=ТИП выбрать тип индикатора выполнения.
 -N, --timestamping не загружать повторно файлы, только если они не новее, чем локальные.
 -S, --server-response вывод ответа сервера.
 --spider ничего не загружать.
 -T, --timeout=СЕКУНДЫ установка значений всех тайм-аутов в СЕКУНДЫ.
 --dns-timeout=СЕК установка тайм-аута поиска в DNS в СЕК.
 --connect-timeout=СЕК установка тайм-аута подключения в СЕК.
 --read-timeout=СЕК установка тайм-аута чтения в СЕК.
 -w, --wait=СЕКУНДЫ пауза в СЕКУНДАХ между загрузками.
 --waitretry=СЕКУНДЫ пауза в 1. СЕКУНДЫ между повторными попытками загрузки.
 --random-wait пауза в 0.2*WAIT секунд между загрузками.
 --no-proxy явно выключить прокси.
 -Q, --quota=ЧИСЛО установить величину квоты загрузки в ЧИСЛО.
 --bind-address=АДРЕС привязка к АДРЕСУ (имя хоста или IP) локального хоста.
 --limit-rate=СКОРОСТЬ ограничение СКОРОСТИ загрузки.
 --no-dns-cache отключение кэширования поисковых DNS-запросов.
 --restrict-file-names=ОС ограничение на символы в именах файлов, использование которых допускает ОС.
 --ignore-case игнорировать регистр при сопоставлении файлов и/или каталогов.
 -4, --inet4-only подключаться только к адресам IPv4.
 -6, --inet6-only подключаться только к адресам IPv6.
 --prefer-family=СЕМЕЙСТВО подключаться сначала к адресам указанного семейства, может быть IPv6, IPv4 или ничего.
 --user=ПОЛЬЗОВАТЕЛЬ установить и ftp- и http-пользователя в ПОЛЬЗОВАТЕЛЬ.
 --password=ПАРОЛЬ установить и ftp- и http-пароль в ПАРОЛЬ.


 -nd, --no-directories не создавать каталоги.
 -x, --force-directories принудительно создавать каталоги.
 -nH, --no-host-directories не создавать каталоги как на хосте.
 --protocol-directories использовать имя протокола в каталогах.
 -P, --directory-prefix=ПРЕФИКС сохранять файлы в ПРЕФИКС/.
 --cut-dirs=ЧИСЛО игнорировать ЧИСЛО компонентов удалённого каталога.


 --http-user=ПОЛЬЗОВАТЕЛЬ установить http-пользователя в ПОЛЬЗОВАТЕЛЬ.
 --http-password=ПАРОЛЬ установить http-пароль в ПАРОЛЬ.
 --no-cache отвергать кэшированные сервером данные.
 -E, --html-extension сохранять HTML-документы с расширением .html.
 --ignore-length игнорировать поле заголовка Content-Length.
 --header=СТРОКА вставить СТРОКУ между заголовками.
 --max-redirect максимально допустимое число перенаправлений на страницу.
 --proxy-user=ПОЛЬЗОВАТЕЛЬ установить ПОЛЬЗОВАТЕЛЯ в качестве имени пользователя для прокси.
 --proxy-password=ПАРОЛЬ установить ПАРОЛЬ в качестве пароля для прокси.

 --referer=URL включить в HTTP-запрос заголовок Referer: URL.
 --save-headers сохранять HTTP-заголовки в файл.
 -U, --user-agent=АГЕНТ идентифицировать себя как АГЕНТ вместо Wget/ВЕРСИЯ.
 --no-http-keep-alive отключить поддержание активности HTTP (постоянные подключения).
 --no-cookies не использовать кукисы.
 --load-cookies=ФАЙЛ загрузить кукисы из ФАЙЛА перед сеансом.
 --save-cookies=ФАЙЛ сохранить кукисы в ФАЙЛ после сеанса.
 --keep-session-cookies загрузить и сохранить кукисы сеанса (непостоянные).
 --post-data=СТРОКА использовать метод POST;  отправка СТРОКИ в качестве данных.
 --post-file=ФАЙЛ использовать метод POST; отправка содержимого ФАЙЛА.
 --content-disposition Учитывать заголовок Content-Disposition при выборе имён для
 локальных файлов (ЭКСПЕРИМЕНТАЛЬНЫЙ).
 --auth-no-challenge Отправить базовые данные аутентификации HTTP
 не дожидаясь ответа от сервера.

    Опции HTTPS (SSL/TLS):    

 --secure-protocol=ПР выбор безопасного протокола: auto, SSLv2, SSLv3 или TLSv1.
 --no-check-certificate не проверять сертификат сервера.
 --certificate=FILE файл сертификата пользователя.
 --certificate-type=ТИП тип сертификата пользователя: PEM или DER.
 --private-key=ФАЙЛ файл секретного ключа.
 --private-key-type=ТИП тип секретного ключа: PEM или DER.
 --ca-certificate=ФАЙЛ файл с набором CA.
 --ca-directory=КАТ каталог, в котором хранится список CA.
 --random-file=ФАЙЛ файл со случайными данными для SSL PRNG.
 --egd-file=ФАЙЛ файл, определяющий сокет EGD со случайными данными.


 --ftp-user=ПОЛЬЗОВАТЕЛЬ установить ftp-пользователя в ПОЛЬЗОВАТЕЛЬ.
 --ftp-password=ПАРОЛЬ установить ftp-пароль в ПАРОЛЬ.
 --no-remove-listing не удалять файлы файлы .listing.
 --no-glob выключить маски для имён файлов FTP.
 --no-passive-ftp отключить "пассивный" режим передачи.
 --retr-symlinks при рекурсии загружать файлы по ссылкам (не каталоги).
 --preserve-permissions сохранять права доступа удалённых файлов.


 -r, --recursive включение рекурсивной загрузки.
 -l, --level=ЧИСЛО глубина рекурсии (inf и 0 - бесконечность).
 --delete-after удалять локальные файлы после загрузки.
 -k, --convert-links делать ссылки локальными в загруженном HTML.
 -K, --backup-converted перед преобразованием файла X делать резервную копию X.orig.
 -m, --mirror короткая опция, эквивалентная -N -r -l inf --no-remove-listing.
 -p, --page-requisites загрузить все изображения и проч., необходимые для отображения HTML-страницы.
 --strict-comments включить строгую (SGML) обработку комментариев HTML.

    Разрешения/запреты при рекурсии:    

 -A, --accept=СПИСОК список разрешённых расширений, разделённых запятыми.
 -R, --reject=СПИСОК список запрещённых расширений, разделённых запятыми.
 -D, --domains=СПИСОК список разрешённых доменов, разделённых запятыми.
 --exclude-domains=СПИСОК список запрещённых доменов, разделённых запятыми.
 --follow-ftp следовать по ссылкам FTP в HTML-документах.
 --follow-tags=СПИСОК список используемых тегов HTML, разделённых запятыми.
 --ignore-tags=СПИСОК список игнорируемых тегов HTML, разделённых запятыми.
 -H, --span-hosts заходить на чужие хосты при рекурсии.
 -L, --relative следовать только по относительным ссылкам.
 -I, --include-directories=СПИСОК список разрешённых каталогов.
 -X, --exclude-directories=СПИСОК список исключаемых каталогов.
 -np, --no-parent не подниматься в родительский каталог;   

Дополнительно

Поиск:
CLI
 • Cookie
 • FTP
 • HTTP
 • HTTPS
 • Linux
 • POST
 • Web-разработка
 • Windows
 • wget
 • Форма

:/>  Sublime Text - Tools &gt; Build System &gt; New Build System · GitHub

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Оставьте комментарий