dram.me

urllib3与requests的API设计比较

Python应用最为广泛的HTTP客户端库为requests,这是广为人知的工具库。而urllib3则是requests实现的基石,这个库知道的人不多。

从对两者的比较中,可以发现在功能定位以及API设计中的考量有比较大的差异。

如果从分层结构上考虑,假设Python标准库作为最底的第一层,urllib3大体落在一层,更严格的界定的话可以作为1.5层。考量的因素主要是urllib3总体没有全面覆盖标准库的功能,上层应用在使用时需要借助jsonencodingurllib2等库结合urllib3使用才能完成任务。

但requests则不同,它基于urllib3以及其他标准库封装。在日常使用中,很多时候不需要关注编码、序列化等问题。

可以拿UNIX的 KISS哲学与systemd的不同作为类比。urllib3只做单一的事,而requests则有一种大一统的想法。

urllib3的模式虽则在使用时会显得比较啰嗦,但可以更加灵活地加以应用。并且将部分合理的复杂性暴露给开发人员,有助于增进对系统的理解。对系统的深入理解的益处在排查问题以及应对特殊需求时最能得以体现。

从这一例子中也可以发现,虽然在软件设计中,分层有其非常重要的价值,但过多的不合理的层次也会增加系统的复杂性。

另外一点需要注意的是,urllib3的模式有更低的学习成本,举例来说:urllib3对响应体不做任何处理,所有处理方式由调用者指定,开放人员可以结合自己已有的对json模块的理解组合使用。而对requests则需要了解如何通过不同的参数控制其对响应体的处理。