简体   繁体   English

如何在 bash 脚本中使用 HTTPie 捕获实际的响应代码和响应正文?

[英]How to capture actual response code and response body with HTTPie in bash script?

I have a bash script to call several APIs using HTTPie.我有一个 bash 脚本来使用 HTTPie 调用多个 API。 I want to capture both the response body AND the HTTP status code.我想同时捕获响应正文和 HTTP 状态代码。

Here is the best I have managed so far:这是我迄今为止管理的最好的:

rspBody=$( http $URL --check-status --ignore-stdin )
statusCode=$?

Command substitution lets me get the body, and the "--check-status" flag gives me a simplified code (such as 0, 3, 4, etc) corresponding to the code family.命令替换让我得到正文,“--check-status”标志为我提供了与代码族对应的简化代码(例如 0、3、4 等)。

The problem is I need to distinguish between say a 401 and a 404 code, but I only get 4.问题是我需要区分 401 和 404 代码,但我只得到 4。

Is there a way to get the actual status code without having to do a verbose dump into a file and parse for stuff?有没有办法获得实际的状态代码而不必将详细转储到文件中并解析内容?

[edit] [编辑]

This is my workaround in case it helps anyone, but I'd still like a better idea if you have one:这是我的解决方法,以防它对任何人有帮助,但如果您有一个更好的主意,我仍然想要一个更好的主意:

TMP=$(mktemp)
FLUSH_RSP=$( http POST ${CACHE_URL} --check-status --ignore-stdin 2> "$TMP")
STAT_FAMILY=$?

flush_err=$(cat "$TMP" | awk '{
  where = match($0, /[0-9]+/)
  if (where) {
    print substr($0, RSTART, RLENGTH);
  }
}' -)
rm "$TMP"

STDERR contains a (usually) 3-line message with the HTTP code in it, so I dump that to a temp file and am still able to capture the response body (from STDOUT) in a variable. STDERR 包含一条(通常)3 行消息,其中包含 HTTP 代码,因此我将其转储到临时文件中,并且仍然能够在变量中捕获响应主体(来自 STDOUT)。

I then parse that temp file looking for a number, but this seems fragile to me.然后我解析那个临时文件寻找一个数字,但这对我来说似乎很脆弱。

There's no ready-made solution as such for this but it's achievable with a bit of scripting.没有现成的解决方案,但是可以通过一些脚本来实现。 For example:例如:

STATUS=$(http -hdo ./body httpbin.org/get 2>&1 | grep HTTP/  | cut -d ' ' -f 2)
BODY=$(cat ./body)
rm ./body
echo $STATUS
# 200
echo $BODY
# { "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "identity", "Host": "httpbin.org", "User-Agent": "HTTPie/1.0.0-dev" }, "origin": "84.242.118.58", "url": "http://httpbin.org/get" }

Explanation of the command:命令的解释:

http --headers \               # Print out the response headers (they would otherwise be supressed for piped ouput)
     --download \              # Enable download mode
     --output=./body  \        # Save response body to this file
     httpbin.org/get 2>&1 \    # Merge STDERR into STDOUT (with --download, console output otherwise goes to STDERR)
     | grep HTTP/  \           # Find the Status-Line
     | cut -d ' ' -f 2         # Get the status code

https://gist.github.com/jakubroztocil/ad06f159c5afbe278b5fcfa8bf3b5313 https://gist.github.com/jakubroztocil/ad06f159c5afbe278b5fcfa8bf3b5313

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM