Abstract
python httpx を使用して通信エラーが発生し、その解決策を備忘録として残します。
会社などプロキシサーバーを使用している環境下のPCなどでhttpx をデフォルトのまま使用すると、うまく通信できない場合があります。
Introduction
私は外部ネットワークと遮断されたローカルネットワーク環境で動作させる業務システムおよびアプリ群を作ることがあります。
その際の業務システムはマイクロサービスアーキテクチャを採用することが多く、アプリ間通信を行います。
アプリのAPIとしてRestfulAPIを採用することが多いです。
今回、python のAPPを作るにあたり、 httpx を使用する実装を試みました。
私の業務環境では複数台のPCで開発環境、テスト環境、本番環境と使い分けています。
すると、一部の開発環境のPCで httpx を使った実装が通信エラーとなる事例が発生しました。
http://localhost に対して通信を試みても、通信エラーになるとう自体が発生しました。
調査したところ、python requests や curl, ブラウザ, JavaScript(TypeScript) を使った場合問題なく通信でましたが、httpx を使った場合のみ、プロキシーサーバーエラーになっていました。
httpx の仕様で知らないことがあると推測しました。
ネット検索やAIで調べてもよい一発で回答がえられなかったため、記事として残すことにします。
Conclusion
公式リファレンスを読むと、httpx はデフォルトで環境変数を使用する仕様のようです。
社内でプロキシーサーバーを利用している場合、会社から支給されているPCは環境変数にプロキシーサーバーを使用するように設定されている可能性があります。
つまり、 httpxが環境変数を読まないようにしてやればよいのです。
Client(AsyncClient)を使用する場合
httpx.Client(httpx.AsyncClient)の trust_env オプションを False にします。
import httpx
url = 'http://localhost:3000/api/...'
with httpx.Client(trust_env=False) as client:
resp = client.get(url)
# // 処理が続く
トップレベルの関数を使う場合
import httpx
url = 'http://localhost:3000/api/...'
httpx.get(url, trust_env=False)
社給のPCなど自分で設定していないPCの場合、知らない環境設定がされている可能性が高いので注意が必要です。
環境変数を変更するという方法も考えられますが、勝手にいじると怒られそうなので自重しました。