HTTPie detects whether it’s running in a TTY. When there’s no TTY, like when Claude Code invokes it as a subprocess, HTTPie assumes stdin might have data coming and interprets the request as a POST, even if you meant a GET.
The fix is --ignore-stdin:
http --ignore-stdin GET localhost:3000/things
The catch: once you tell Claude Code to always use --ignore-stdin, it will also use
it when piping data, which breaks that use case entirely:
# This will break - --ignore-stdin discards the piped body
cat payload.json | http --ignore-stdin POST localhost:3000/things
So --ignore-stdin is the right default for reads, but it needs to be dropped when
actually piping stdin for writes. Worth spelling this out explicitly in your
instructions to Claude Code, otherwise it’ll cargo-cult --ignore-stdin everywhere
after you mention it once.