여러 줄의 JSON으로 컬


85

아래 curl 명령을 고려하십시오. JSON에서 줄 바꿈을 허용하고 (최소화없이) bash에서 직접 실행할 수 있습니까 (Mac / Ubuntu)

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
'
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'

위의 명령을 실행하면 위의 명령 second { 을 수정하는 방법 에서 오류가 발생한 것 같습니다 .

업데이트 : 실제로 이전에 문제가 발생하지 않고 명령을 실행할 수 있었지만 최근에 문제가 발생한 이유를 알 수 없습니다.


1
오류에 대해 자세히 말씀해 주시겠습니까? 귀하의 예제는 내 시스템에서 "있는 그대로"작동합니다. mymac > bash --version GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15) Copyright (C) 2007 Free Software Foundation, Inc.
Eric Bolinger

그래,뿐만 아니라 나를 위해 작동 :GNU bash, version 4.3.42(1)-release
miken32

1
ANSI C와 유사한 문자열 구문 도 확인하십시오 .echo $'here is a newline:\nand here is a tab:\t'
miken32

application/jsonJSON 데이터에 대한 올바른 미디어 유형입니다. RFC4627
Pocketsand

답변:


124

Bash man 페이지에 설명되어 있고 여기에 자세히 설명되어있는 "Here Document"로이 작업을 수행하는 또 다른 방법을 기억 했습니다 . @-수단은 STDIN에서 몸을 판독하면서 << EOF컬을 STDIN 같은 "EOF"까지 파이프 수단 스크립트 함량. 이 레이아웃은 별도의 파일을 사용하거나 "변수 에코"방식을 사용하는 것보다 읽기가 더 쉬울 수 있습니다.

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: application/json; charset=utf-8' \
--data-binary @- << EOF
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}
EOF

참고 : --trace <outfile>컬 옵션을 사용 하여 전선을 통과하는 것을 정확하게 기록 하십시오. 어떤 이유로이 Here Document 접근 방식은 줄 바꿈을 제거합니다. (업데이트 : curl -d 옵션으로 줄 바꿈이 제거되었습니다. 수정되었습니다!)


5
이것은 깨끗하고, 추가 인용도없고, 이스케이프도 없으며 잘 작동합니다. 감사.
Seth

이러한 구문으로 파이프를 사용할 수 있습니까?
Ivan Balashov

2
예, 배치가 중간에 있지만 출력을 다른 명령으로 파이프 할 수 있습니다. stdin 리디렉션 후에 stdout 리디렉션을 추가하십시오. 단어 수를 사용한 예 :-d @- << EOF | wc
Eric Bolinger

2
새 줄을 제거하는 것은 Here Document가 아니지만 curl -d옵션 : curl.haxx.se/docs/manpage.html#-d . --data-binary줄 바꿈 및 캐리지 리턴 문자를 유지하는 데 사용 합니다.
dzieciou

39

JSON을 변수에 넣으라는 Martin의 제안에 따라 JSON을 별도의 파일에 넣은 다음 -dcurl의 @ 구문 을 사용하여 파일 이름을 제공 할 수도 있습니다 .

curl -0 -v -X POST http://www.example.com/api/users \
  -H "Expect:" \
  -H 'Content-Type: text/json; charset=utf-8' \
  -d @myfile.json

단점은 분명합니다 (예전에 파일이 2 개 이상있는 경우). 그러나 더하기 측면에서 스크립트는 파일 이름이나 디렉토리 인수를 허용 할 수 있으며 편집 할 필요가 없으며 다른 JSON 파일에서 실행하기 만하면됩니다. 이것이 유용한 지 여부는 수행하려는 작업에 따라 다릅니다.


1
참고 :이 통해 올바른 JSON 컨텐츠를했는지 확인 jsonlint.com
vikramvi

이 접근 방식은 다른 접근 방식에 비해 깨끗하고 디버깅하기 쉽습니다.
vikramvi

훌륭한 솔루션. PATH 조심하세요!
Pierre Ferry

21

어떤 이유로이 Here Document 접근 방식은 줄 바꿈을 제거합니다.

@ eric-bolinger Heredoc이 줄 바꿈을 제거하는 이유는 EOF를 인용하여 Heredoc에 줄 바꿈을 유지하도록 지시해야하기 때문입니다.

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @- <<'EOF'

{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}
EOF

EOF를 처음 정의 할 때는 단일 틱을 둘러싸고 있지만 두 번째는 그렇지 않습니다.


20

외부 큰 따옴표를 사용하고 다음과 같이 모든 내부 따옴표를 이스케이프해야합니다.

curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d \
"
{
    \"field1\": \"test\",
    \"field2\": {
        \"foo\": \"bar\"
    }
}"

19

json을 var에 할당 할 수 있습니다.

json='
{
    "field1": "test",
    "field2": {
        "foo": "bar"
    }
}'

이제 다음을 사용하여 이것을 curl로 전달할 수 있습니다 stdin.

echo $json | curl -0 -v -X POST http://www.example.com/api/users \
-H "Expect:" \
-H 'Content-Type: text/json; charset=utf-8' \
-d @-

작은 따옴표를 사용하여 블록을 묶는 것은 JSON에서 변수 (예 :)를 사용할 수 없음을 의미합니다 ${username}.
Air

하지만 큰 따옴표를 사용하면 데이터에 $ 기호를 사용할 수 없습니다. 당신에게 맞는 것을 선택하십시오.
Martin Konecny
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.