前言
前后端使用RESTful API风格交互,项目最后验收竟然要求仅允许GET,POST请求?!!
思路
-
前端处理
1.前端请求携带自定义请求头`origin-method`标识,值为原请求方法 2.在请求拦截器中,非`GET`,`POST`请求改成`POST` -
网关处理
网关通过自定义请求头`origin-method`获取原请求方法,修改请求方法转发到服务
实现
前端
-
Angular@Injectable() export class GetPostInterceptor implements HttpInterceptor { constructor() {} intercept(req: HttpRequest<any>, next: HttpHandler) { let originMethod = req.method; let newMethod = originMethod != 'GET' || originMethod != 'POST' ? 'POST' : originMethod; const newReq = req.clone({ method: newMethod, headers: req.headers.set('origin-method', originMethod) }); return next.handle(newReq); } }
网关
-
Nginxserver { # ... location / { # 关键配置 # 修改请求方法 # nginx获取自定义请求头 ,官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#var_http_ proxy_method $http_origin_method } } -
Spring Cloud Gateway@Order(Ordered.HIGHEST_PRECEDENCE) @Component public class GetPostGatewayFilter implements GlobalFilter { private final String HEADER_ORIGIN_METHOD = "origin-method"; @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String originMethod = request.getHeaders().getFirst(HEADER_ORIGIN_METHOD); HttpMethod method = HttpMethod.resolve(originMethod); if (method == null) { return chain.filter(exchange, filter); } ServerHttpRequest newReq = request.mutate().method(method).build(); return chain.filter(exchange.mutate().request(newReq).build()); } }
结尾
如果文章对你有帮助,请点 赞👍🏻 支持一下。若有错误之处或有更好的建议,欢迎指正,谢谢。