Wie poste ich JSON-Daten mit cURL?

2831

Ich benutze Ubuntu und habe cURL darauf installiert . Ich möchte meine Spring REST-Anwendung mit cURL testen. Ich habe meinen POST-Code auf der Java-Seite geschrieben. Ich möchte es jedoch mit cURL testen. Ich versuche, JSON-Daten zu veröffentlichen. Beispieldaten sind wie folgt:

{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}

Ich benutze diesen Befehl:

curl -i \
    -H "Accept: application/json" \
    -H "X-HTTP-Method-Override: PUT" \
    -X POST -d "value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true \
    http://localhost:8080/xx/xxx/xxxx

Es gibt diesen Fehler zurück:

HTTP/1.1 415 Unsupported Media Type
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Length: 1051
Date: Wed, 24 Aug 2011 08:50:17 GMT

Die Fehlerbeschreibung lautet wie folgt:

Der Server hat diese Anforderung abgelehnt, da die Anforderungsentität in einem Format vorliegt, das von der angeforderten Ressource für die angeforderte Methode () nicht unterstützt wird.

Tomcat-Protokoll: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

Was ist das richtige Format des Befehls cURL?

Dies ist mein Java- PUTSeitencode (ich habe GET und DELETE getestet und sie funktionieren):

@RequestMapping(method = RequestMethod.PUT)
public Configuration updateConfiguration(HttpServletResponse response, @RequestBody Configuration configuration) { //consider @Valid tag
    configuration.setName("PUT worked");
    //todo If error occurs response.sendError(HttpServletResponse.SC_NOT_FOUND);
    return configuration;
}
Kamaci
quelle
6
Überprüfen Sie den Link für Spring 3.2.0 Post-Anfragen.
AmirHd
8
Es gibt einen schönen Beitrag mit Curl für Ad-hoc-Tests von RESTful Microservices, der dies anhand mehrerer Beispiele behandelt.
Upitau

Antworten:

4340

Sie müssen Ihren Inhaltstyp auf application / json einstellen. Aber -dsendet den Content-Type application/x-www-form-urlencoded, die nicht auf Spring Seite akzeptiert wird.

Wenn Sie sich die Curl-Manpage ansehen, können Sie Folgendes verwenden -H:

-H "Content-Type: application/json"

Vollständiges Beispiel:

curl --header "Content-Type: application/json" \
  --request POST \
  --data '{"username":"xyz","password":"xyz"}' \
  http://localhost:3000/api/login

( -Hist die Abkürzung für --header, -dfür --data)

Beachten Sie, dass -request POSTist optional , wenn Sie verwenden -d, da die -dKennzeichen eine Aufforderung POST impliziert.


Unter Windows sieht das etwas anders aus. Siehe den Kommentarthread.

Sean Patrick Floyd
quelle
262
Für Windows funktionierten einfache Anführungszeichen um json nicht und ich konnte mich doppelten Anführungszeichen entziehen. curl -X POST -H "Content-Type: application/json" -d "{ \"key1\": \"value1\" }" http://localhost:3000/api/method
HPPy
37
Für mich unter Windows musste ich Anführungszeichen mit Anführungszeichen in diesem Format umgehen "{ """key1""": """value1""" }". Auch diese Antwort: stackoverflow.com/questions/18314796/…
chodorowicz
4
@chodorowicz das ist schrecklich! Ich kenne diese Syntax nur von VB!
Sean Patrick Floyd
3
Ich hatte Probleme mit POST-Anfragen, habe diese jedoch durch Großschreibung von "Application / json" gelöst. Wenn Sie also einen 415-Fehler erhalten, überprüfen Sie die Großschreibung.
WiteCastle
5
@ostrokach Entschuldigung, es hat deine Zeit verschwendet. Die Syntax hat unter OSX gut funktioniert, als ich sie gepostet habe (habe es nicht erneut versucht). Ich denke, es ist / war nur ein Plattformunterschied. Ich stelle mir vor, dass die Upvotes von Leuten stammen, denen es geholfen hat.
Adam Tuttle
564

Versuchen Sie, Ihre Daten in eine Datei zu schreiben, body.jsonund verwenden Sie sie dann

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
Typisch
quelle
12
Sie sollten wahrscheinlich die --data-binaryOption anstelle von verwenden --data. Man würde erwarten, dass der Client die Daten so sendet, wie sie sind, aber --dataCR und LF von der Eingabe entfernt.
h2stein
14
Die Verwendung von cUrl mit Inline-Json-Strings scheint ein Albtraum zu sein. Es besteht die Notwendigkeit, das doppelte Anführungszeichen zu formen. Mit einer solchen Datei zu arbeiten ist schöner.
Xtreme Biker
46
Es ist wichtig, @vor dem Namen der Datei ein Zeichen einzufügen, da dies sonst nicht funktioniert. Ich habe gerade 20 Minuten damit verbracht, meinen Kopf gegen diesen Mist zu
schlagen
3
Auf diese Weise können Sie auch einen JSON-Flusen für die Datei ausführen, um festzustellen, ob beim Parsen des JSON ein Fehler vorliegt.
Datashaman
4
Unter Windows benötigen Sie doppelte Anführungszeichen um den Dateinamen "@ body.json"
Stomf
100

Möglicherweise finden Sie resty nützlich: https://github.com/micha/resty

Es ist eine Wrapper-Round-CURL, die Befehlszeilen-REST-Anforderungen vereinfacht. Sie zeigen auf Ihren API-Endpunkt und erhalten PUT- und POST-Befehle. (Beispiele von der Homepage angepasst)

$ resty http://127.0.0.1:8080/data #Sets up resty to point at your endpoing
$ GET /blogs.json                  #Gets http://127.0.0.1:8080/data/blogs.json
                                   #Put JSON
$ PUT /blogs/2.json '{"id" : 2, "title" : "updated post", "body" : "This is the new."}'
                                   # POST JSON from a file
$ POST /blogs/5.json < /tmp/blog.json

Außerdem müssen die Header des Inhaltstyps häufig noch hinzugefügt werden. Sie können dies jedoch einmal tun, um einen Standardwert für das Hinzufügen von Konfigurationsdateien pro Methode und Standort festzulegen : Festlegen der Standardoptionen für RESTY

mo-seph
quelle
93

Unter Windows -dfunktionierte ein einfaches Anführungszeichen für den Wert für mich nicht, aber nach dem Wechsel zu einem doppelten Anführungszeichen. Außerdem musste ich doppelte Anführungszeichen in geschweiften Klammern vermeiden.

Das heißt, Folgendes hat nicht funktioniert:

curl -i -X POST -H "Content-Type: application/json" -d '{"key":"val"}' http://localhost:8080/appname/path

Aber folgendes hat funktioniert:

curl -i -X POST -H "Content-Type: application/json" -d "{\"key\":\"val\"}" http://localhost:8080/appname/path
venkatnz
quelle
5
Zu
Ihrer Information
3
Für mich unter Windows funktioniert das "um die Daten herum nicht, stattdessen funktionieren keine Anführungszeichen
Rodedo
3
Wenn Sie PowerShell verwenden, lesen Sie diese Antwort.
Rsenna
86

Es hat bei mir funktioniert mit:

curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost/api/postJsonReader.do

Es wurde glücklich dem Spring-Controller zugeordnet:

@RequestMapping(value = "/postJsonReader", method = RequestMethod.POST)
public @ResponseBody String processPostJsonData(@RequestBody IdOnly idOnly) throws Exception {
        logger.debug("JsonReaderController hit! Reading JSON data!"+idOnly.getId());
        return "JSON Received";
}

IdOnlyist ein einfaches POJO mit einer id-Eigenschaft.

Luis
quelle
56

Erstellen Sie beispielsweise eine JSON-Datei, params.json, und fügen Sie diesen Inhalt hinzu:

[
    {
        "environment": "Devel",
        "description": "Machine for test, please do not delete!"
    }
]

Dann führen Sie diesen Befehl aus:

curl -v -H "Content-Type: application/json" -X POST --data @params.json -u your_username:your_password http://localhost:8000/env/add_server
Eduardo Cerqueira
quelle
42

Ich habe gerade das gleiche Problem. Ich könnte es durch Angabe lösen

-H "Content-Type: application/json; charset=UTF-8"
Steffen Roller
quelle
37

Das hat bei mir gut funktioniert.

curl -X POST --data @json_out.txt http://localhost:8080/

Wo,

-X Bedeutet das http-Verb.

--data Bedeutet die Daten, die Sie senden möchten.

felipealvesgnu
quelle
5
Das -X POSTist in diesem Beispiel redundant
Software Engineer
31

Sie können Postman mit seiner intuitiven Benutzeroberfläche verwenden, um Ihren cURLBefehl zusammenzustellen.

  1. Installieren und starten Sie Postman
  2. Geben Sie Ihre URL, Ihren Post-Body, Ihre Anforderungsheader usw. ein.
  3. Klicke auf Code
  4. Wählen Sie cURLaus der Dropdown-Liste
  5. Kopieren Sie Ihren cURLBefehl und fügen Sie ihn ein

Hinweis: In der Dropdown-Liste gibt es mehrere Optionen für die automatische Generierung von Anfragen. Aus diesem Grund dachte ich, dass mein Beitrag überhaupt notwendig war.

Kiltek
quelle
6
Wusste nicht, dass diese Funktion in Postman enthalten war. Vielen Dank für den Hinweis!
Ariestav
29

Versuchen Sie unter CURL Windows Folgendes:

curl -X POST -H "Content-Type:application/json" -d "{\"firstName\": \"blablabla\",\"lastName\": \"dummy\",\"id\": \"123456\"}" http-host/_ah/api/employeeendpoint/v1/employee
Márcio Brener
quelle
28

Sie können Postman verwenden, um in CURL zu konvertierenGeben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Byte Mamba
quelle
1
Vielen Dank @ forever-LA es war ein lebensrettender Tipp für mich
vibs2006
24

HTTPie ist eine empfohlene Alternative zu, curlweil Sie nur tun können

$ http POST http://example.com/some/endpoint name=value name1=value1

Es spricht standardmäßig JSON und behandelt sowohl das Festlegen des für Sie erforderlichen Headers als auch das Codieren von Daten als gültiges JSON. Es gibt auch:

Some-Header:value

für Überschriften und

name==value

für Abfragezeichenfolgenparameter. Wenn Sie einen großen Datenblock haben, können Sie ihn auch aus einer Datei lesen, die JSON-codiert ist:

 field=@file.txt
tosh
quelle
20

Wenn Sie viele JSON-Sendungen / -Antworten gegen eine RESTful-Schnittstelle testen, sollten Sie das Postman- Plug-In für Chrome (mit dem Sie Webdiensttests manuell definieren können) und den auf Node.js basierenden Newman- Befehl überprüfen -line Begleiter (mit dem Sie Tests gegen "Sammlungen" von Postman-Tests automatisieren können.) Kostenlos und offen!

ftexperts
quelle
18

Dies funktionierte gut für mich, zusätzlich mit der BASIC-Authentifizierung:

curl -v --proxy '' --basic -u Administrator:password -X POST -H "Content-Type: application/json"
        --data-binary '{"value":"30","type":"Tip 3","targetModule":"Target 3","configurationGroup":null,"name":"Configuration Deneme 3","description":null,"identity":"Configuration Deneme 3","version":0,"systemId":3,"active":true}'
        http://httpbin.org/post

Natürlich sollten Sie die BASIC-Authentifizierung niemals ohne SSL und ein geprüftes Zertifikat verwenden.

Ich bin heute mit Cygwins cURL 7.49.1 für Windows erneut darauf gestoßen ... Und bei Verwendung von --dataoder --data-binarymit einem JSON-Argument war cURL verwirrt und interpretierte das {}im JSON als URL-Vorlage. Das Hinzufügen eines -gArguments zum Deaktivieren von cURL globbing hat das behoben.

Siehe auch Übergeben einer URL mit Klammern zum Einrollen .

davenpcj
quelle
17

Sie können Ihren JSON-Inhalt auch in eine Datei einfügen und ihn mithilfe der --file-uploadOption über die Standardeingabe wie folgt an Curl übergeben :

 echo 'my.awesome.json.function({"do" : "whatever"})' | curl -X POST "http://url" -T -
niken
quelle
16

Das hat bei mir funktioniert:

curl -H "Content-Type: application/json" -X POST -d @./my_json_body.txt http://192.168.1.1/json
Amit Vujic
quelle
10

Ich verwende das folgende Format, um mit einem Webserver zu testen.

use -F 'json data'

Nehmen wir dieses JSON-Diktatformat an:

{
    'comment': {
        'who':'some_one',
        'desc' : 'get it'
    }
}

Vollständiges Beispiel

curl -XPOST your_address/api -F comment='{"who":"some_one", "desc":"get it"}'
user3180641
quelle
6

Verwenden Sie die Option -d, um Nutzdaten hinzuzufügen

curl -X POST \
http://<host>:<port>/<path> \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"foo": "bar",
"lorem": "ipsum"
}'

In Ergänzung:

Verwenden Sie -X POST, um die POST-Methode zu verwenden

Verwenden Sie -H 'Accept: application / json', um einen Header vom Typ accept hinzuzufügen

Verwenden Sie -H 'Content-Type: application / json', um den Header des Inhaltstyps hinzuzufügen

Sma Ma
quelle
Ich habe versucht, es zu verwenden, habe aber den Fehler {"Fehler": ["Keine Daten angegeben"]} erhalten.
Suresh
6

Dies funktionierte bei mir unter Windows10

curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4
sudhanshu srivastava
quelle
5

Bitte überprüfen Sie dieses Tool . Es hilft Ihnen, auf einfache Weise Curl-Schnipsel zu erstellen.

curl -XGET -H "Accept: application/json" -d "{\"value\":\"30\",\"type\":\"Tip 3\",\"targetModule\":\"Target 3\",\"configurationGroup\":null,\"name\":\"Configuration Deneme 3\",\"description\":null,\"identity\":\"Configuration Deneme 3\",\"version\":0,\"systemId\":3,\"active\":true}" "http://localhost:8080/xx/xxx/xxxx"
Pranay Kumar
quelle
5

Hier ist eine andere Möglichkeit, wenn Sie dynamische Daten einbeziehen möchten.

#!/bin/bash

version=$1
text=$2
branch=$(git rev-parse --abbrev-ref HEAD)
repo_full_name=$(git config --get remote.origin.url | sed 's/.*:\/\/github.com\///;s/.git$//')
token=$(git config --global github.token)

generate_post_data()
{
  cat <<EOF
{
  "tag_name": "$version",
  "target_commitish": "$branch",
  "name": "$version",
  "body": "$text",
  "draft": false,
  "prerelease": false
}
EOF
}

echo "Create release $version for repo: $repo_full_name branch: $branch"
curl --data "$(generate_post_data)" "https://api.github.com/repos/$repo_full_name/releases?access_token=$token"
Anand Rockzz
quelle
1
Du hast mein Leben gerettet!
Abhimanyu
4

Ich weiß, auf diese Frage wurde viel beantwortet, aber ich wollte mitteilen, wo ich das Problem hatte:

curl -X POST http: // Ihr-Server-Endpunkt -H "Inhaltstyp: application / json" -d @ Pfad-Ihrer-json-Datei.json

Ich habe alles richtig gemacht. Nur eines - "@", das ich vor dem JSON-Dateipfad verpasst habe.

Ich habe im Internet ein relevantes Dokument gefunden - https://gist.github.com/subfuzion/08c5d85437d5d4f00e58

Hoffe das könnte den wenigen helfen. Vielen Dank

Du bist toll
quelle
1

Wenn Sie den SWAGGER für Ihre Spring-Boot-Anwendung konfigurieren und dort eine API aus Ihrer Anwendung aufrufen, können Sie auch diese CURL-Anforderung sehen.

Ich denke, dies ist der einfache Weg, um die Anfragen über die CURL zu generieren.

AnilkumarReddy
quelle