Enquanto estiver usando o requests
módulo , há alguma maneira de imprimir a solicitação HTTP não processada?
Não quero apenas os cabeçalhos, quero a linha de solicitação, os cabeçalhos e a impressão do conteúdo. É possível ver o que finalmente é construído a partir da solicitação HTTP?
python
http
python-requests
huggie
fonte
fonte
requests
recurso, pois isso significaria reescrever / ignorarurllib3
ehttplib
. Veja o rastreamento da pilha abaixoRespostas:
Desde a v1.2.3 Requests, foi adicionado o objeto PreparedRequest. Conforme a documentação "contém os bytes exatos que serão enviados ao servidor".
Pode-se usar isso para imprimir uma solicitação, assim:
que produz:
Em seguida, você pode enviar a solicitação real com isso:
Esses links são para a documentação mais recente disponível, portanto, eles podem mudar de conteúdo: Avançado - Solicitações preparadas e API - Classes de nível inferior
fonte
requests
é simples, então eu acho que isso deve tornar-se a resposta aceitaresponse = requests.post(...)
(ourequests.get
ourequests.put
etc), poderá realmente obter oPreparedResponse
máximoresponse.request
. Ele pode salvar o trabalho de manipulação manualrequests.Request
erequests.Session
, se você não precisar acessar os dados http brutos antes de receber uma resposta.Estou usando os pedidos versão 2.18.4 e Python 3
fonte
Nota: esta resposta está desatualizada. Versões mais recentes do
requests
suporte recebendo o conteúdo pedido directamente, como resposta de AntonioHerraizS documentos .Não é possível obter o verdadeiro conteúdo bruto da solicitação
requests
, pois ela lida apenas com objetos de nível superior, como cabeçalhos e tipo de método .requests
usaurllib3
para enviar solicitações, masurllib3
também não lida com dados brutos - ele usahttplib
. Aqui está um rastreamento de pilha representativo de uma solicitação:Dentro da
httplib
maquinaria, podemos verHTTPConnection._send_request
os usos indiretosHTTPConnection._send_output
, que finalmente criam a solicitação e o corpo brutos (se existir) e osHTTPConnection.send
enviam separadamente.send
finalmente chega ao soquete.Como não há ganchos para fazer o que você deseja, como último recurso, você pode
httplib
usar o patch para obter o conteúdo. É uma solução frágil, e pode ser necessário adaptá-lo sehttplib
for alterado. Se você pretende distribuir software usando esta solução, considere a possibilidade de empacotar emhttplib
vez de usar o sistema, o que é fácil, pois é um módulo python puro.Infelizmente, sem mais delongas, a solução:
que produz a saída:
fonte
patch_send
várias vezes, apenas uma vez, depois de importarhttplib
Uma idéia ainda melhor é usar a biblioteca orders_toolbelt, que pode despejar solicitações e respostas como seqüências de caracteres para você imprimir no console. Ele lida com todos os casos complicados com arquivos e codificações que a solução acima não lida bem.
É tão fácil quanto isto:
Fonte: https://toolbelt.readthedocs.org/en/latest/dumputils.html
Você pode simplesmente instalá-lo digitando:
fonte
Aqui está um código, que faz o mesmo, mas com cabeçalhos de resposta:
Passei muito tempo procurando por isso, então vou deixar aqui, se alguém precisar.
fonte
Eu uso a seguinte função para formatar solicitações. É como o @AntonioHerraizS, exceto que também imprime objetos JSON no corpo e rotula todas as partes da solicitação.
E eu tenho uma função semelhante para formatar a resposta:
fonte
requests
suporta os chamados ganchos de eventos (a partir de 2.23, na verdade, existem apenasresponse
ganchos). O gancho pode ser usado em uma solicitação para imprimir dados completos do par de solicitação-resposta, incluindo URL, cabeçalhos e corpos efetivos, como:Executá-lo imprime:
Você pode mudar
res.text
parares.content
se a resposta for binária.fonte