Escape-Zeichenfolgen, die in Curl-Daten gesendet werden, wenn application/json verwendet wird

Escape-Zeichenfolgen, die in Curl-Daten gesendet werden, wenn application/json verwendet wird

Ich verwende CURL, um JSON-Daten zu senden. Hier ist ein Beispiel:

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"

Wie kann ich den Inhalt eines beliebigen Wertes für maskieren some_string?

Wenn beispielsweise jemand die Zeichenfolge einfügen möchte, Abe Lincoln's favorite character is the backslash \. He said "I love the \ and single quotes like ''".wie kann ich dem bei der Verwendung von curl entgehen?

Ich glaube, ich muss Folgendes tun:

  • Wenn die Zeichenfolge ein "Escapezeichen enthält, wird es mit drei Backslashs versehen \\\".

  • Wenn die Zeichenfolge ein 'Escape enthält, ist kein Escape erforderlich '.

  • Wenn die Zeichenfolge ein \Escapezeichen enthält, wird es mit drei Backslashs versehen \\\\.

Gibt es irgendwelche Charaktere, die ich vergessen habe?

Antwort1

Ich gehe davon aus, dass Ihr Ziel nur darin besteht, den String durch die Shell-Analyse zu bringen. Wenn ja, verwenden Sie read:

Zum Beispiel

$ IFS='' read -r var

Fügen Sie die Zeile dann manuell ein.

Wenn es mehrere Zeilen sind, können Sie Folgendes verwenden:

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

Und fügen Sie erneut ein, aber verwenden Sie dieses Mal CTRL+ d, um die Eingabe zu beenden.

Oder verwenden Sie ein Heredoc:

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

 

Unabhängig davon, welche Methode Sie verwenden, können Sie dann einfach die Variable $varfür den Zugriff verwenden:

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

Antwort2

Sie würden diese drei Backslashes wahrscheinlich nicht brauchen, wenn Sie die Shell aus der Gleichung entfernen könnten. Glücklicherweise können Sie:

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

Schauen Sie sich an man curl. Ich schlage vor, die Unterschiede zwischen--data-ascii (was -dbedeutet), --data-binary, Und --data-urlencoded.

Möglicherweise möchten Sie auch die unterschiedlichen Verhaltensweisen vergleichen, die Sie mit --header, --data, und erhalten.--form (die standardmäßig alle POSTetwas unterschiedlich funktionieren), und was Sie möglicherweise erhalten, --getindem Sie stattdessen die mit einem der zuvor genannten Verfahren angegebenen Daten in die Anforderungs-URL nach einem kodieren können ?.

Antwort3

Erwägen Sie die Verwendung eines JSON-fähigen Tools zum Erstellen des JSON-Dokuments.

Verwendung von jq:

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

Verwendung von jo:

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

Beachten Sie, dass jodaraus geschlossen werden würde, dass es sich bei dem Wert um einen Array-Eintrag handelt, wenn der Wert des Schlüssels mit endet [].

Mit beiden Varianten des obigen Codes jsonwürde die Variable den Wert erhalten, der entspricht

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

jsonSie können die Variable dann in Ihrem Aufruf verwenden, um curl:

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

verwandte Informationen