Php. curl. как отправить данные методом post?

Proxy

curl supports both HTTP and SOCKS proxy servers, with optional authentication.
It does not have special support for FTP proxy servers since there are no
standards for those, but it can still be made to work with many of them. You
can also use both HTTP and SOCKS proxies to transfer files to and from FTP
servers.

Get an ftp file using an HTTP proxy named my-proxy that uses port 888:

Get a file from an HTTP server that requires user and password, using the
same proxy as above:

Some proxies require special authentication. Specify by using -U as above:

A comma-separated list of hosts and domains which do not use the proxy can be
specified as:

If the proxy is specified with instead of or , then
curl will use HTTP/1.0 instead of HTTP/1.1 for any attempts.

curl also supports SOCKS4 and SOCKS5 proxies with and .

See also the environment variables Curl supports that offer further proxy
control.

Most FTP proxy servers are set up to appear as a normal FTP server from the
client’s perspective, with special commands to select the remote FTP server.
curl supports the , and options that can be used to
set up transfers through many FTP proxies. For example, a file can be uploaded
to a remote FTP server using a Blue Coat FTP proxy with the options:

See the manual for your FTP proxy to determine the form it expects to set up
transfers, and curl’s option to see exactly what curl is sending.

Simple Usage

Get the main page from Netscape’s web-server:

Get the README file the user’s home directory at funet’s ftp-server:

Get a web page from a server using port 8000:

Get a directory listing of an FTP site:

Get the definition of curl from a dictionary:

Fetch two documents at once:

Get a file off an FTPS server:

or use the more appropriate FTPS way to get the same file:

Get a file from an SSH server using SFTP:

Get a file from an SSH server using SCP using a private key (not
password-protected) to authenticate:

Get a file from an SSH server using SCP using a private key
(password-protected) to authenticate:

Get the main page from an IPv6 web server:

Get a file from an SMB server:

Cookies

9.1 Cookie Basics

The way the web browsers do «client side state control» is by using
cookies. Cookies are just names with associated contents. The cookies are
sent to the client by the server. The server tells the client for what path
and host name it wants the cookie sent back, and it also sends an expiration
date and a few more properties.

When a client communicates with a server with a name and path as previously
specified in a received cookie, the client sends back the cookies and their
contents to the server, unless of course they are expired.

Many applications and servers use this method to connect a series of requests
into a single logical session. To be able to use curl in such occasions, we
must be able to record and send back cookies the way the web application
expects them. The same way browsers deal with them.

9.2 Cookie options

The simplest way to send a few cookies to the server when getting a page with
curl is to add them on the command line like:

 curl --cookie "name=Daniel" http://www.example.com

Cookies are sent as common HTTP headers. This is practical as it allows curl
to record cookies simply by recording headers. Record cookies with curl by
using the —dump-header (-D) option like:

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

(Take note that the —cookie-jar option described below is a better way to
store cookies.)

Curl has a full blown cookie parsing engine built-in that comes in use if you
want to reconnect to a server and use cookies that were stored from a
previous connection (or hand-crafted manually to fool the server into
believing you had a previous connection). To use previously stored cookies,
you run curl like:

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

Curl’s «cookie engine» gets enabled when you use the —cookie option. If you
only want curl to understand received cookies, use —cookie with a file that
doesn’t exist. Example, if you want to let curl understand cookies from a
page and follow a location (and thus possibly send back cookies it received),
you can invoke it like:

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

Curl has the ability to read and write cookie files that use the same file
format that Netscape and Mozilla once used. It is a convenient way to share
cookies between scripts or invokes. The —cookie (-b) switch automatically
detects if a given file is such a cookie file and parses it, and by using the
—cookie-jar (-c) option you’ll make curl write a new cookie file at the end
of an operation:

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

Предварительные сведения

Протокол HTTP

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

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

URL

URL (Uniform Resource Locator — единый указатель ресурса) задает адрес определенного ресурса в Интернет. Например, URL веб-страницы cURL, записывается так: .

Формы

Формы представляют собой наборы полей, размещенные на веб-странице. Пользователь вводит в эти поля данные, затем нажимает на кнопку «OK» или «Отправить», после чего данные отправляются на сервер. Сервер принимает данные и решает, как поступить дальше: искать ли информацию в базе данных, показать ли введенный адрес на карте или использовать информацию для аутентификации пользователя. Разумеется, «решает» — означает, что на стороне сервера должна быть какая-то программа, которая принимает и обрабатывает присланные данные. Простейший пример: форма запроса поисковика Google.

Справка

Справку по curl можно получить, набрав в командной строке

$ curl --help

или

$ curl --manual

— приглашение командной строки.

16 ответов

Вам необходимо установить тип контента для application /json. Но отправляет Content-Type , что недопустимо на стороне Spring.

Глядя на справочную страницу curl , я думаю, что вы можете использовать :

Полный пример:

( — это сокращение от , для )

Обратите внимание, что является необязательным , если вы используете , так как флаг подразумевает запрос POST. В Windows все немного по-другому

Смотрите ветку комментариев

В Windows все немного по-другому. Смотрите ветку комментариев.

Попробуйте поместить свои данные в файл, скажем , а затем используйте

Это сработало для меня, используя:

Он был успешно сопоставлен с контроллером Spring:

— это простое POJO со свойством id.

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

То есть следующее не сработало:

Но сработало следующее:

В качестве примера создайте файл JSON, params.json, и добавьте в него это содержимое:

Затем вы запускаете эту команду:

Это хорошо сработало для меня.

Где

Означает глагол http.

Означает данные, которые вы хотите отправить.

Я просто столкнулся с той же проблемой. Я мог бы решить это, указав

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

  1. Установите и запустите Почтальон
  2. введите свой URL, текст сообщения, заголовки запроса и т. д.
  3. Нажмите
  4. Выберите из раскрывающегося списка
  5. копия & вставьте свою команду

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

Если вы тестируете много JSON-рассылок /ответов по интерфейсу RESTful, вы можете проверить Плагин для Chrome (который позволяет вручную определять тесты веб-служб) и его основанный на Node.js Newman компаньон командной строки (который позволяет автоматизировать тесты для» коллекций «тестов Postman.) Как бесплатно, так и открыто!

Это хорошо сработало для меня, кроме того, с помощью BASIC-аутентификации:

Конечно, вы никогда не должны использовать BASIC-аутентификацию без SSL и проверенного сертификата.

Сегодня я столкнулся с этим снова, используя Cygwin cURL 7.49.1 для Windows … И при использовании или с аргументом JSON, cURL запутался и интерпретировал в JSON в качестве шаблона URL. Добавление аргумента для отключения cURL-глобинга исправило это.

См. также Передача URL с квадратными скобками в curl .

Немного опоздал на вечеринку, но я не вижу, чтобы это было опубликовано, поэтому здесь вы можете также поместить свой json в файл и передать его в curl, используя опцию —file-upload через стандартный ввод, например

Это сработало для меня:

HTTPie является рекомендуемой альтернативой потому что вы можете сделать только

Он говорит по-JSON по умолчанию и будет обрабатывать как установку необходимого вам заголовка, так и кодирование данных в качестве допустимого JSON. Также есть:

для заголовков и

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

Я использую приведенный ниже формат для тестирования с веб-сервером.

Давайте предположим, что этот формат JSON dict:

Полный пример

Вы можете передать расширение нужного формата в качестве конца URL.
например, http: //localhost: 8080 /xx /xxx /xxxx .json

или

http: //localhost: 8080 /xx /xxx /xxxx . XML

Примечание: вам нужно добавить в ваш pom зависимости Джексона и jaxb maven.

Persistent Connections

Specifying multiple files on a single command line will make curl transfer all
of them, one after the other in the specified order.

libcurl will attempt to use persistent connections for the transfers so that
the second transfer to the same host can use the same connection that was
already initiated and was left open in the previous transfer. This greatly
decreases connection time for all but the first transfer and it makes a far
better use of the network.

Note that curl cannot use persistent connections for transfers that are used
in subsequence curl invokes. Try to stuff as many URLs as possible on the same
command line if they are using the same host, as that’ll make the transfers
faster. If you use an HTTP proxy for file transfers, practically all transfers
will be persistent.

Metalink

Curl supports Metalink (both version 3 and 4 (RFC 5854) are supported), a way
to list multiple URIs and hashes for a file. Curl will make use of the mirrors
listed within for failover if there are errors (such as the file or server not
being available). It will also verify the hash of the file after the download
completes. The Metalink file itself is downloaded and processed in memory and
not stored in the local file system.

Example to use a remote Metalink file:

To use a Metalink file in the local file system, use FILE protocol
():

Please note that if FILE protocol is disabled, there is no way to use a local
Metalink file at the time of this writing. Also note that if and
are used together, will be ignored. This is because
including headers in the response will break Metalink parser and if the
headers are included in the file described in Metalink file, hash check will
fail.

13. Отладка

Часто бывает так, что сайт реагирует на запросы curl не так, как
на запросы браузера. В этом случае нужно максимально уподобить curl
браузеру:

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

  • Убедитесь, что вы проверяете на
    cookies и используете их при необходимости (ключ чтения -b и
    сохранения -c)

  • Укажите в поле ‘user-agent’ один
    из последних популярных браузеров

  • Заполните поле ‘referer’ как это
    делает браузер

  • Если вы используете POST-запросы, убедитесь, что все поля
    передаются в том же порядке, что и браузер (см. выше, пункт 4.5)

Хороший помощник в этом нелегком деле — плагин для Mozilla/Firefox
,
который позволяет просматривать все заголовки, которые отправляет и
принимает этот браузер (даже при использовании HTTPS).

Более низкоуровневый подход — захват HTTP-траффика в сети с
помощью программ, таких как ethereal или tcpdump, с последующим
анализом, какие заголовки были получены и отправлены браузером (HTTPS
делает этот подход неэффективным).

IPv6

curl will connect to a server with IPv6 when a host lookup returns an IPv6
address and fall back to IPv4 if the connection fails. The and
options can specify which address to use when both are
available. IPv6 addresses can also be specified directly in URLs using the
syntax:

When this style is used, the option must be given to stop curl from
interpreting the square brackets as special globbing characters. Link local
and site local addresses including a scope identifier, such as ,
may also be used, but the scope portion must be numeric or match an existing
network interface on Linux and the percent character must be URL escaped. The
previous example in an SFTP URL might look like:

IPv6 addresses provided other than in URLs (e.g. to the ,
or options) should not be URL encoded.

Using Passwords

To ftp files using name+passwd, include them in the URL like:

or specify them with the -u flag like

It is just like for FTP, but you may also want to specify and use SSL-specific
options for certificates etc.

Note that using as prefix is the «implicit» way as described in the
standards while the recommended «explicit» way is done by using FTP:// and the
option.

This is similar to FTP, but you can use the option to specify a
private key to use instead of a password. Note that the private key may itself
be protected by a password that is unrelated to the login password of the
remote system; this password is specified using the option.
Typically, curl will automatically extract the public key from the private key
file, but in cases where curl does not have the proper library support, a
matching public key file must be specified using the option.

HTTP

Curl also supports user and password in HTTP URLs, thus you can pick a file
like:

or specify user and password separately like in

HTTP offers many different methods of authentication and curl supports
several: Basic, Digest, NTLM and Negotiate (SPNEGO). Without telling which
method to use, curl defaults to Basic. You can also ask curl to pick the most
secure ones out of the ones that the server accepts for the given URL, by
using .

Note! According to the URL specification, HTTP URLs can not contain a user
and password, so that style will not work when using curl via a proxy, even
though curl allows it at other times. When using a proxy, you must use the
style for user and password.

Cookies

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

Когда клиент соединяется с сервером по адресу, указанному в
принятом cookie, клиент посылает этот cookie к серверу (если время
жизни не истекло).

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

Простейший способ отправить cookie к серверу при получении
страницы с помощью curl, это добавить соответствующий ключ в
командной строке:

        # curl -b "name=Daniel" www.cookiesite.com

Cookies отправляются как обычные HTTP-заголовки. Это позволяет curl
сохранять cookies, сохраняя заголовки. Сохранение cookies с помощью
curl выполняется командой:

        # curl -D headers_and_cookies www.cookiesite.com

(кстати, для сохранения cookies лучше использовать ключ -c, об этом
ниже).

У curl имеется полнофункциональный обработчик cookies, который
полезен, когда вы хотите соединиться в очередной раз к серверу и
использовать cookies, сохраненные в прошлый раз (либо подработанные
вручную). Для использования cookies, сохраненных в файле, вызовите
curl так:

        # curl -b stored_cookies_in_file www.cookiesite.com

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

        # curl -b nada -L www.cookiesite.com

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

        # curl -b cookies.txt -c newcookies.txt www.cookiesite.com

Config File

Curl automatically tries to read the file (or file on
Microsoft Windows systems) from the user’s home dir on startup.

The config file could be made up with normal command line switches, but you
can also specify the long options without the dashes to make it more
readable. You can separate the options and the parameter with spaces, or with
or . Comments can be used within the file. If the first letter on a
line is a -symbol the rest of the line is treated as a comment.

If you want the parameter to contain spaces, you must enclose the entire
parameter within double quotes (). Within those quotes, you specify a quote
as .

NOTE: You must specify options and their arguments on the same line.

Example, set default time out and proxy in a config file:

White spaces ARE significant at the end of lines, but all white spaces leading
up to the first characters of each line are ignored.

Prevent curl from reading the default file by using -q as the first command
line parameter, like:

Force curl to get and display a local help page in case it is invoked without
URL by making a config file similar to:

You can specify another config file to be read by using the /
flag. If you set config file name to it’ll read the config from stdin,
which can be handy if you want to hide options from being visible in process
tables etc:

Fetch a page

3.1 GET

The simplest and most common request/operation made using HTTP is to GET a
URL. The URL could itself refer to a web page, an image or a file. The client
issues a GET request to the server and receives the document it asked for.
If you issue the command line

 curl https://curl.haxx.se

you get a web page returned in your terminal window. The entire HTML document
that that URL holds.

All HTTP replies contain a set of response headers that are normally hidden,
use curl’s —include (-i) option to display them as well as the rest of the
document.

3.2 HEAD

You can ask the remote server for ONLY the headers by using the —head (-I)
option which will make curl issue a HEAD request. In some special cases
servers deny the HEAD method while others still work, which is a particular
kind of annoyance.

The HEAD method is defined and made so that the server returns the headers
exactly the way it would do for a GET, but without a body. It means that you
may see a Content-Length: in the response headers, but there must not be an
actual body in the HEAD response.

3.3 Multiple URLs in a single command line

A single curl command line may involve one or many URLs. The most common case
is probably to just use one, but you can specify any amount of URLs. Yes
any. No limits. You’ll then get requests repeated over and over for all the
given URLs.

Example, send two GETs:

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

If you use —data to POST to the URL, using multiple URLs means that you send
that same POST to all the given URLs.

Example, send two POSTs:

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

3.4 Multiple HTTP methods in a single command line

Sometimes you need to operate on several URLs in a single command line and do
different HTTP methods on each. For this, you’ll enjoy the —next option. It
is basically a separator that separates a bunch of options from the next. All
the URLs before —next will get the same method and will get all the POST
data merged into one.

When curl reaches the —next on the command line, it’ll sort of reset the
method and the POST data and allow a new set.

Perhaps this is best shown with a few examples. To send first a HEAD and then
a GET:

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

To first send a POST and then a GET:

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

Формы

Формы — основной способ представления web-сайта как HTML-страницы
с полями, в которые пользователь вводит данные, и затем нажимает на
кнопку ‘OK’ или ‘Отправить’, после чего данные отсылаются на сервер.
Затем сервер использует принятые данные и решает, как действовать
дальше: искать информацию в базе данных, показать введенный адрес на
карте, добавить сообщение об ошибке или использовать информацию для
аутентификации пользователя. Разумеется, на стороне сервера имеется
какая-то программа, которая принимает ваши данные.

4.1 GET

GET-форма использует метод GET, например следующим образом:

Если вы откроете этот код в вашем браузере, вы увидите форму с
текстовым полем и кнопку с надписью «OK». Если вы введете
‘1905’ и нажмете OK, браузер создаст новый URL, по которому и
проследует. URL будет представляться строкой, состоящей из пути
предыдущего URL и строки, подобной
«junk.cgi?birthyear=1905&press=OK».

Например, если форма располагалась по адресу
«www.hotmail.com/when/birth.html», то при нажатии на кнопку
OK вы попадете на URL
«www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK».

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

Чтобы curl сформировал GET-запрос, просто введите то, что
ожидалось от формы:

        # curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"

4.2 POST

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

Протокол HTTP предоставляет метод POST. С помощью него клиент
отправляет данные отдельно от URL и поэтому вы не увидете их в
адресной строке.

Форма, генерирующая POST-запрос, похожа на предыдущую:

Curl может сформировать POST-запрос с теми же данными следующим
образом:

        # curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi

Этот POST-запрос использует ‘Content-Type
application/x-www-form-urlencoded’, это самый широко используемый
способ.

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

4.3 Загрузка файлов с помощью POST (File Upload POST)

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

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

Заметьте, что тип содержимого Content-Type установлен в
multipart/form-data.

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

        # curl -F upload=@localfilename -F press=OK 

4.4 Скрытые поля

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

Простой пример формы с одним видимым полем, одним скрытым и
кнопкой ОК:

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

        # curl -d "birthyear=1905&press=OK&person=daniel" 

4.5 Узнать, как выглядит POST-запрос

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

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

Вы увидите, что данные присоединились к URL, отделенные символами
‘?’, как и предполагается при использовании GET-форм.

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

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

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

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

> 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

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

> 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
Ссылка на основную публикацию