Feign是java的轻量级http客户端,通过注解和接口就能快速实现http客户端,方便快捷;
官方git地址:OpenFeign/feign: Feign makes writing java http clients easier (github.com)
Feign集成的功能挺多的,这是官网的展示图:

简单使用
maven导入feign基本库:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>13.3</version>
</dependency>
先准备一个测试用的http服务端:
package test;
import java.io.IOException;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class MyHttpServer {
public static void main(String[] args) {
try {
HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
server.createContext("/testget", new MyHttpHandler());
server.createContext("/testpost", new MyHttpHandler2());
System.out.println("http server start");
server.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class MyHttpHandler implements HttpHandler {
@Override
public void handle(HttpExchange exchange) throws IOException {
System.out.println("GETuri:" + exchange.getRequestURI());
exchange.getRequestHeaders().entrySet().forEach(x -> {System.out.println("Header:" + x);});
exchange.sendResponseHeaders(200, 0);
exchange.getResponseBody().write("hello world".getBytes());
exchange.close();
System.out.println();
}
}
class MyHttpHandler2 implements HttpHandler{
@Override
public void handle(HttpExchange exchange) throws IOException {
System.out.println("POSTuri:" + exchange.getRequestURI());
exchange.getRequestHeaders().entrySet().forEach(x -> {System.out.println("Header:" + x);});
byte[] body = exchange.getRequestBody().readAllBytes();
System.out.println("body:" + new String(body));
exchange.sendResponseHeaders(200, 0);
exchange.getResponseBody().write("{\"name\":\"Jack\", \"age\":13}".getBytes());
exchange.close();
System.out.println();
}
}
简单测试demo:
使用注解和接口定义http请求:
package test;
import feign.Body;
import feign.Param;
import feign.RequestLine;
public interface MyHttpClient {
@RequestLine("GET /testget?key={key}")
String test1(@Param("key")String k);
@RequestLine("POST /testpost?str={x}")
@Body("hello {x}")
String test2(@Param("x")String str);
}
调用代码,使用Feign.builder()创建客户端,target()指定接口和base url:
package test;
import feign.Feign;
public class Test {
public static void main(String[] args) {
System.out.println("start");
MyHttpClient client = Feign.builder()
.target(MyHttpClient.class, "http://127.0.0.1:8080");
String res = client.test1("test");
System.out.println(res);
System.out.println(client.test2("Tom"));
}
}
启动http服务端,再启动测试feign客户端:
服务端打印:

客户端打印:

日志模块
还可以通过Feign的builder设置连接超时读取超时和日志模块:
MyHttpClient client = Feign.builder()
.options(new Request.Options(5, TimeUnit.SECONDS, 10, TimeUnit.SECONDS, true))
.logger(new Logger.JavaLogger("MyLog").appendToFile("logs/my.log"))
.logLevel(Logger.Level.FULL)
.target(MyHttpClient.class, "http://127.0.0.1:8080");
这个用的是自带的JavaLogger日志模块,需要注意设置日志文件的路径文件夹需要先创建好才可以,也可以使用例如slf4j日志模块,不过就需要maven导入对应模块了,feign有很多模块可以导入,基础模块就是feign-core,还有其他例如:feign-jackson、feign-okhttp、feign-slf4j、feign-httpclient、feign-gson

最低0.47元/天 解锁文章
539

被折叠的 条评论
为什么被折叠?



