用Zuul处理GET体

时间:2016-12-03 04:31:03

标签: servlets netflix-zuul spring-cloud-netflix

我正在使用Zuul代理一个奇怪的客户端,该客户端将一个正文作为GET请求的一部分发送。遗憾的是,我无法改变客户。

使用curl这样的请求可以发送:

curl -XGET 'localhost:8765/kibana/index.html' -d' {"key": "value"}'

并且数据实际上是在身体中发送的。然而,在zuul方面,当我尝试阅读身体时,它是空的。这是我的原型zuul代码:

@Configuration
@ComponentScan
@EnableAutoConfiguration
@Controller
@EnableZuulProxy
public class ZuulServerApplication {

    @Bean
    public ZuulFilter myFilter() {
    return new ZuulFilter(){

        @Override
        public Object run() {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request=(HttpServletRequest)ctx.getRequest();
            try {
                InputStream is=request.getInputStream();
                String content=IOUtils.toString(is);
                System.out.println("Request content:"+content);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return null;
        }

        @Override
        public boolean shouldFilter() {
            return true;
        }

        @Override
        public int filterOrder() {
            return 10;
        }
        @Override
        public String filterType() {
            return "pre";
        }};
    }
         public static void main(String[] args) {
            new SpringApplicationBuilder(ZuulServerApplication.class).web(true).run(args);
        }

    }

如果我发送POST请求,则此代码会毫无问题地打印请求正文。但是,如果我发送上述GET请求,则不会打印正文。我可以做些什么来实际将身体作为GET请求的一部分发送?

1 个答案:

答案 0 :(得分:1)

似乎某些基础机器[0],例如一些内置的Z​​uul过滤器,具有较小的过滤顺序,取代了默认的" raw" HttpServletRequest HttpServletRequestWrapper GET,在标准情况下(即不是身体的GET方法),能够处理输入流的多次采集。但是对于HttpServletRequestWrapper方法,正文filterOrder似乎代理输入流。

因此解决方案可能是更改-10,例如到HttpServletRequest

然后它适用于过滤器,因为使用了HttpServletRequest - 提到的机制没有轮到它,因此还没有用HttpServletRequestWrapper替换GET。但是这个解决方案的潜在问题是过滤器可能会耗尽其他输入流,例如:筛选器具有更高的筛选顺序但是,由于身体{{ Form::text('description[$i]', null, array('class' => 'form-control', 'placeholder' => 'Description')) }} 无论如何都不是一个好习惯,毕竟它可能是一个很好的解决方案:)

[0]我已经在很久以前调试了这个问题,但没有达到准确的程度 - 因此对机器的定义模糊不清。