multiple Wie man JSON-Daten mit Curl von Terminal/Commandline an Spring REST testet?




php curl json (16)

Ich benutze Ubuntu und installiere Curl darauf. Ich möchte meine Spring REST-Anwendung mit Curl testen. Ich habe meinen POST-Code auf 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:

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

Irgendwelche Ideen zum richtigen Format des Curl-Befehls?

BEARBEITEN:

Dies ist mein Java-seitiger 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;
} 

Erstellen Sie die JSON-Datei "MyData.json" und fügen Sie Inhalt hinzu:

[
    {
        "Key_one": "Value_one",
        "Key_two": "Value_two",
        "Key_three": "Value_three"
    }
]

Danach müssen Sie den folgenden Befehl ausführen:

curl -v -H "Content-Type: application/json" -X POST --data @MyData.json -u USERNAME:PASSWORD http://localhost:8000/env/add_server

Das hat für mich funktioniert:

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

Wenn Sie viele JSON-Sende- / -Antworten mit einer 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.) Sowohl kostenlos als auch offen!


Das hat gut für mich funktioniert.

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

Woher,

-X Bedeutet das http-Verb.

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


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

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

HTTPie ist eine empfohlene Alternative zu curl da Sie dies nur tun können

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

Es spricht standardmäßig JSON und wird sowohl die Einstellung des erforderlichen Headers als auch das Kodieren von Daten sowie gültiges JSON vornehmen. Es gibt auch:

Some-Header:value

für Überschriften und

name==value

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

 [email protected]

Erstellen Sie zum Beispiel 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

Versuchen Sie, Ihre Daten in einer Datei zu speichern, sagen Sie " body.json und verwenden Sie dann

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

Resty kann nützlich sein: https://github.com/micha/resty

Es handelt sich um eine Wrapper-Round-CURL, die REST-Anforderungen für Befehlszeilen vereinfacht. Sie verweisen auf Ihren API-Endpunkt und geben Ihnen 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 von Standard-RESTY-Optionen


Ein bisschen zu spät zur Party, aber ich sehe das nicht als gepostet, also könnten Sie Ihren Json auch in eine Datei legen und ihn mit der Option --file-upload über die Standardeingabe an curl übergeben.

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

Ich verwende JSON in meiner Anwendung und es ist einfach:

curl -X POST -H "Content-Type:application/json" -d '{"params1":"value1","params2":"value2"} hostname:port/api

Bei einer großen Anzahl von Parametern verwenden Sie jedoch vorzugsweise eine Datei mit dem JSON-Anforderungstext wie folgt:

curl -X POST -H "Content-Type:application/json" -F "[email protected]/users/suchi/dekstop/JSON_request.txt" hostname:port/api

Es hat für mich 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";
}

IdOnly ist ein einfacher POJO mit einer ID-Eigenschaft.


Unter Windows funktionierte es nicht für mich, ein einfaches Anführungszeichen für den Wert -d zu haben, aber es funktionierte nach dem Wechsel zu einem doppelten Anführungszeichen. Ich musste auch doppelte Anführungszeichen in geschweiften Klammern verwenden.

Das folgende hat nicht funktioniert:

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

Folgendes funktionierte jedoch:

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


Sie müssen Ihren Inhaltstyp auf application / json setzen. -d sendet jedoch die Content-Type- application/x-www-form-urlencoded , die von Spring nicht akzeptiert wird.

Wenn ich die curl-Manpage betrachte , denke ich, kannst du -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

( -H steht für --header , -d für --data )

Beachten Sie, dass -request POST optional ist, wenn Sie -d , da das Flag -d eine POST-Anforderung impliziert.

Unter Windows sind die Dinge etwas anders. Siehe den Kommentarthread.


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 wieder darauf gestoßen, mit Cygwins cURL 7.49.1 für Windows ... Und wenn Sie --data oder --data-binary mit einem JSON-Argument verwenden, wurde cURL verwirrt und interpretierte das {} in der JSON als URL Vorlage. Durch das Hinzufügen eines -g Arguments zum Deaktivieren von cURL-Globbing wurde dieses Problem behoben.

Siehe auch URL mit Klammern an curl übergeben .





curl