Quer saber como posso forçar o httpie a não alterar a ordem dos campos json?
curl -i http://localhost:8080/v1/notes/569766aed4c661fba8d85a12
{
"id": "569766aed4c661fba8d85a12",
"content": "hi"
}
com httpie
http get :8080/v1/notes/569766aed4c661fba8d85a12
{
"content": "hi",
"id": "569766aed4c661fba8d85a12"
}
Eu prefiro que o campo id
seja sempre o primeiro. Alguma ideia?
Observe que no formatador json, sort_keys=True
Pode-se supor que esta seria a razão
ah ok, obrigado.
Com o seguinte eu poderia desabilitar a classificação das chaves (infelizmente junto com o recuo, mas isso não é um problema tão grande)
http --pretty=colors get :8080/v1/notes/569766aed4c661fba8d85a12
De nada, embora eu ache que isso levanta a questão de saber se a classificação é algo que deve ser feito em geral ou deve ser como o servidor pretendido
seria possível introduzir outro valor para --pretty
para permitir cores e formatação mas sem ordenar as chaves na resposta?
você poderia fazer desordenado como padrão? e uma opção como --sort-keys
para pessoas que desejam o comportamento das chaves de classificação; veja https://bugs.python.org/issue21650 o json.tool já tem uma opção em python3
➸ python3 -m json.tool -h
usage: python -m json.tool [-h] [--sort-keys] [infile] [outfile]
A simple command line interface for json module to validate and pretty-print
JSON objects.
positional arguments:
infile a JSON file to be validated or pretty-printed
outfile write the output of infile to outfile
optional arguments:
-h, --help show this help message and exit
--sort-keys sort the output of dictionaries alphabetically by key
Acabei de perder muito mais tempo do que me sinto confortável em admitir tentando rastrear um problema na minha biblioteca JSON do lado do servidor porque não consegui descobrir por que estava enviando os dados na ordem errada. Nem me ocorreu que o cliente poderia estar reordenando coisas.
Vale a pena ter a opção de reordenar o JSON? 90% do tempo vai ofuscar em vez de melhorar a saída do servidor.
Eu enviaria um pull request, mas seria apenas mudar um "True" para um "False" em um arquivo.
concordo plenamente com @carlfish
@jkbrzt alguma opinião sobre isso?
Testado isso localmente, e parece que se você disser ao formatador para não alfabetizar, você obtém chaves de objeto em uma ordem arbitrária - eu acho que é apoiado por um dicionário não ordenado? Nesse caso, a alfabetização é provavelmente melhor do que aleatória.
Eu acho que é apoiado por um dicionário não ordenado?
sim, o python json.loads
por padrão carregado em um dict, que é uma ordem imprevisível (um código hash usado internamente), que não é melhor que a ordem alfabética;
mas existe uma solução alternativa, por favor use object_pairs_hook=OrderedDict
; e solte sort_keys
ao ligar json.dumps
>>> import json
>>> from collections import OrderedDict
>>> data = json.loads('{"foo":1, "bar": 2}', object_pairs_hook=OrderedDict)
>>> print json.dumps(data, indent=4)
{
"foo": 1,
"bar": 2
}
>>>
Dois iaques raspados depois: Pull request -> https://github.com/jkbrzt/httpie/pull/520
Por que vale a pena, sou um usuário que gosta de ver as chaves na minha saída JSON classificadas. Meu servidor não define uma ordem na qual ele gera as chaves e, se eu estiver procurando para ver se a chave que espero foi incluída no corpo JSON ou não, é muito mais fácil quando elas são classificadas. Então eu diria para não apenas remover arbitrariamente a funcionalidade de classificação, mas sim torná-la configurável ou alternável via sinalizador.
ping autor @jakubroztocil isso está fora de manutenção?
Existe alguma tração sobre esta questão? Como @carlfish , acabei de passar um tempo embaraçosamente longo tentando corrigir um bug no meu servidor, apenas para descobrir que o httpie era o problema.
Parece muito pouco intuitivo que ele reordene/classifique dados do servidor, sem que o usuário o habilite explicitamente.
Existe uma solução na PR #520, que infelizmente ainda não foi mesclada.
Isso seria realmente útil. A classificação não é tão boa quando você não quer.
todo o Python2 obsoleto; algum mantenedor pode dar uma olhada nos PRs pendentes? dos gráficos do contribuidor parece que @jakubroztocil @msabramo ainda está ativo?
Alguém está trabalhando nisso? Podemos esperar que isso seja resolvido?
@opensas não sabe disso, mas a solução possível é usar a ferramenta jq
:
http https://jsonplaceholder.typicode.com/todos/1 | jq -C
@opensas este recurso será incluído na próxima v2.2.0.
solução possível é usar a ferramenta
jq
:http https://jsonplaceholder.typicode.com/todos/1 | jq -C
@nmtitov aqui não é realmente jq
que restaura a ordem, é o ato de redirecionar a saída que desativa as cores e a formatação (definindo efetivamente --pretty=none
).
muito obrigado pela dica, já tinha notado isso neste tópico.
Existe alguma maneira de manter o restante das informações da solicitação (status e cabeçalhos) depois de canalizar através do jq?
Quero dizer, httpie retorna isso:
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 109
Content-Type: application/json; charset=utf-8
Date: Sat, 25 Apr 2020 11:14:32 GMT
ETag: W/"6d-wWZh31xOzPgYyzU23ihgZaW8KkI"
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Content-Type-Options: nosniff
X-DNS-Prefetch-Control: off
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
[
{
"id": 1,
"text": "Read the docs"
},
{
"id": 2,
"text": "Create my first application"
},
{
"id": 3,
"text": "Write tests"
}
]
mas http | jq -C remove a primeira parte, retornando apenas:
[
{
"id": 1,
"text": "Read the docs"
},
{
"id": 2,
"text": "Create my first application"
},
{
"id": 3,
"text": "Write tests"
}
]
@opensas Eu não acho que seja possível, a menos que você escreva seu wrapper bash personalizado
@opensas @nmtitov canalizar a saída tem o efeito colateral de alterar o padrão --print=hb
(imprimir cabeçalhos e corpo) para --print=b
(imprimir apenas o corpo porque é isso que você normalmente deseja ao redirecionar a saída ). Você pode pedir explicitamente que os cabeçalhos sejam incluídos com --print=hb
.
https://httpie.org/docs#output -options
@jakubroztocil isso não funcionará porque jq
espera o corpo JSON como entrada
$ http --print=hb https://jsonplaceholder.typicode.com/todos/1 | jq -C
parse error: Invalid numeric literal at line 1, column 9
Eu vejo. Você poderia usar http --download httpbin.org/get | jq
Eu encontrei o seguinte workqround, em vez de usar httpie eu encontrei curlie , que parece
Como curl, mas diferente de httpie, os cabeçalhos são escritos em stderr em vez de stdout.
Então posso usar assim:
$ curlie GET localhost:3000/tasks | jq -C
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 304
ETag: W/"130-ED1W4hQo1i7na7wy5Ewc7iKdoJc"
Date: Wed, 27 May 2020 06:28:26 GMT
Connection: keep-alive
[
{
"id": 2,
"title": "new task2",
"description": "description2",
"status": "OPEN"
},
{
"id": 3,
"title": "new task3",
"description": "description3",
"status": "OPEN"
}
]
Onde como com httpie eu faria os cabeçalhos
BTW, eu criei este script conveniente:
$ cat ~/bin/c
curlie "$@" | jq -C
Acaba de ser lançada a v2.2.0 que trata desse problema. Saiba mais sobre os novos --unsorted
, --sorted
e --format-options
aqui:
https://httpie.org/docs#colors -and-formatting
Comentários muito úteis
Acabei de perder muito mais tempo do que me sinto confortável em admitir tentando rastrear um problema na minha biblioteca JSON do lado do servidor porque não consegui descobrir por que estava enviando os dados na ordem errada. Nem me ocorreu que o cliente poderia estar reordenando coisas.
Vale a pena ter a opção de reordenar o JSON? 90% do tempo vai ofuscar em vez de melhorar a saída do servidor.
Eu enviaria um pull request, mas seria apenas mudar um "True" para um "False" em um arquivo.