2016-07-11 7 views
1

HTTPieを使用していくつかのAPIを呼び出すためのbashスクリプトがあります。レスポンスボディとHTTPステータスコードの両方を取得したい。ここでbashスクリプトでHTTPieを使用して実際のレスポンスコードとレスポンス本文を取得する方法は?

は、私がこれまでの最高管理しているされています

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

コマンド置換は私が体を取得することができますし、「--check-ステータスが」フラグは私に単純化されたコードを示します(たとえば、0、3 、4、等)を含む。

問題は、ファイルに詳細なダンプを行うことなく、実際のステータスコードを取得する方法はあります私は401と404のコードを言うの間に区別する必要があるが、私は唯一の4

を取得しています物事を解析しますか?

[編集]

これは、それは誰にも役立ちます場合は、私の回避策ですが、私はまだ良いアイデアのように使用すると、1つ持っていると思います場合:

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は、(通常は)3が含まれています私はそれを一時ファイルにダンプし、変数内のレスポンスボディ(STDOUTから)を捕捉することができます。

次に、その一時ファイルを解析して数値を探しますが、これは私には壊れやすいようです。

答えて

2

このような既成の解決策はありませんが、少しのスクリプトでは実現できます。たとえば、次のコマンドの

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" } 

説明:

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/jkbrzt/ad06f159c5afbe278b5fcfa8bf3b5313

+0

また、これは一時ファイルが必要ですが、それは少しクリーナーです。ありがとう。 [編集] 明らかに、私は答えを投票するのに十分な代理人がいません。申し訳ありません。 –

+1

ああ、ちょうどチェックマークをクリックしなければならないことが分かった。ありがとう! –

関連する問題