Сделайте SOAP-вызов в bash без curl или wget - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь написать bash-скрипт для выполнения SOAP-запроса (и получения ответа).что я могу сделать с

result=$(wget ${url} --post-data="${data}" --header='Content-Type: text/xml;charset=UTF-8'--timeout=${timeout} -qO- --delete-after)

или

result=$(curl --silent --header 'Content-Type: text/xml;charset=UTF-8' --data "${data}" "${url}" --connect-timeout "${timeout}")

, где 'data' - полезная нагрузка XML.

Однако сервер, с которого мне нужно выполнить скрипт,не имеет curl или wget и, вероятно, не имеет других расширенных функций.

Так есть ли способ добиться этого без их использования?Связанный с этим вопрос об использовании стека позволяет предположить, что это возможно, хотя их требования немного отличаются.https://unix.stackexchange.com/questions/83926/how-to-download-a-file-using-just-bash-and-nothing-else-no-curl-wget-perl-et

Спасибо

РЕДАКТИРОВАТЬ: После комментария Nic3500 я провел весь день, читая nc / netcat и пытаясь найти нужные мне документы.Но я получил его, чтобы отправить следующее:

POST <remote_URI> HTTP/1.1\r\n
User-Agent: Wget/1.14 (linux-gnu)\r\n
Accept: */*\r\n
Host: <IP Address>\r\n
Connection: Keep-Alive\r\n
Content-Type: text/xml;charset=UTF-8--timeout=10\r\n
Content-Length: <Content Length>\r\n
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="Core" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <ns1:Dispatch>
      <param0 xsi:type="xsd:string">some data</param0>
      [more params here]
      <param21 xsi:type="xsd:int">1</param21>
    </ns1:Dispatch>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

с использованием

echo ${head} | nc <IP Address> 80

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

1 Ответ

0 голосов
/ 07 июня 2018

Получается, что я был недалек от попытки, которую я предпринял с правкой. Просто был нужен ключ -e команды echo:

POST <remote_URI> HTTP/1.1\r\n
User-Agent: Wget/1.14 (linux-gnu)\r\n
Accept: */*\r\n
Host: <IP Address>\r\n
Connection: Keep-Alive\r\n
Content-Type: text/xml;charset=UTF-8--timeout=10\r\n
Content-Length: <Content Length>\r\n
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="Core" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <SOAP-ENV:Body>
    <ns1:Dispatch>
      <param0 xsi:type="xsd:string">some data</param0>
      [more params here]
      <param21 xsi:type="xsd:int">1</param21>
    </ns1:Dispatch>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Присвоив это переменной данных, затемrunning:

result=$(echo -e "${data}" | nc -w ${timeout} ${url} 80)

Устранена проблема, с которой я столкнулся, так как -e указывает echo интерпретировать разрывы строк, и все проблемы, с которыми я сталкивался при использовании nc, фактически сводились к неправильным окончаниям строк в некотором shapre или форме,Для справки - как видно выше - для данных HTTP нужны окончания строки CRLF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...