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);
}
}注意:请确保被调用的服务正确启动。