利用springboot实现http mock 服务

Life is short , "play" more!
本文来自lihao's Blog,转载请注明。

实现原理:
1. springboot 搭建一个http restul service, 实现一个/error 接口(自定义的错误接口)
2. 当我们访问该服务时例如在 http://localhost:8080/api , 假设我们的springboot没有/api的requestmapping, 那么内部转到我们的自定义错误返回 /error, /error 的逻辑则去找对应的数据库中有没有定义/api 的mock 规则. 如果找到,则返回对应的mock 报文.

首先我们创建一个controller , implements ErrorController, 并实现

那么,当我们随意访问一个uri时,应该返回的404错误. 这时候我们让springboot服务, 遇到错误时, 自动跳转到访问 /error 接口.

如下是一个/error接口的实现. 首先判断404错误. 如果请求springboot第一次返回的是404错误,则表明当前服务没有此接口,则去mock规则去查询是否有配置的规则,如果有则获取到对应的mock报文并返回. 但是这里有一个问题是, /api 访问此接口的时候, response 返回的http 状态码是404. 此时springboot内部转到/error 接口. 此时我们在error接口中获取到了对应的mock报文,并想将response的http code 改为200 并返回. 但是 response(ResponseFacade 中的 org.apache.catalina.connector.Response 中的 org.apache.coyote.Response 的 setStatus方法实现, 当status>399 时,认为是系统错误. 此时setStatus并不会修改status的值. 通过这段代码,和实际在debug中的验证, 则发现,

1) /api (HttpServletRequest, HttpServletResponse) , 返回404后
2) /error (HttpServletRequest, HttpServletResponse) HttpServletResponse 中的值仍然是404, 此时手动setStatus 或者 通过 /error return ResponseEntity(设定其他的HttpStatus). 不会设置成功. 所以/error 也自然返回了 httpcode 404. 只是返回的body message 实现成了自定义.

备注: org.apache.coyote.Response的setStatus的源码片段如下.

其他思考: 通过/error 返回exception , 通过exception Handler 的方式应该也可以自定义返回的http status code和报文. 但此时自定义http status code可能也有类似的情况,需要通过反射的方式来强制设定. (待验证)

此篇文章已被阅读113 次


发表评论

电子邮件地址不会被公开。 必填项已用*标注