1、背景
用 postman 测试 zuul 网关 路由成功和失败的时候,发现 路由成功的时候,返回的结构体 是 json 格式,但是路由失败的时候,返回的是空。 结构体居然不一样,这对调用方来说也要疯了。
赶紧统一结构体。
方法一
查看路由失败的代码:
/**
* 设置 403 无权限状态
*/
private void setUnauthorizedResponse(RequestContext requestContext) {
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
}
赶紧google, 看了一些博客,都是这样设置的, 难道他们都不需要 返回的吗,还是说我项目问题。 立马 新建一个 项目测试,值添加一个 tokenfilter
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
return null;
}
这时确实返回的空。
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
ctx.setResponseBody("auth failed");
return null;
}
输出 一段字符。:auth failed.
方法二
正常以为 设置了code, 应该能正常的输出,居然没有,就进行debug。
并且 看到篇文件(ZuulFilter中设置Response的原理。) ,测试 ok。
同时,看到文章中对 Filter的介绍,提到 SendResponseFilter
,对包含 respondBody 的情况 进行结果输出
@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
return context.getThrowable() == null
&& (!context.getZuulResponseHeaders().isEmpty()
|| context.getResponseDataStream() != null
|| context.getResponseBody() != null);
}
@Override
public Object run() {
try {
addResponseHeaders();
writeResponse();
}
catch (Exception ex) {
ReflectionUtils.rethrowRuntimeException(ex);
}
return null;
}
进行测试,发现ok, 最终 进行 返回结构的统一。
路由失败的代码:
/**
* 设置 403 无权限状态
*/
private void setUnauthorizedResponse(RequestContext requestContext) {
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
String result = JSON.toJSONString(new ResultInfo().fail(404, "404", "Forbidden"));
requestContext.setResponseBody(result);
requestContext.getResponse().setContentType("application/json;charset=UTF-8");
}
返回结果:
{
"code": "404",
"msg": "Forbidden",
"ret": 404,
"success": false
}
总结:
setResponseStatusCode
的值 对 filter 进行了过滤- 自定义输出结果, 需要 设置 ResponseBody。
- 现在是刚用阶段,需要深入的去了解下
- 居然有花了2个小时