it-swarm.com.de

Wie kann ichPOST JSON-Daten mit Curl von einem Terminal / einer Befehlszeile aus an Test Spring REST senden?

Ich benutze Ubuntu und installiere cURL drauf. Ich möchte meine Spring REST -Anwendung mit cURL testen. Ich habe meinen POST Code an der Java Seite geschrieben. Ich möchte es jedoch mit cURL testen. Ich versuche, JSON-Daten zu posten. 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, weil 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 side PUT Code (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;
}
2520
kamaci

Sie müssen Ihren Inhaltstyp auf application/json einstellen. Aber -d sendet den Content-Type _application/x-www-form-urlencoded_, der von Spring nicht akzeptiert wird.

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

_-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
_

(_-H_ steht für _--header_, _-d_ für _--data_)

Beachten Sie, dass _-request POST_ optional ist , wenn Sie _-d_ verwenden, da das Flag _-d_ ein POST Anfrage.


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

3934

Versuchen Sie, Ihre Daten in eine Datei zu schreiben, sagen Sie body.json und verwenden Sie dann

curl -H "Content-Type: application/json" --data @body.json http://localhost:8080/ui/webapp/conf
502
Typisch

Sie könnten resty nützlich finden: https://github.com/micha/resty

Es handelt sich um eine Wrapper-Round-CURL, die die Befehlszeilenanforderungen REST vereinfacht. Sie verweisen auf Ihren API-Endpunkt und erhalten die Befehle PUT und POST. (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 ist es häufig noch erforderlich, die Content Type-Header hinzuzufügen. Sie können dies jedoch einmal tun, um einen Standard für das Hinzufügen von Konfigurationsdateien pro Methode pro Site festzulegen: Festlegen der Standard-RESTY-Optionen

93
mo-seph

Unter Windows hat es bei mir nicht funktioniert, ein einfaches Anführungszeichen für den Wert -d zu haben, aber es hat funktioniert, nachdem ich in ein doppeltes Anführungszeichen gewechselt habe. Außerdem musste ich doppelte Anführungszeichen in geschweiften Klammern vermeiden.

Das heißt, das Folgende hat nicht funktioniert:

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

Aber das Folgende hat funktioniert:

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

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 auf den Spring-Controller abgebildet:

@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";
}

IdOnly ist ein einfaches POJO mit einer id-Eigenschaft.

79
Luis

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
50

Das hat bei mir gut funktioniert.

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

Wo,

-X Bedeutet das http-Verb.

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

35
felipealves.gnu

Ich bin nur auf das gleiche Problem gestoßen. Ich könnte es lösen, indem ich spezifiziere

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

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
27
Márcio Brener

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

  1. Installieren und Starten Postbote
  2. Geben Sie Ihre URL, Post Body, Request Headers usw. ein.
  3. Klicken Sie auf Code
  4. Wählen Sie cURL aus der Dropdown-Liste
  5. kopieren Sie den Befehl cURL und fügen Sie ihn ein

Hinweis: In der Dropdown-Liste gibt es mehrere Optionen für die automatische Generierung von Anfragen, weshalb ich dachte, mein Beitrag wäre an erster Stelle erforderlich.

24
kiltek

Wenn Sie viele JSON-Sende-/Antwortvorgänge mit einer RESTful-Schnittstelle testen, sollten Sie das Postman -Plug-In für Chrome prüfen (mit dem Sie manuell definieren können) Web-Service-Tests) und den Node.js-basierten Newman -Befehlszeilen-Begleiter (mit dem Sie Tests gegen "Sammlungen" von Postman-Tests automatisieren können.) Sowohl kostenlos als auch offen!

18
ftexperts

HTTPie ist eine empfohlene Alternative zu curl, weil Sie dies einfach 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:

 [email protected]
17
tosh

Sie können Ihren JSON-Inhalt auch in eine Datei einfügen und mit der Option --file-upload über die Standardeingabe an Curl übergeben.

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

Das hat bei mir gut funktioniert, zusätzlich mit 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 niemals die BASIC-Authentifizierung 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 wenn --data oder --data-binary mit einem JSON-Argument verwendet wurde, war cURL verwirrt und interpretierte den {} in die JSON als URL-Vorlage. Das Hinzufügen eines -g -Arguments zum Deaktivieren des cURL-Globings hat das behoben.

Siehe auch Übergeben einer URL mit eckigen Klammern.

14
davenpcj

Das hat bei mir funktioniert:

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

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

use -F 'json data'

Nehmen wir das folgende 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"}'
7
user3180641

Sie können Briefträger verwenden, um zu CURL zu konvertieren enter image description here

enter image description here

3
forever LA
This worked for me for windows10
curl -d "{"""owner""":"""sasdasdasdasd"""}" -H "Content-Type: application/json" -X  PUT http://localhost:8080/api/changeowner/CAR4

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 eine Überschrift mit dem Typ accept hinzuzufügen

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

1
Sma Ma

Hier ist eine andere Möglichkeit, dies zu tun, 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"
0
Anand Rockzz