你可以使用 Jersey 和 CXF 这些来写一个 Rest 或 SOAP 服务的java客服端。
你也可以直接使用 Apache HttpClient 来实现。但是 Feign 的目的是尽量的减少资源和代码来实现和 HTTP API 的连接。
*通过自定义的编码解码器以及错误处理,你可以编写任何基于文本的 HTTP API。
Feign通过注解注入一个模板化请求进行工作。只需在发送之前关闭它,参数就可以被直接的运用到模板中。
*然而这也限制了Feign,只支持文本形式的API,它在响应请求等方面极大的简化了系统。
interface UserService {
List getUserList( String userName, int age);
}
static class User {
String userName;
int age;
}
public static void main(String... args) {
User user = Feign.builder()
.decoder(new GsonDecoder())
.target(UserService.class, "https://api.github.com");
List userList = github.getUserList("libo", 12);
for (User user : userList) {
System.out.println(user.userName + " (" + user.age + ")");
}
}
复制代码
Feign 有许多可以自定义的方面。举个简单的例子,你可以使用 Feign.builder() 来构造一个拥有你自己组件的API接口,如下:
interface Bank {
Account getAccountInfo( String id);
}
复制代码
// AccountDecoder() 是自己实现的一个Decoder
Bank bank = Feign.builder().decoder(new AccountDecoder()).target(Bank.class, https:
复制代码
举个例子,下面的这个模式允许使用当前url和身份验证token来装饰每个发往身份验证中心服务的请求。
CloudDNS cloudDNS = Feign.builder().target(new CloudIdentityTarget(user, apiKey));
Feign 包含了 GitHub 和 Wikipedia 客户端的实现样例.相似的项目也同样在实践中运用了Feign。尤其是它的示例后台程序。
Feign 可以和其他的开源工具集成工作。你可以将这些开源工具集成到 Feign 中来。目前已经有的一些模块如下:
添加 GsonEncoder 以及 GsonDecoder到你的 Feign.Builder 中, 如下:
GsonCodec codec = new GsonCodec();
GitHub github = Feign.builder()
.encoder(new GsonEncoder())
.decoder(new GsonDecoder())
.target(GitHub.class, https:
复制代码
<dependency>
<groupId>com.netflix.feigngroupId>
<artifactId>feign-gsonartifactId>
<version>8.18.0version>
dependency>
复制代码
添加 JacksonEncoder以及 JacksonDecoder到你的Feign.Builder 中, 如下:
UserService service = Feign.builder()
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.target(UserService.class, https:
复制代码
<dependency>
<groupId>com.netflix.feigngroupId>
<artifactId>feign-jacksonartifactId>
<version>8.18.0version>
dependency>
复制代码
api = Feign.builder().decoder(SAXDecoder.builder()
.registerContentHandler(UserIdHandler.class)
.build())
.target(Api.class, https:
复制代码
<dependency>
<groupId>com.netflix.feigngroupId>
<artifactId>feign-saxartifactId>
<version>8.18.0version>
dependency>
复制代码
添加 JAXBEncoder 以及 JAXBDecoder 到你的 Feign.Builder 中, 如下:
api = Feign.builder()
.encoder(new JAXBEncoder())
.decoder(new JAXBDecoder())
.target(Api.class, https:
复制代码
<dependency>
<groupId>com.netflix.feigngroupId>
<artifactId>feign-jaxbartifactId>
<version>8.18.0version>
dependency>
复制代码
JAXRSContract 使用 JAX-RS规范重写覆盖了默认的注解处理。
下面是一个使用 JAX-RS 的例子:
interface GitHub {
List contributors( String owner, String repo);
}
GitHub github = Feign.builder()
.contract(new JAXRSContract())
.target(GitHub.class, https:
复制代码
<dependency>
<groupId>com.netflix.feigngroupId>
<artifactId>feign-jaxrsartifactId>
<version>8.18.0version>
dependency>
复制代码
OkHttpClient使用OkHttp来发送Feign的请求,OkHttp支持SPDY (SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验),并有更好的控制http请求。
要让 Feign 使用 OkHttp ,你需要将 OkHttp 加入到你的环境变量中区,然后配置 Feign 使用 OkHttpClient,如下:
GitHub github = Feign.builder()
.client(new OkHttpClient())
.target(GitHub.class, "https://api.github.com");
复制代码