GET 请求是一种从指定资源请求数据的方法。它用于获取信息,就像是向服务器发送一个 “请把这个资源的数据给我” 的请求。例如,当你在浏览器中输入一个网址并回车时,浏览器通常会发送一个 HTTP GET 请求到服务器,以获取该网页的内容。
GET 请求的格式相对简单。它的请求行包含了请求方法(GET)、请求的 URL(统一资源定位符)和 HTTP 协议版本。例如:
GET /index.html HTTP/1.1
其中,GET 是请求方法,/index.html 是请求的资源路径,HTTP/1.1 是协议版本。
下面将介绍如何通过 Netflix Feign 发起 GET 请求。
完整代码请参考“Netflix Feign 准备工作”章节的 UserController.java 类,下面将提供无参数和有参数的 GET 请求服务:
// 无参数 // GET 请求,获取所有用户信息 @GetMapping("/getAllUsers") public CommonReturn<List<User>> getAllUsers() { log.info("getAllUsers()"); return CommonReturn.success(USERS).ext(appName, appPort); } // 有参数 // GET 请求,根据用户 ID 获取用户信息 @GetMapping("/getUserById") public CommonReturn<User> getUserById(@RequestParam("id") Long id) { log.info("getUserById() id={}", id); return USERS.stream() .filter(user -> user.getId().equals(id)) .findFirst() .map(u -> CommonReturn.success(u).ext(appName, appPort)) .orElse(CommonReturn.fail("用户不存在")); }
根据上面提供的服务接口信息,编写一个 Feign 客户端:
public interface UserFeign { // 无参数请求 @RequestLine("GET /user/getAllUsers") CommonReturn<List<User>> getAllUsers(); // 有参数请求 @RequestLine("GET /user/getUserById?id={id}") CommonReturn<User> getUserById(@Param("id") Long id); // 创建Feign客户端实例的静态方法 static UserFeign create() { return Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .contract(new Contract.Default()) .target(UserFeign.class, "http://localhost:8090/"); } }
注意:上面代码中 @Param 注解将在后续章节介绍,该注解用来声明一个参数,然后在 @RequestLine 注解中通过“{name}”方式引用。
此时,可以直接使用 UserFeign.create() 静态方法创建一个 UserFeign 客户端的实例,调用对应的方法,实现 HTTP 请求,例如:
@RestController public class FeignController { @GetMapping("/demo2") public CommonReturn<List<User>> demo2() { return UserFeign.create().getAllUsers(); } @GetMapping("/demo3") public CommonReturn<User> demo3(@RequestParam Long id) { return UserFeign.create().getUserById(id); } }
上面示例中,通过 UserFeign.create().getAllUsers() 和 UserFeign.create().getUserById(id) 发起了对 /user/getAllUsers 和 /user/getUserById?id= 接口的调用。
完整代码请参考“Netflix Feign 准备工作”章节的 UserRestfulController.java 类,下面将提供有参数的 Restful 格式的 GET 请求服务:
// Restful 风格 // GET 请求,根据用户 ID 获取用户信息 @GetMapping("/{id}") public CommonReturn<User> getUserById(@PathVariable Long id) { log.info("getUserById() id={}", id); return USERS.stream() .filter(user -> user.getId().equals(id)) .findFirst() .map((u) -> CommonReturn.success(u).ext(appName, appPort)) .orElse(CommonReturn.fail("用户不存在")); }
根据上面提供的服务接口信息,编写一个 Feign 客户端:
public interface UserRestfulFeign { // 在路径上引用了 @Param 注解修饰的参数 @RequestLine("GET /user/restful/{id}") CommonReturn<User> getUserById(@Param("id") Long id); // 创建Feign客户端实例的静态方法 static UserRestfulFeign create() { return Feign.builder() .encoder(new JacksonEncoder()) .decoder(new JacksonDecoder()) .contract(new Contract.Default()) .target(UserRestfulFeign.class, "http://localhost:8090/"); } }
在 FeignController 类中添加 demo8 方法,如下:
@RestController public class FeignController { //... @GetMapping("/demo8") public CommonReturn<User> demo8(@RequestParam Long id) { return UserRestfulFeign.create().getUserById(id); } }
注意:请确保被调用的服务正确启动。