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 ''".컬을 사용할 때 문자열을 어떻게 이스케이프 처리합니까?

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

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

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

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

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

답변1

나는 당신의 목표가 단지 셸에서 문자열을 구문 분석하는 것이라고 가정합니다. 그렇다면 다음을 사용하십시오 read.

예를 들어

$ IFS='' read -r var

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

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

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

다시 붙여넣지만 이번에는 CTRL+ d로 입력을 종료합니다 .

또는 구분 기호를 사용하세요.

$ 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이전에 언급한 특정 데이터를 ?.

답변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'

관련 정보