Por que curl está truncando esta string de consulta?

92

Tenho certeza de que a resposta para isso será um problema de codificação de caracteres dolorosamente óbvio ...

Estou usando curl na linha de comando para testar alguns endpoints em um aplicativo Python. O ponto final obtém parâmetros de url de latitude e longitude. Nada muito especial. Eu coloquei o comando:

curl -v -L http://localhost:5000/pulse/?lat=41.225&lon=-73.1

O servidor responde, com saída curl detalhada:

* Connected to localhost (127.0.0.1) port 5000 (#0)
> GET /pulse/?lat=41.225 HTTP/1.1
> User-Agent: curl/7.21.6 (i686-pc-linux-gnu) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
> Host: localhost:5000
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 500 INTERNAL SERVER ERROR
< Content-Type: application/json
< Content-Length: 444
< Server: Werkzeug/0.8.1 Python/2.7.2+
< Date: Wed, 01 Feb 2012 17:06:29 GMT
< 
{
    "msg": "TypeError: float() argument must be a string or a number", 
    "flag": 0, 
    "stack": [
        "Traceback (most recent call last):", 
        "  File \"engine.py\", line 139, in dispatch_request", 
        "    return getattr(self, 'action_'+endpoint)(request, **values)", 
        "  File \"engine.py\", line 818, in action_getpulse", 
        "    lon = float(request.args.get('lon'))"
    ], 
    "err": 1
* Closing connection #0
}
[1]+  Done

Na segunda linha desse despejo, é óbvio que o segundo parâmetro,, lonnão está sendo enviado. O que estou fazendo errado? Obrigado.

DeaconDesperado
fonte
1
Provavelmente não relacionado à pergunta original, mas se eu estivesse faltando parte da string de consulta, eu retornaria 400 ou outra coisa, não 500.
Michael Munsey

Respostas:

247

A resposta à pergunta, "o que estou fazendo de errado", é que o shell vê o e comercial ( &) e pensa que é o fim do comando (e o coloca em segundo plano). Você precisa citá-lo, e é por isso que as respostas que citavam a string funcionam. Você poderia facilmente executar isto:

curl -v -L "http://localhost:5000/pulse?lat=41.225&lon=-73.1"
Bob Kimble
fonte
Tenho tentado isso no gitbash no Windows sem muito sucesso
avi.elkharrat
36

Acho que você pode tentar isso:

 curl -v -L -d "lat=41.225&lon=-73.1" http://localhost:5000/pulse

por padrão, isso chama POST. Se você quiser enviar uma solicitação GET

 curl -v -L -G -d "lat=41.225&lon=-73.1" http://localhost:5000/pulse

Mais ...
e como você está usando localhost, se fosse usar https, provavelmente gostaria de incluir-k uma opção para ignorar erros de certificado

Obrigado a Ross por apontar isso.

Nishant
fonte
Funcionaria se fosse post, mas infelizmente os parâmetros devem ser passados ​​como variáveis ​​de url em GET.
DeaconDesperado de
1
mesmo no seu caso (como na pergunta), você tentou envolver seu URL com string de consulta com aspas duplas?
Nishant
e já que você está usando localhost, se você fosse usar https, provavelmente gostaria de incluir -k como uma opção para ignorar erros de certificado.
Ross
Nenhum desses métodos funciona para mim. Passar um barbante e sempre sai em branco. Enviando para o servidor Grizzly.
user3217883