method - Como POSTAR dados JSON com Curl do Terminal/Commandline para testar o Spring REST?




spring rest post return (14)

Como exemplo, crie um arquivo JSON, params.json e adicione este conteúdo a ele:

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

Então você executa este comando:

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

Eu uso o Ubuntu e instalei o Curl nele. Quero testar meu aplicativo Spring REST com o Curl. Eu escrevi meu código POST no lado de Java. No entanto, quero testá-lo com o Curl. Estou tentando postar um dado JSON. Um exemplo de dados é assim:

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

Eu uso este 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

Ele retorna este erro:

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

A descrição do erro é esta:

O servidor recusou essa solicitação porque a entidade de solicitação está em um formato não suportado pelo recurso solicitado para o método solicitado ().

Log do Tomcat: "POST / ui / webapp / conf / clear HTTP / 1.1" 415 1051

Alguma idéia sobre o formato correto do comando Curl?

EDITAR:

Este é o meu código PUT do lado do Java (testei o GET e o DELETE e eles funcionam)

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

Crie o arquivo JSON "MyData.json" e inclua o conteúdo:

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

Depois disso, você precisa executar o seguinte comando:

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

Eu estou usando o formato abaixo para testar com um servidor web.

use -F 'json data'

Vamos supor este formato do JSON dict:

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

Exemplo completo

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

Eu uso o JSON no meu aplicativo e é simples como:

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

Mas se você tiver um grande número de parâmetros, sempre prefira usar um arquivo com o corpo da solicitação JSON, conforme abaixo:

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

Isso funcionou bem para mim, adicionalmente usando a autenticação BASIC:

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

Naturalmente, você nunca deve usar a autenticação BASIC sem SSL e um certificado verificado.

Eu encontrei isso novamente hoje, usando o cURL 7.49.1 do Cygwin para Windows ... E ao usar --data ou --data-binary com um argumento JSON, o cURL ficou confuso e interpretaria o {} no JSON como um URL modelo. Adicionando um argumento -g para desligar a globulação cURL corrigiu isso.

Consulte também Como passar um URL com colchetes para enrolar .


Isso funcionou para mim:

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

Para dados do json

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

Se você quiser postar algum arquivo

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

Caso você não queira mexer com https e http:

Ou simplesmente,

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


Para o Windows, ter uma única aspa para o valor -d não funcionou para mim, mas funcionou depois de mudar para aspas duplas. Além disso, eu precisava evitar aspas duplas entre chaves.

Ou seja, o seguinte não funcionou:

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

Mas o seguinte funcionou:

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

Tente colocar seus dados em um arquivo, digamos body.json e use

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

Um pouco atrasado para a festa, mas eu não vejo isso postado, então aqui vai, você também pode colocar seu json em um arquivo e passá-lo para curl usando a opção --file-upload via entrada padrão, assim:

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

Você pode achar útil: https://github.com/micha/resty

É um wrapper redondo CURL que simplifica as solicitações REST da linha de comando. Você aponta para o ponto de extremidade da API e fornece comandos PUT e POST. (Exemplos adaptados da 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

Além disso, muitas vezes ainda é necessário adicionar os cabeçalhos Content Type. Você pode fazer isso uma vez, no entanto, para definir um padrão, de adicionar arquivos de configuração por método por site: Definir opções RESTY padrão



Você precisa definir seu tipo de conteúdo para application / json. Mas -d envia o application/x-www-form-urlencoded Content-Type application/x-www-form-urlencoded , que não é aceito no lado da Spring.

Olhando para a página do homem da onda , eu acho que você pode usar -H :

-H "Content-Type: application/json"

Exemplo completo:

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

( -H é a abreviação de --header , -d para --data )

Observe que -request POST é opcional se você usar -d , pois o sinalizador -d implica em uma solicitação POST.

No Windows, as coisas são um pouco diferentes. Veja o tópico do comentário.


HTTPie é uma alternativa recomendada para curl porque você pode fazer apenas

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

Ele fala JSON por padrão e manipulará tanto a configuração do cabeçalho necessário para você quanto os dados de codificação como JSON válido. Há também:

Some-Header:value

para cabeçalhos e

name==value

para parâmetros de string de consulta. Se você tem uma grande quantidade de dados, você também pode lê-los a partir de um arquivo que tenha código JSON:

 [email protected]






curl