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() 方法。