MicroPythonでurequestsを使う

ESP32版のMicroPythonでは、urequestsモジュールが標準で組み込まれています(現時点では)。
これはWebサーバにリクエストを投げて、応答を得るためのライブラリで、PythonのrequestsモジュールのMicroPython版(機能はだいぶ削られていますが)です。

現時点では、GET、HEAD、PUT、POST、PATCH、DELETEの各HTTPリクエストが実装されています。
PATCHというHTTPメソッドがあるんですね。初めて知りました。
ただ、このモジュールのソースを見るとHTTPバージョン1.0でリクエストを投げるようになっているので、HTTP 1.1のメソッドであるPATCHを要求するとエラーになる可能性もあるように思います。

サーバから返された結果はResponseオブジェクトに格納されます。

このオブジェクトは、

 status_code HTTPステータスコード(正常なら200)
 reason HTTPステータスコードのReason(正常なら’OK’)
 encoding 文字コード(ただし現状では’utf-8’固定の実装となっている)
 content 生の応答データ
 text contentをencodingに従ってテキストに変換したもの
 json() contentをjsonとして解釈したもの(ujsonモジュールを使用)
 
を得ることができます。

内部的には、HTTPヘッダを読み終えた時点でソケットオブジェクトがResponseオブジェクトに渡されます。
ソケットオブジェクトはrawプロパティにセットされ、contentが初めて参照されたときにそのソケットからデータを読んでオブジェクト内にキャッシュするようになっています。
ソケットをcloseするには、close()を呼びます。

何度か例題に取り上げた、現在の為替レートを得るWebサービスにアクセスするには、以下のようになります。

WiFiに接続する部分は上記には入っていませんが、それでも短いですね。

ただし、現時点ではこのコードはESP32/ESP8266のMicroPythonでないと動かないと思います。
urequestsは内部でsocket.readline()を使用していますが、CC3100やWIZnet5Kなど、上記以外のNICではreadline()が実装されていないからです。

そのため、WIZnet5Kに関してはTCP/IP実装はlwIPを使用し、WIZnet5Kは単なるイーサネットインタフェースとして使用するようなMicroPython側のドライバ実装が現在テスト中のようです。

stm32: Incorporate lwip stack and use Wiznet in MACRAW mode by dpgeorge · Pull Request #3379 · micropython/micropython

ただ、TCP/IPをメインCPUで処理するため、WIZnet5Kのソケット機能を使う場合よりも速度は低下するようです。

コメント