通过curl在JSON字符串中提供二进制内容

f8rj6qna  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(131)

我正在尝试使用bash和cURL中的Yandex.Cloud function API
为了实现这一点,我编写了一个如下所示的JSON:

#Make header
IAM_TOKEN="myToken"
HEADER="Authorization: Bearer ${IAM_TOKEN}"

#Make data JSON
DATA=""
for ELEMENT in \
  "'"\
  '{"runtime":"dotnetcore31", "entrypoint": "Function.Handler",'\
  '"resources":{"memory":"134217728"}, "content": "PLACEHOLDERFORCONTENT",'\
  '"ServiceAccountId":"accId", '\
  '"function_id": "funcId"}'\
  "'"; do
  DATA+="${ELEMENT}"
done

然后,我需要按照API的建议,在JSON中提供部署包的内容:

在我的例子中,它是一个带有函数代码的zip压缩文件。因此,我以字节的形式读取文件,并将结果注入到JSON字符串中。然后发送请求。

#Read file content
FILE_LOC="/Users/Constantine/Downloads/archiveName.zip"
FILE_BYTES=`(xxd -b ${FILE_LOC}) | base64`

#Inject content into JSON
DATA=${DATA/PLACEHOLDERFORCONTENT/$FILE_BYTES}

#Send the request
eval "$(echo curl -H \"$HEADER\" --data-binary $DATA https://serverless-functions.api.cloud.yandex.net/functions/v1/versions)"

在这里,我得到了**-bash:/usr/bin/ curl :参数列表太长**错误。我怀疑这是因为cURL将二进制内容解释为要读取的文件名,但我不知道如何解决这个问题。
如何将文件中的二进制内容提供到JSON字符串中?

xqnpmsa8

xqnpmsa81#

您正在使用bash下的cURL调用发送请求。并且shell有一个最大行长度,您已经大大超过了这个长度。最简单的解决方法是将JSON数据保存到一个文件中,并为cURL提供一个指向该文件的指针,这样行长度就可以保持不变:

#Make data JSON
data_file="data.json"
> "${data_file}"
for ELEMENT in \
  "'"\
  '{"runtime":"dotnetcore31", "entrypoint": "Function.Handler",'\
  '"resources":{"memory":"134217728"}, "content": "PLACEHOLDERFORCONTENT",'\
  '"ServiceAccountId":"accId", '\
  '"function_id": "funcId"}'\
  "'"; do
  echo "${ELEMENT}"
done >> "${data_file}"

#Read file content
FILE_LOC="/Users/Constantine/Downloads/archiveName.zip"
FILE_BYTES=$(xxd -b "${FILE_LOC}" | base64)

#Inject content into JSON
sed -i "s/PLACEHOLDERFORCONTENT/${FILE_BYTES}/" "${data_file}"

#Send the request
eval "$(echo curl -H \"$HEADER\" --data-binary "@${data_file}" https://serverless-functions.api.cloud.yandex.net/functions/v1/versions)"

除此之外,你的代码看起来很复杂,你可以简化一下,避免循环,一次创建文件,避免eval

#Make data JSON
data_file="data.json"
FILE_LOC="/Users/Constantine/Downloads/archiveName.zip"

cat <<-EOF > "${data_file}"
  {
    "runtime": "dotnetcore31", 
    "entrypoint": "Function.Handler", 
    "resources": {
      "memory": "134217728"
    }, 
    "content": "$(xxd -b "${FILE_LOC}" | base64)",
    "ServiceAccountId": "accId", 
    "function_id": "funcId"
  }
EOF

#Send the request
curl -H "$HEADER" --data-binary "@${data_file}" https://serverless-functions.api.cloud.yandex.net/functions/v1/versions

相关问题