application/json을 사용할 때 컬 데이터로 전송되는 이스케이프 문자열

application/json을 사용할 때 컬 데이터로 전송되는 이스케이프 문자열

CURL을 사용하여 JSON 데이터를 보내고 있습니다. 예는 다음과 같습니다.

mycomputer$ curl -H "Content-Type: application/json" 
     -d  "{ "some_string": "Hello mom it's me!" }"
     "http://localhost:3001/api_v2/blocks/42af6ab04d9d9635a97f8abec14ed023?api_key=fe5cf0d86af27c086ab5cd4d0eab6641"

에 대한 값의 내용을 어떻게 이스케이프할 수 있습니까 some_string?

예를 들어 누군가가 문자열을 넣으려고 한다면 Abe Lincoln's favorite character is the backslash \. He said "I love the \ and single quotes like ''".컬을 사용하는 동안 어떻게 이 문자열을 피할 수 있습니까?

나는 다음을 수행해야 한다고 생각합니다.

  • 문자열에 "이스케이프 문자가 포함되어 있으면 삼중 백슬래시를 사용하세요 \\\".

  • 문자열에 '이스케이프가 포함되어 있으면 이스케이프가 필요하지 않습니다 '.

  • 문자열에 \이스케이프 문자가 포함되어 있으면 삼중 백슬래시를 사용하세요 \\\\.

내가 잊어버린 문자가 있나요?

답변1

나는 당신의 목표가 쉘의 구문 분석을 넘어서 문자열을 얻는 것이라고 가정할 것입니다. 그렇다면 다음을 사용하십시오 read.

예를 들어

$ IFS='' read -r var

그런 다음 해당 줄을 수동으로 붙여넣습니다.

여러 줄인 경우 다음을 사용할 수 있습니다.

$ IFS='' read -r -d '' var

그리고 다시 붙여넣는데 이번에는 CTRL+를 사용하여 d입력을 종료합니다.

또는 heredoc을 사용하십시오:

$ IFS='' read -r -d '' var <<'EOF'
{ "some_string": "Hello mom it's me!" }
EOF

 

어떤 방법을 사용하든 변수를 사용하여 $var액세스할 수 있습니다.

$ curl -H "Content-Type: application/json" \
 -d  "$var" \
 "http://localhost:3001/api_v2/blocks/42af6ab04d9d9635a97f8abec14ed023?api_key=fe5cf0d86af27c086ab5cd4d0eab6641"

답변2

방정식에서 쉘을 제거할 수 있다면 백슬래시 중 3개가 필요하지 않을 것입니다. 다행히도 다음을 수행할 수 있습니다.

curl --config - <<\DATA
    url    = "http://some.url"
    header = "Content-Type: application/json"
    data   = "{ \"some_string\": "Abe Lincoln's favorite character is the backslash \\. He said \"I love the \\ and single quotes like '.\""
#END
DATA

보다 man curl. 차이점에 주의를 기울이는 것이 좋습니다.--data-ascii (그게 무슨 -d뜻이야), --data-binary, 그리고 --data-urlencoded.

, 및 를 사용하여 얻을 수 있는 다양한 동작을 비교할 수도 있습니다 --header.--data--form (기본적으로 모두 POST약간 다른 방식으로 수행됩니다)--get, 그리고 이전에 언급한 로 지정된 데이터를 대신 요청 URL로 인코딩할 수 있는 것을 얻을 수 있습니다 ?.

답변3

JSON 문서를 생성하려면 JSON 인식 도구를 사용하는 것이 좋습니다.

사용 jq:

json=$(
    jq -n --arg 'Some key "string"' "My cat's useless" '$ARGS.named'
)

사용 jo:

json=$( jo 'Some key "string"'="My cat's useless" )

jo키 값이 로 끝나는 경우 값이 배열 항목인 것으로 추론하려고 시도 합니다 [].

위 코드의 두 변형을 모두 사용하면 json변수는 다음과 동일한 값을 얻습니다.

{
  "Some key \"string\"": "My cat's useless"
}

json그런 다음 호출 시 변수를 사용할 수 있습니다 curl.

curl -H 'Content-Type: application/json' \
    -d "$json" \
    'http://localhost:3001/api_v2/some/endpoint'

관련 정보