Как запустить команду curl с заголовками, используя скрипт оболочки - PullRequest
0 голосов
/ 26 июня 2018

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

counter=1
H1='Content-Type: application/json'
H2='Accept: application/json'
H3='Authorization: Bearer a0a9bb26-bb7d-3645-9679-2cd72e2b4c57'
URL='http://localhost:8280/mbrnd_new/v1/post'

while [ $counter -le 10 ]

do

TEST="curl -X POST --header $H1 --header $H2 --header $H3 -d @s_100mb.xml $URL"
echo $TEST
RESPONSE=`$TEST`
echo $RESPONSE
sleep 5
done
echo "All done"

Выдает ошибку как

curl: (6) Could not resolve host: application
curl: (6) Could not resolve host: Bearer
curl: (6) Could not resolve host: a0a9bb26-bb7d-3645-9679-2cd72e2b4c57
<ams:fault xmlns:ams="http://wso2.org/apimanager/security"><ams:code>900902</ams:code><ams:message>Missing Credentials</ams:message><ams:description>Required OAuth credentials not provided. Make sure your API invocation call has a header: "Authorization: Bearer ACCESS_TOKEN"</ams:description></ams:fault>

Указанный токен доступа идругие параметры заголовка верны.Это работает нормально, когда 'curl' вызывается напрямую.

Я пробовал разные методы, например использование \ ", но ничего не получалось. Буду признателен, если кто-нибудь сможет дать правильный ответ на этот вопрос.

Спасибо.

1 Ответ

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

Команда, которую вы хотите выполнить, выглядит примерно так:

curl -X POST --header "$H1" --header "$H2" --header "$H3" -d @s_100mb.xml "$URL"

(я буду использовать -H вместо --header, поскольку оно короче.)

Самый простой способ сделать это -

response=$(curl -X POST -H "$H1" -H "$H2" -H "$H3" -d @s_100mb.xml "$URL")

Проблема с вашим решением состоит в том, что вы вообще не разделяете значения заголовка:

curl -X POST -H $H1

Если содержимое H1 равно foo: bar, то оно будет расширено до

curl -X POST -H foo bar

и это будет интерпретироваться как

curl -X POST -H (foo:) bar

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

То, что вы хотите, это

curl -X POST -H (foo: bar)

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

Также, вы должны предпочесть $ (cmd) вместо `cmd` .

В качестве последнего совета, если вы изучаете, как использовать оболочку, возможно, стоит избегать многократных расширений, т.е. не сохраняйте вашу команду в переменной CMD, чтобы $($CMD) ее позже, так как это приводит к множественным расширениям в нескольких местах (первое, где был назначен CMD, второе, когда CMD было развернуто в подоболочке $(...)), что затрудняет понимание того, что происходит, черт возьми.

...