質問: pythonのリクエスト - httpリクエスト全体を印刷する(raw) requestsモジュール を使っている間に、生のhttpリクエストを出力する方法はありますか?ヘッダだけではなく、要求行、ヘッダ、およびコンテンツのプリントアウトが必要です。最終的にhttpリクエストから構築されるものを見ることは可能ですか?
回答: リクエストをフォーマットするために次の関数を使います。これは@antonioherraizsに似ていますが、ボディ内のjsonオブジェクトもきれいに印刷され、リクエストのすべての部分にラベルが付けられる点が異なります。format_json = functools.partial(json.dumps, indent=2, sort_keys=true) indent = functools.partial(textwrap.indent, prefix=' ') def format_prepared_request(req): """pretty-format 'requests.preparedrequest' example: res = requests.post(...) print(format_prepared_request(res.request)) req = requests.request(...) req = req.prepare() print(format_prepared_request(res.request)) """ headers = '\n'.join(f'{k}: {v}' for k, v in req.headers.items()) content_type = req.headers.get('content-type', '') if 'application/json' in content_type: try: body = format_json(json.loads(req.body)) except json.jsondecodeerror: body = req.body else: body = req.body s = textwrap.dedent(""" request ======= endpoint: {method} {url} headers: {headers} body: {body} ======= """).strip() s = s.format( method=req.method, url=req.url, headers=indent(headers), body=indent(body), ) return s そして私は応答をフォーマットするための同様の機能を持っています。def format_response(resp): """pretty-format 'requests.response'""" headers = '\n'.join(f'{k}: {v}' for k, v in resp.headers.items()) content_type = resp.headers.get('content-type', '') if 'application/json' in content_type: try: body = format_json(resp.json()) except json.jsondecodeerror: body = resp.text else: body = resp.text s = textwrap.dedent(""" response ======== status_code: {status_code} headers: {headers} body: {body} ======== """).strip() s = s.format( status_code=resp.status_code, headers=indent(headers), body=indent(body), ) return s