컬은 stderr 또는 파일에 http 코드를 씁니다.

컬은 stderr 또는 파일에 http 코드를 씁니다.

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-ostderr-o /dev/stderrstderrstdout3>&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

관련 정보