Unix端末で「Curl」コマンドを使用してWebサービスを呼び出すときにエラーが発生する

Unix端末で「Curl」コマンドを使用してWebサービスを呼び出すときにエラーが発生する

私のスクリプトでWebサービスを呼び出すコマンドを使用しようとしましたCurl。そこから台本を受けました。ここで。

私のスクリプト:

#! /bin/sh

ENDPOINT="http://mathertel.de/AJAXEngine/S01_AsyncSamples/CalcService.asmx"
VALUE=1234567890
if [ -n "${1}" ]; then
    VALUE=${1}
fi

curl --silent \\
     --data \\
     @- \\
     --header 'Content-Type: application/soap+xml; charset=utf-8' \\
     --user-agent "" \\
     ${ENDPOINT} <<EOF | xmllint --format -
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <CalcPrimeFactors xmlns="http://www.mathertel.de/S01_AsyncSamples/">
      <inputText>${VALUE}</inputText>
    </CalcPrimeFactors>
  </soap12:Body>
</soap12:Envelope>
EOF

次のエラーが発生します。

./CalcService.sh: 10: ./CalcService.sh: --data: not found
./CalcService.sh: 11: ./CalcService.sh: @-: not found
./CalcService.sh: 12: ./CalcService.sh: --header: not found
./CalcService.sh: 13: ./CalcService.sh: --user-agent: not found
./CalcService.sh: 14: ./CalcService.sh: ./CalcService.sh: 14: ./CalcService.sh: http://mathertel.de/AJAXEngine/S01_AsyncSamples/CalcService.asmx: not found
 xmllint: not found

カールをインストールしてインストールしようとしましたが、xmllint破損したパッケージと呼ばれながらインストールされませんでした。

ここで何が起こっているのか、そしてそれを軽減するために何ができるのかという提案がある人はいますか?これは私を狂わせています...

ベストアンサー1

@goldilocksが提案したように、二重バックスラッシュ()を削除し\\て単一のバックスラッシュ()に置き換えることで\問題が解決するようです。以下は修正されたサンプル出力です。

$ ./curl.bash 
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <CalcPrimeFactorsResponse xmlns="http://www.mathertel.de/S01_AsyncSamples/">
      <CalcPrimeFactorsResult>2 3 3 5 3607 3803</CalcPrimeFactorsResult>
    </CalcPrimeFactorsResponse>
  </soap:Body>
</soap:Envelope>

もっと良い方法がありますか?

curlオプションを渡すために使用できる次の構成が提供されます。

#!/bin/bash

{ echo '--opt1'
  echo '--opt2'
  ...
} | curl --config -

したがって、上記の内容を次のように調整できます。

#!/bin/bash

ENDPOINT="http://mathertel.de/AJAXEngine/S01_AsyncSamples/CalcService.asmx"
VALUE=1234567890

if [ -n "${1}" ]; then
    VALUE=${1}
fi

read -r -d '' DATA <<EOF
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <CalcPrimeFactors xmlns="http://www.mathertel.de/S01_AsyncSamples/">
      <inputText>${VALUE}</inputText>
    </CalcPrimeFactors>
  </soap12:Body>
</soap12:Envelope>
EOF

{
echo '--silent'
echo '--header "Content-Type: application/soap+xml; charset=utf-8"'
echo '--user-agent ""'
echo "--url ${ENDPOINT}"
echo '--data-binary @-'
echo "$DATA"
} | curl --config - | xmllint --format -

この設定を使用すると、ペイロードをパラメータ化するのが簡単になり、構成全体を関数にラップしてから含める変数を渡す$DATAことができます。curl

おすすめ記事