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 $var
fü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 -d
bedeutet), --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 POST
etwas unterschiedlich funktionieren), und was Sie möglicherweise erhalten, --get
indem 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 jo
daraus 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 json
würde die Variable den Wert erhalten, der entspricht
{
"Some key \"string\"": "My cat's useless"
}
json
Sie 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'