Скриптовая конкатенация строк в полезной нагрузке команды curl - PullRequest
0 голосов
/ 30 мая 2018

Я использую curl для тестирования API создания учетной записи пользователя следующим образом:

curl -s -X POST "https://$APISERVER/users" \
-H 'Content-Type: application/json' \
-d '{ \
"username": "'$NEWUSERNAME'", \
"firstName": "'$NEWUSERFIRSTNAME'", \
"lastName": "'$NEWUSERLASTNAME'", \
"displayName": "'$NEWUSERDISPLAYNAME'", \
"password": "'$NEWUSERPASSWORD'" \
}'

и переменные предоставляются через аргументы командной строки:

APISERVER=http://localhost:8080
NEWUSERNAME=$1
NEWUSERPASSWORD=$2
NEWUSERFIRSTNAME=$3
NEWUSERLASTNAME=$4

# Calculated variable
NEWUSERDISPLAYNAME="${NEWUSERFIRSTNAME} ${NEWUSERLASTNAME}"

Пример вызовасценарий выглядит следующим образом: ./test-new-user.sh jdoe Hello123 John Doe, в результате чего получаются следующие значения переменных:

NEWUSERNAME=jdoe
NEWUSERPASSWORD=Hello123
NEWUSERFIRSTNAME=John
NEWUSERLASTNAME=Doe

(я намеревался установить NEWUSERDISPLAYNAME в «Джон Доу»)

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

JSON parse error: Unexpected end-of-input in VALUE_STRING\n at [Source: 
java.io.PushbackInputStream@2eda6052; line: 1, column: 293]; nested 
exception is com.fasterxml.jackson.databind.JsonMappingException: 
Unexpected end-of-input in VALUE_STRING\n at [Source: 
java.io.PushbackInputStream@2eda6052; line: 1, column: 293]\n at 
[Source: java.io.PushbackInputStream@2eda6052; line: 1, column: 142] 
(through reference chain: 
com.mycompany.api.pojos.NewUser[\"displayName\"])"

Если я жестко кодирую значение для displayName в приведенной выше команде curl (как показано ниже) запрос на создание пользователя проходит и отлично работает.

"displayName": "John Doe", \

Я подозреваю, что это связано с пробелом в displayName и тем, как я вставляю значение дляdisplayName с использованием "'$NEWUSERDISPLAYNAME'".Есть ли безопасный способ замены переменных в полезной нагрузке POST-запроса команды curl?

1 Ответ

0 голосов
/ 30 мая 2018

Вам нужно заключить в кавычки переменные оболочки:

curl -s -X POST "https://$APISERVER/users" \
-H 'Content-Type: application/json' \
-d '{ \
"username": "'"$NEWUSERNAME"'", \
"firstName": "'"$NEWUSERFIRSTNAME"'", \
"lastName": "'"$NEWUSERLASTNAME"'", \
"displayName": "'"$NEWUSERDISPLAYNAME"'", \
"password": "'"$NEWUSERPASSWORD"'" \
}'

Чтобы избежать чрезмерного цитирования, попробуйте это printf:

printf -v json -- '{ "username": "%s", "firstName": "%s", "lastName": "%s", "displayName": "%s", "password": "%s" }' \
"$NEWUSERNAME" "$NEWUSERFIRSTNAME" "$NEWUSERLASTNAME" "$NEWUSERDISPLAYNAME" "$NEWUSERPASSWORD"

curl -s -X POST "https://$APISERVER/users" \
    -H 'Content-Type: application/json' \
    -d "$json"
...