Перейти к основному содержимому

Вызов веб-службы SOAP из командной строки

· 4 мин. чтения

1. Обзор

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

2. Веб-служба SOAP

Для запуска примеров в этом посте мы будем использовать веб-службу SOAP, разработанную в предыдущей статье . Короче говоря, у этой службы есть конечная точка, к которой клиенты могут получить доступ, указав название страны в запросе. Сервис отвечает названием столицы страны, населением и валютой.

3. КУРС

Начнем с cURL, потому что это, вероятно, наиболее широко используемый инструмент командной строки для передачи данных по сетевым протоколам. Чтобы протестировать веб-службу SOAP, нам просто нужно сделать HTTP-запросы с SOAP-конвертом в теле запроса .

Для нашего веб-сервиса простой HTTP-запрос POST:

curl -v --request POST --header "Content-Type: text/xml;charset=UTF-8" \
--data \
'<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gs="http://www.foreach.com/springsoap/gen"> \
<soapenv:Header/> \
<soapenv:Body> \
<gs:getCountryRequest> <gs:name>Poland</gs:name> </gs:getCountryRequest> \
</soapenv:Body> \
</soapenv:Envelope>' \
http://localhost:8080/ws

Нам не нужно указывать, что мы используем HTTP, потому что это протокол по умолчанию в cURL. Так как мы тестируем запрос, мы используем подробный режим через опцию -v .

Внутри конверта SOAP мы указываем страну (Польша) и завершаем команду URL-адресом сервера SOAP. Мы установили сервер локально на свой компьютер, используя пример из нашей предыдущей статьи .

Поскольку мы используем параметр -v , мы получаем подробный ответ:

* Connected to localhost (::1) port 8080 (#0)
> POST /ws HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.55.1
> Accept: */*
> Content-Type: text/xml;charset=UTF-8
> Content-Length: 282
>
* upload completely sent off: 282 out of 282 bytes
< HTTP/1.1 200
< Accept: text/xml, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
< SOAPAction: ""
< Content-Type: text/xml;charset=utf-8
< Content-Length: 407
< Date: Sun, 18 Jul 2021 23:46:38 GMT
<
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><SOAP-ENV:Body><ns2:getCountryResponse xmlns:ns
2="http://www.foreach.com/springsoap/gen"><ns2:country><ns2:name>Poland</ns2:name><ns2:population>38186860</ns2:population><ns2:capital>Warsaw
</ns2:capital><ns2:currency>PLN</ns2:currency></ns2:country></ns2:getCountryResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>* Connection #0 to hos
t localhost left intact

Сообщения запросов и ответов для веб-служб SOAP могут быть длинными, поэтому их удобнее хранить в файлах. Если мы сохраним тело запроса в request.xml и перенаправим вывод ответа в файл response.xml , команда в этом случае будет очень простой :

curl --header "Content-Type: text/xml;charset=UTF-8" -d @request.xml -o response.xml http://localhost:8080/ws

Как правило, нет необходимости указывать POST в команде, как мы это делали раньше, потому что это определяется cURL.

Если нам нужно прочитать ответ в терминале, лучше всего передать команду с помощью xmllint , чтобы правильно отформатировать ответ XML :

curl --request POST --header "Content-Type: text/xml;charset=UTF-8" -d @request.xml http://localhost:8080/ws | xmllint --format -
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 725 100 407 100 318 407 318 0:00:01 --:--:-- 0:00:01 15425<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns2:getCountryResponse xmlns:ns2="http://www.foreach.com/springsoap/gen">
<ns2:country>
<ns2:name>Poland</ns2:name>
<ns2:population>38186860</ns2:population>
<ns2:capital>Warsaw</ns2:capital>
<ns2:currency>PLN</ns2:currency>
</ns2:country>
</ns2:getCountryResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

4. Получить

Сделаем тот же запрос с помощью Wget:

wget --post-file=request.xml --header="Content-Type: text/xml" http://localhost:8080/ws -O response.xml

Ответ:

Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:8080... connected.
HTTP request sent, awaiting response... 200
Length: 407 [text/xml]
Saving to: ‘response.xml’

Синтаксис похож на cURL, и мы можем хранить тело запроса и ответа в файлах, как и раньше.

5. HTTPie

Wget и cURL — очень полезные команды для быстрого тестирования SOAP-сервера . Они доступны для всех основных дистрибутивов ОС. Их также можно легко интегрировать со сценариями оболочки.

Преимущество HTTPie заключается в том, что он обеспечивает очень интуитивно понятный способ взаимодействия с веб-службами . Как указано в документации : «HTTPie предназначен для тестирования, отладки и общего взаимодействия с API и HTTP-серверами. Они используют простой и естественный синтаксис и обеспечивают форматированный и раскрашенный вывод».

Давайте выполним простой запрос, который мы делали раньше, на этот раз с использованием HTTPie:

echo '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:gs="http://www.foreach.com/springsoap/gen"> \
<soapenv:Header/> \
<soapenv:Body> \
<gs:getCountryRequest> <gs:name>Poland</gs:name> </gs:getCountryRequest> \
</soapenv:Body> \
</soapenv:Envelope>' | \
http -b POST http://localhost:8080/ws 'Content-Type:text/xml'

Если мы хотим извлечь тело запроса из файла:

http -b POST http://localhost:8080/ws 'Content-Type:text/xml' < request.xml

Это так же просто, как использовать перенаправление ввода файла.

Дополнительные сведения о том, как использовать HTTPie, см. в документации.

6. Резюме

Мы видели простые примеры того, как быстро вызвать веб-службу SOAP из командной строки с помощью cURL, Wget и HTTPie. Мы также сделали краткое сравнение трех инструментов и того, когда их использовать.