POST 请求是一种用于向服务器提交数据的方法。与 GET 请求主要用于获取数据不同,POST 请求的目的是改变服务器的状态,例如向服务器上传文件、提交表单数据(如用户注册、登录信息、商品订单等)。
例如,在一个电子商务网站的购物流程中,当用户完成商品选择并提交订单时,浏览器会向服务器发送一个 POST 请求。这个请求包含了用户的订单信息,如商品名称、数量、收货地址、支付方式等。服务器接收到这些数据后,会进行订单处理,如验证库存、计算价格、安排发货等,这一系列操作会改变服务器端的状态。
POST 请求格式为:
POST <请求URL> HTTP/协议版本
例如:
POST /submit-order HTTP/1.1
其中,POST 是请求方法,/submit-order 是请求的资源路径,HTTP/1.1 是 HTTP 协议版本。
完整代码请参考“Netflix Feign 准备工作”章节的 UserController.java 类,下面将提供一个 POST 服务,用于创建用户,如下:
// POST 请求,创建新用户
@PostMapping("/createUser")
public CommonReturn<User> createUser(@RequestBody User user) {
log.info("createUser() user={}", user);
USERS.add(user);
return CommonReturn.success(user).ext(appName, appPort);
}上面代码使用 @RequestBody 注解从 POST 请求的 BODY 中获取数据,并且将数据自动封装为 User 类型对象。
根据上面提供的服务接口信息,编写一个 Feign 客户端:
public interface UserFeign {
// 看这里
@RequestLine("POST /user/createUser")
@Headers("Content-Type: application/json")
CommonReturn<User> createUser(User user);
// 创建Feign客户端实例的静态方法
static UserFeign create() {
return Feign.builder()
.encoder(new JacksonEncoder())
.decoder(new JacksonDecoder())
.contract(new Contract.Default())
.target(UserFeign.class, "http://localhost:8090/");
}
}上述示例中,通过 @Headers 注解添加了一个名为 Content-Type,值为 application/json 的请求头,后续将详细介绍 @Headers 注解的用法。
完整代码请参考“Netflix Feign 准备工作”章节的 FeignController.java 类,下面仅仅给出了 demo4 方法的代码:
@RestController
public class FeignController {
@GetMapping("/demo4")
public CommonReturn<User> demo4(@RequestParam Long id,
@RequestParam String name,
@RequestParam Integer age) {
return UserFeign.create().createUser(
User.builder().id(id).name(name).age(age).build());
}
}上述代码,为了演示方便,用户通过 http://localhost:8080/demo04?id=100&name=Tom&age=100 地址去传递用户信息,后端手动构建一个 User 对象,然后将对象传递给 Feign 客户端的 createUser() 方法。