对 Java HttpURLConnection 的设计的看法

因为 Google 不建议在后期版本的 Android 上使用 Apache HTTP Client,于是只好看下传闻设计比较糟糕的 HttpURLConnection 类。嗯,传闻不虚嘛。

在我看来,HttpURLConnection 最糟糕的一点在于 getInputStream 方法 出人意料的外部性了。
光从 API 的名字来开,这只是 get 一个 stream 而已。但实际上这个方法已经把建立连接到发送并接收数据整个流程都完成了。也就是说对连接、HTTP 请求的 header / entity 的所有配置都只有在该方法前执行才有效,而对 HTTP 响应的 status code 的读取都只有在该方法执行后有效。
对于一个如此重要且如此出乎意料的 API,Java 和 Android 的文档却都仅仅给了数行不着边际的一般性介绍。
补:另一个有相同外部性的方法是 getHeaderFields。很好,又是 get。

另一个可商榷之处在于 HttpURLConnection 对于返回的 HTTP status code 的处理。对 4xx 或 5xx 的 client / server error,getInputStream 都会抛出 FileNotFoundException 的异常,此时只有用 getErrorStream 才能读到返回的 entity。
在我看来,了解 HTTP 协议的使用者自然会由返回的 status code 上知悉该请求的状态,而不需要 API 在这里多此一举且平白增加代码复杂度的异常处理。

算半个题外话吧。Java 的 URL 类也够糟糕的了。openConnection?这个绝对应该放在某个工厂类里的方法被直接塞到了 URL 中。对统一资源定位符的操作与对其指向的内容的存取放在了一个类中,这在我看来是对 single responsibility 原则 的明显违反。这部分功能完全可以拆分到一个比如 URLClient 或 URLConnector 的类中。

Advertisements
This entry was posted in Computer and Internet, Web and tagged , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s