API를 테스트하기 위해 몇 가지 스크립트를 작성 중입니다. JSON 응답과 요청의 HTTP 상태 코드에 관심이 있습니다. 읽기 쉽도록 JSON 응답을 예쁘게 인쇄하고 싶습니다.
저는 요청을 수행하는 데 사용하고 있으며 이를 사용하여 json 결과를 예쁘게 인쇄하고 curl
싶습니다 .python -m json.tool
컬리는좋은 선택-w
요청에 대한 정보를 표시하는 데 사용할 수 있습니다. %{http_code}
불행하게도 이 정보는 표준 출력으로 인쇄되어 혼란스럽습니다 python -m json.tool
. 후행 json이 아닌 데이터를 무시하도록 구성할 방법이 없는 것 같습니다.
내가 할 때
curl \
'--silent' \
'--insecure' \
'-L' \
'-w' \
'\n%{http_code}\n' \
'--user' \
<REDACTED> \
'-X' \
'GET' \
'--' \
'https://somecompany.com/some_api_endpoint' \
| python -m json.tool
알겠어요
$ bash call_api_endpoint_script.sh
Extra data: line 2 column 1 - line 3 column 1 (char 203 - 207)
Exit 1
curl
파일에 상태 코드 쓰기를 구성하는 방법이 있습니까 ? 매뉴얼 페이지의 옵션에는 -w
이 정보를 다른 곳으로 리디렉션할 가능성이 언급되지 않은 것 같습니다.
답변1
$ curl -s -k -w '%{stderr}%{http_code}\n%{stdout}\n' \
https://run.mocky.io/v3/0e98ba3e-335e-421b-b762-884d2bf613ba |\
tee /dev/stderr | jq -r '.name'
200
{
"name": "Grape"
}
Grape
표준 에러 이 시점부터 -w, --write-out 출력이 표준 오류에 기록됩니다. (7.63.0에서 추가됨)
표준 출력 이 시점부터 -w, --write-out 출력이 표준 출력에 기록됩니다. 이는 기본 설정이지만 stderr로 전환한 후 다시 전환하는 데 사용할 수 있습니다. (7.63.0에서 추가됨)
답변2
-o
콘텐츠를 임시 파일로 리디렉션하고 컬 출력에 상태 코드만 유지하여 이 문제에 대한 해결책을 찾았습니다 .
그런 다음 임시 파일의 내용을 읽고 python -m json.tool
인쇄할 수 있습니다.
예를 들어,
content=$(mktemp)
curl \
...
-w \
'HTTP_STATUS_CODE: %{http_code}\n' \
...
-o \
"$content" \
-- \
'https://somecompany.com/some_api_endpoint'
<"$content" python -m json.tool
답변3
당신이 사용하는 경우jq
대신 python -m json.tool
, 후행 텍스트가 있는 경우에도 JSON을 구문 분석한다는 것을 알 수 있습니다.
$ echo '{ "foo": "bar" } text' | ./jq
{
"foo": "bar"
}
parse error: Invalid literal at line 2, column 0
물론 오류 메시지를 무시하려면 로 리디렉션할 수 있습니다 /dev/null
.
또한 jq
출력을 파이프에서 사용하거나 파일로 리디렉션하려면 "filter" 매개변수를 제공해야 한다고 생각합니다.
echo '{ "foo": "bar" } trailing text' | jq . > OUT.json
.
가장 간단한 필터입니다. 이는 "입력을 받아 이를 변경되지 않은 출력으로 생성한다"는 의미입니다.
답변4
쓰기는 출력 -w
으로만 이동할 수 있으며 모든 파일로 리디렉션될 수 있습니다. 특히 를 사용하여 으로 지정할 수 있습니다 . 이제 및 ( 사용 ) 로 전환하면 출력을 원하는 프로그램으로 파이프하는 동안 stderr을 통해 HTTP 반환 코드를 볼 수 있습니다.stdout
-o
stderr
-o /dev/stderr
stderr
stdout
3>&1- 1>&2- 2>&3-
즉, 다음과 같이 진행됩니다.
curl ... -w 'HTTP_STATUS_CODE: %{http_code}\n' -o /dev/stderr ... | 3>&1- 1>&2- 2>&3- | python -m json.tool