title: How to capture actual response code and response body with HTTPie in bash script?
body: <p>I have a bash script to call several APIs using HTTPie. I want to capture both the response body AND the HTTP status code.</p>
  
  <p>Here is the best I have managed so far:</p>
  
  <pre><code>rspBody=$( http $URL --check-status --ignore-stdin )
  statusCode=$?
  </code></pre>
  
  <p>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.</p>
  
  <p>The problem is I need to distinguish between say a 401 and a 404 code, but I only get 4.</p>
  
  <p>Is there a way to get the actual status code without having to do a verbose dump into a file and parse for stuff?</p>
  
  <p>[edit]</p>
  
  <p>This is my workaround in case it helps anyone, but I'd still like a better idea if you have one:</p>
  
  <pre><code>TMP=$(mktemp)
  FLUSH_RSP=$( http POST ${CACHE_URL} --check-status --ignore-stdin 2&gt; "$TMP")
  STAT_FAMILY=$?
  
  flush_err=$(cat "$TMP" | awk '{
    where = match($0, /[0-9]+/)
    if (where) {
      print substr($0, RSTART, RLENGTH);
    }
  }' -)
  rm "$TMP"
  </code></pre>
  
  <p>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.</p>
  
  <p>I then parse that temp file looking for a number, but this seems fragile to me.</p>