curl 命令有效负载中字符串的脚本连接



我使用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设置为"John Doe"(

但是我从服务器返回了一个异常,因为curl命令中的有效负载似乎已切断、不完整或格式不正确。

JSON parse error: Unexpected end-of-input in VALUE_STRINGn at [Source: 
java.io.PushbackInputStream@2eda6052; line: 1, column: 293]; nested 
exception is com.fasterxml.jackson.databind.JsonMappingException: 
Unexpected end-of-input in VALUE_STRINGn 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"])"

如果我在上面的curl命令中对displayName值进行硬编码(如下所示(,则用户创建请求将通过并完美运行。

"displayName": "John Doe", 

我怀疑这与displayName中的空格以及我如何使用"'$NEWUSERDISPLAYNAME'"插入displayName值有关。是否有一种安全的方法可以在curl命令的 POST 请求有效负载中执行变量替换?

你需要引用 shell 变量:

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"

只需使用

$(回声$varname(

为我工作

最新更新