Unix 터미널에서 "Curl" 명령을 사용하여 웹 서비스를 호출할 때 오류 발생

Unix 터미널에서 "Curl" 명령을 사용하여 웹 서비스를 호출할 때 오류 발생

내 스크립트에서 웹 서비스를 호출하는 명령을 사용하려고 했습니다 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

답변2

어떤 쉘을 사용하고 있는지 모르겠지만 bash를 사용하여 \\줄을 계속하면 적어도 충돌이 발생합니다. 시도 \해봐.

WRT XML 삭제, 온라인 유효성 검사기를 사용하여 가지고 있는 내용을 확인하세요(예를 들어 이) 그것을 사용하십시오.

관련 정보