spring-mvc post - Come caricare i dati JSON con Curl da Terminal / Commandline per testare il REST di Spring?




php (17)

Io uso Ubuntu e ho installato Curl su di esso. Voglio testare la mia applicazione Spring REST con Curl. Ho scritto il mio codice POST sul lato Java. Tuttavia, voglio testarlo con Curl. Sto cercando di pubblicare un dato JSON. Un esempio di dati è simile a questo:

{"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}

Io uso questo comando:

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

Restituisce questo errore:

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

La descrizione dell'errore è questa:

Il server ha rifiutato questa richiesta perché l'entità richiesta è in un formato non supportato dalla risorsa richiesta per il metodo richiesto ().

Registro di Tomcat: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

Qualche idea sul formato corretto del comando Curl?

MODIFICARE:

Questo è il mio codice PUT lato Java (ho provato GET e DELETE e funzionano)

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

Answers

Uso JSON nella mia applicazione e è semplice come:

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

Ma se hai un numero elevato di parametri preferisci sempre utilizzare un file con il corpo della richiesta JSON come di seguito:

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

Ad esempio, crea un file JSON, params.json, e aggiungi questo contenuto ad esso:

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

Quindi esegui questo comando:

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

Se stai testando molte invii / risposte JSON su un'interfaccia RESTful, potresti voler controllare il plug-in Postman per Chrome (che consente di definire manualmente i test del servizio web) e il comando Newman basato su Node.js -line companion (che ti permette di automatizzare i test contro "collezioni" di test postman). Sia libero che aperto!


Potresti trovare utile resty: https://github.com/micha/resty

È un wrapper round CURL che semplifica le richieste REST della riga di comando. Lo punti al tuo endpoint API e ti dà i comandi PUT e POST. (Esempi adattati dalla homepage)

$ 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

Inoltre, spesso è ancora necessario aggiungere le intestazioni del tipo di contenuto. Puoi farlo una volta, però, per impostare un valore predefinito, di aggiungere i file di configurazione per-metodo per-sito: Impostazione delle opzioni RESTY predefinite


Ho appena incontrato lo stesso problema. Potrei risolverlo specificando

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

Puoi utilizzare Postman con la sua intuitiva GUI per assemblare il tuo comando cURL .

  1. Installa e avvia Postman
  2. Inserisci il tuo URL, il corpo del messaggio, le intestazioni delle richieste ecc. Pp.
  3. Clicca su Code
  4. Seleziona cURL dall'elenco a discesa
  5. copia e incolla il comando cURL

Nota: ci sono diverse opzioni per la generazione automatica delle richieste nell'elenco a discesa, motivo per cui ho pensato che il mio post fosse necessario in primo luogo.


HTTPie è un'alternativa raccomandata per curl perché puoi fare solo

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

Per impostazione predefinita, parla JSON e gestirà sia l'impostazione dell'intestazione necessaria sia i dati di codifica come JSON validi. C'è anche:

Some-Header:value

per intestazioni e

name==value

per i parametri della stringa di query. Se hai una grande quantità di dati, puoi anche leggerli da un file se sono codificati JSON:

 [email protected]

Un po 'tardi per la festa, ma non vedo questo post, quindi ecco, potresti anche mettere il tuo json in un file e passarlo a ricciolo usando l'opzione --file-upload tramite input standard, come questo:

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

Per i dati JSON

curl -H "Content-Type: application/json" -X POST -d '{"params1":"value1","param2":"value2"}' http://localhost:8080/api

Se vuoi postare qualche file

curl -X POST -F "[email protected]/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload --insecure

Nel caso in cui tu non voglia fare confusione con https e http:

O semplicemente,

curl -X POST -F "[email protected]/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload


Usando CURL Windows, prova questo:

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

Per Windows, avere una sola citazione per il valore -d non ha funzionato per me, ma ha funzionato dopo aver cambiato il doppio preventivo. Inoltre avevo bisogno di sfuggire alle virgolette tra parentesi graffe.

Cioè, il seguente non ha funzionato:

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

Ma il seguente ha funzionato:

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

Prova a mettere i tuoi dati in un file, ad esempio body.json e quindi a utilizzarli

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

Questo ha funzionato bene per me.

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

Dove,

-X Indica il verbo http.

--data Indica i dati da inviare.


Questo ha funzionato per me:

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

Sto usando il formato seguente per testare con un server web.

use -F 'json data'

Supponiamo che questo formato di JSON dict:

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

Esempio completo

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

È necessario impostare il tipo di contenuto su application / json. Ma -d invia l' application/x-www-form-urlencoded Content-Type application/x-www-form-urlencoded , che non è accettata da parte di Spring.

Guardando la pagina man di curl , penso che tu possa usare -H :

-H "Content-Type: application/json"

Esempio completo:

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

( -H è l'abbreviazione di --header , -d for --data )

Si noti che -request POST è facoltativo se si utilizza -d , poiché l'indicatore -d implica una richiesta POST.

Su Windows, le cose sono leggermente diverse. Vedi il thread del commento.


Assicurati di aver seguito l'importazione. Ofcourse altre importazioni standard

import org.springframework.core.io.FileSystemResource


    void uploadzipFiles(String token) {

        RestBuilder rest = new RestBuilder(connectTimeout:10000, readTimeout:20000)

        def zipFile = new File("testdata.zip")
        def Id = "001G00000"
        MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>()
        form.add("id", id)
        form.add('file',new FileSystemResource(zipFile))
        def urld ='''http://URL''';
        def resp = rest.post(urld) {
            header('X-Auth-Token', clientSecret)
            contentType "multipart/form-data"
            body(form)
        }
        println "resp::"+resp
        println "resp::"+resp.text
        println "resp::"+resp.headers
        println "resp::"+resp.body
        println "resp::"+resp.status
    }




json rest spring-mvc curl