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

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

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.

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 

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

Funcionou para mim usando:

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

Foi felizmente mapeado para o controlador Spring:

 @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 é um POJO simples com uma propriedade id.

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 

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 

Isto funcionou bem para mim.

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

Onde,

-X Significa o verbo http.

--data Significa os dados que você deseja enviar.

Eu acabei de me deparar com o mesmo problema. Eu poderia resolvê-lo especificando

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

Usando o CURL Windows, tente isto:

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

Se você estiver testando muitos JSON send / responses em uma interface RESTful, talvez queira verificar o plug-in Postman for Chrome (que permite definir manualmente os testes de serviço da Web) e o comando Newman baseado em Node.js -line companion (que permite automatizar testes contra “collections” de testes de Postman). Ambos gratuitos e abertos!

Você pode usar o Postman com sua GUI intuitiva para montar seu comando cURL .

  1. Instalar e iniciar o Postman
  2. Digite seu URL, Post Body, Request Headers, etc.
  3. Clique no Code
  4. Selecione cURL na lista suspensa
  5. copie e cole seu comando cURL

Nota: Existem várias opções para geração automatizada de pedidos na lista suspensa, e é por isso que pensei que meu post era necessário em primeiro lugar.

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 

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 input padrão, assim:

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

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 header necessário para você quanto os dados de codificação como JSON válido. Há também:

 Some-Header:value 

para headers 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:

  field=@file.txt 

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

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 "data=@/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 "data=@/Users/vishvajitpathak/Desktop/screen_1.png" http://localhost:8080/upload

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 "data=@/users/suchi/dekstop/JSON_request.txt" hostname:port/api 

Você pode passar a extensão do formato desejado como o final do URL. como http: // localhost: 8080 / xx / xxx / xxxx .json

ou

http: // localhost: 8080 / xx / xxx / xxxx .xml

Nota: você precisa adicionar as dependencies jackson e jaxb maven no seu pom.