【问题标题】:Checking curl response code and returning results from inside a bash function检查 curl 响应代码并从 bash 函数内部返回结果
【发布时间】:2021-12-23 05:04:25
【问题描述】:

我有一个 bash 脚本,它对同一服务的许多不同端点进行大量 RESTful HTTP 调用(通过curl)。我想编写一个 bash 函数来发出可配置的 curl 请求并验证状态是否为 HTTP 200。如果不是,则整个脚本应该退出并显示错误代码。如果是,该函数应返回由 REST API 返回的 HTTP 响应所返回的 JSON。

到目前为止我最好的尝试是:

function callServer() {

  payload=$1

  curl --request POST \
    --url https://myservice.example.com \
    --header 'Authorization: $API_KEY' \
    --header 'Content-Type: application/json' \
    --data '$payload' > jsonResp

}

脚本内部的一个示例用法可能是:

$getWidgetsJson=callServer '{"flim":"flam"}'

或:

$launchMissiles=callServer '{"fizz":"buzz","num":50}'

我想我已经很近了,但我无法从这里的树木中看到森林。如何在 curl 中检查响应的 200 状态,然后使脚本失败或相应地从函数返回 JSON?

【问题讨论】:

  • curl 可能会根据是否成功(200)设置退出代码($?

标签: bash curl jq


【解决方案1】:

你可以使用:

  1. --output 用于指定输出文件名的选项
  2. --write-out 获取 HTTP 代码响应的选项

像这样:

#! /bin/bash

function callServer() {

  local API_KEY="$1"
  local PAYLOAD="$2"
  local OUTPUT_FILENAME="$3"
  local -n HTTP_RESPONSE_CODE="$4"

  HTTP_RESPONSE_CODE=$(curl --request POST \
    --url https://myservice.example.com \
    --header "Authorization: ${API_KEY}" \
    --header 'Content-Type: application/json' \
    --data "${PAYLOAD}" \
    --output "${OUTPUT_FILENAME}" \
    --write-out "%response_code" \
  )

}

declare HTTP_CODE=
callServer "theApikey" '{"flim":"flam"}' "theOutputFileName" HTTP_CODE

echo "The HTTP code is ${HTTP_CODE}"
echo "Filename content:"
cat theOutputFileName
echo "."

【讨论】:

  • 感谢@Arnaud (+1) - 我可以看到这个callServer 函数的示例调用吗?我想知道它实际上返回了什么,--output jsonResp 是否意味着我需要将所有 JSON 结果保存到我的文件系统上的实际 file 中,或者 JSON 和响应代码是否都可以以某种方式一起归还?
  • @hotmeatballsoup 我已经更新了我的答案。希望你现在有一个完整的答案
  • 如果你想得到 HTTP 代码和 JSON 结果,你需要使用一个真实的 JSON 结果文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 2021-09-06
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多