Solicitar GET de ondulação com o parâmetro json

124

Estou tentando enviar uma solicitação "GET" para uma API REST remota no prompt de comando via cURL como este:

curl -X GET -H "Content-type: application/json" -H "Accept: application/json"  "http://server:5050/a/c/getName/{"param0":"pradeep"}"

Mas ele não retorna nenhuma saída. Tentei fazer ping no URL diretamente do navegador, sou capaz de obter resposta com êxito, não entendo o que há de errado com o comando.

Basicamente, quero definir uma solicitação "GET" para um serviço REST remoto, que me fornece dados json como resposta via curl. Alguém pode me orientar que erro estou cometendo? Eu tentei várias postagens, mas todas elas falam sobre solicitações POST e não sobre GET.

Pradeep Simha
fonte
quais erros estão sendo publicados no seu servidor?
Scary Wombat
Sem erros, do lado do servidor está sendo executado com sucesso. Mas do lado da onda, ele não está exibindo nenhum dado. Ele apita após alguns segundos, apenas é exibido em branco, sem dados.
Pradeep Simha
você pode tentar com curl -i -H "Accept: application / json" " server: 5050 / a / c / getName {" param0 ":" pradeep "}" (opção -i em vez de x).
Harshal Bulsara

Respostas:

139

Isso deve funcionar:

  curl -i -H "Accept: application/json" 'server:5050/a/c/getName{"param0":"pradeep"}'

use a opção -i em vez de x.

Harshal Bulsara
fonte
4
cotação talvez diferente? "servidor: 5050 / a / c / getName { 'param0': 'pradeep'}"
AB
Realmente deveria ser um 'server:5050/a/c/getName{"param0":"pradeep"}'ou outro "server:5050/a/c/getName{\"param0\":\"pradeep\"}".
Benjamin W.
16

Se você deseja enviar seus dados para o corpo, é necessário fazer um POSTou em PUTvez de GET.

Para mim, parece que você está tentando enviar a consulta com URI parâmetros , que não está relacionado com GET, você também pode colocar esses parâmetros sobre POST, PUTe assim por diante.

A consulta é uma parte opcional, separada por um ponto de interrogação ("?"), Que contém informações adicionais de identificação que não são de natureza hierárquica. A sintaxe da cadeia de caracteres de consulta não é definida genericamente, mas geralmente é organizada como uma sequência de = pares, com os pares separados por ponto-e-vírgula ou e comercial.

Por exemplo:

curl http://server:5050/a/c/getName?param0=foo&param1=bar
Martin Seeler
fonte
7
Qualquer mensagem de solicitação HTTP pode conter um corpo de mensagem. Isso nunca é útil para o GET devido à semântica do GET - o conteúdo do corpo da solicitação, se houver, não deve alterar a resposta.
Jarek Przygódzki
12

Se você realmente deseja enviar a solicitação GET com JSON no corpo (digamos, para uma solicitação XHR e você sabe que o servidor suporta o processamento do corpo nas solicitações GET), você pode:

curl -X GET \
  -H "Content-type: application/json" \
  -H "Accept: application/json" \
  -d '{"param0":"pradeep"}' \
  "http://server:5050/a/c/getName"

A maioria dos servidores web modernos aceita esse tipo de solicitação.

Steven Soroka
fonte
Isso não funciona produz o resultado pretendido. Usando httpbin.org/get para depuração, isso gera: { "args": {}, "headers": { "Accept": "application/json", "Content-Length": "20", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:57.0) Gecko/20100101 Firefox/57.0" }, "origin": "27.94.235.50, 27.94.235.50", "url": "https://httpbin.org/get" }Nada é recebido. Você precisa usar uma string de consulta comocurl -X GET https://httpbin.org/get?data=%7B%22param0%22%3A%22pradeep%22%7D
Jacques
Isso depende se o servidor da web está ou não verificando o corpo quanto a solicitações GET, o que eu admito que não é um comportamento totalmente padrão. Pode ser melhor usar os parâmetros de consulta de URL como você diz. Um problema ao usar um corpo em uma solicitação de obtenção é que o navegador não pode reproduzir a solicitação navegando com o histórico do navegador, embora isso provavelmente seja bom para solicitações de XHR.
Steven Soroka
Como alternativa, o que se pode fazer, se houver controle suficiente no lado do servidor, é adicionar uma propriedade especial nos dados json como "method": "get", enviar a carga útil em uma solicitação posterior e fazer com que o código no servidor interprete isso como uma solicitação de obtenção.
Jacques
@ Jacques, com certeza, mas se você tiver o controle do servidor, poderá facilmente fazer com que o servidor leia os corpos das solicitações GET. Voltando à pergunta original, acho que toda essa tangente é um pouco fora de tópico. Relendo a pergunta, não acho que o OP tenha acesso para alterar o servidor.
Steven Soroka
sim, é verdade. Se você controla o servidor. Meu comentário foi estimulado pela seguinte declaração que você fez, que, como eu disse, não produziria o resultado pretendido: "A maioria dos servidores web modernos aceita esse tipo de solicitação". Na verdade, eles aceitariam a solicitação que você descreveu, mas a solicitação falharia em produzir o resultado pretendido. Ou você pode revisar a declaração da seguinte maneira: "A maioria dos servidores web modernos aceita esse tipo de solicitação, assumindo que você tem controle direto no lado do servidor, mas isso não é padrão"
Jacques
8

GET leva pares de valor de nome.

Tente algo como:

curl http://server:5050/a/c/getName/?param1=pradeep

ou

curl http://server:5050/a/c/getName?param1=pradeep

entre um REST regular deve ser algo como

curl http://server:5050/a/c/getName/pradeep Se usar JSON na URL GET, não é uma maneira padrão.

user2877889
fonte
4

Para serviços protegidos por nome de usuário e senha, use o seguinte

curl -u admin:password -X GET http://172.16.2.125:9200 -d '{"sort":[{"lastUpdateTime":{"order":"desc"}}]}'
Sandeep KV
fonte
curl -X POST -H "Tipo de conteúdo: application / json" -d '{"coisas": "coisas"}' http: // ...
keithpjolley 11/11/17
Corrija-me se estiver errado, mas ter -d em uma solicitação de ondulação (e não especificar o método) fará da solicitação um POST.
Gokigooooks 01/07
3

Experimentar

curl -G ...

ao invés de

curl -X GET ...

Normalmente você não precisa dessa opção. Todos os tipos de solicitações GET, HEAD, POST e PUT são bastante chamados usando opções de linha de comando dedicadas.

Esta opção altera apenas a palavra real usada na solicitação HTTP, não altera o modo como a curvatura se comporta. Por exemplo, se você deseja fazer uma solicitação HEAD adequada, usar -X HEAD não será suficiente. Você precisa usar a opção -I, --head.

smci
fonte
1

Nenhuma das soluções mencionadas acima funcionou para mim devido a algum motivo. Aqui está a minha solução. É bem básico.

curl -X GET API_ENDPOINT -H 'Tipo de conteúdo: application / json' -d ' JSON_DATA '

API_ENDPOINT é o ponto de extremidade da API, por exemplo: http://127.0.0.1:80/api

-H foi usado para adicionar conteúdo do cabeçalho.

JSON_DATA é o seu corpo de solicitação, pode ser algo como :: {"data_key": "value"}. '' redor JSON_DATA são importantes.

Qualquer coisa depois de -d são os dados que você precisa enviar na solicitação GET

bhatman
fonte