我正在使用第三方 HTTP 客户端进行 GET、POST 调用。我不想将我的代码绑定到这个库。所以我决定创建一个名为 HttpClient 的接口和一个名为 HttpClientImpl 的实现。
接口中的方法之一是:
Response get(String url);
从接口返回的 Response 对象是来自第三方库的对象。所以这在技术上不会将我的代码与第三方库分离。
解耦自己的最佳方法是什么?我应该创建自己的响应对象来包装第三方库的响应吗?
这是 Mediator 设计模式的经典案例:使用 HTTP 客户端的类不应暴露给 HTTP 客户端实现(您已经封装)或其响应对象。
在这种情况下使用泛型不会阻止使用类知道响应类。
正如你所建议的 - 有一个包装响应类/有一个从第 3 方响应到你自己的响应的转换器。
您是否考虑过抽象您通过 Http 访问的存储库,而不是抽象 http 库?例如,你有 Tweets 的 restful 端点:
GET https://someapi.com/Tweets
GET https://someapi.com/Tweets/{id}
POST https://someapi.com/Tweets
PUT https://someapi.com/Tweets/{id}
DELETE https://someapi.com/Tweets/{id}
TweetRepository
拥有一个可以创建、读取、更新和删除推文的类是有意义的。此类的接口可能类似于以下内容:
public interface TweetRepository {
public List<Tweet> get();
public int add(Tweet tweet);
public void remove(int id);
public Tweet get(int id);
public void update(int id, Tweet tweet);
}
如果您的控制器使用该接口,那么您可以让您的实现使用您想要的任何 http 库,而无需引入耦合。