2017-07-31 12 views
0

私のアプリでは、netflix zuulを使用して、マイクロサービス(ゲートウェイ)から別のリクエストにリクエストをルーティングしています。要求はうまくルーティングされていますが、適切なマイクロサービスにルーティングされる前に、要求本体にいくつかのパラメータを導入したいと考えています。これのために私はこのようなZuul preフィルタを使用しています。今私は大文字に身体を変更しようとしていますが、この要求がルーティングされているmicroserviceが変更体(大文字)を受信しないためにZuulプリフィルタのリクエストボディを変更できない

public class SimpleFilter extends ZuulFilter { 

    private static Logger log = LoggerFactory.getLogger(SimpleFilter.class); 

    @Override 
    public String filterType() { 
     return "pre"; 
    } 

    @Override 
    public int filterOrder() { 
     return 1; 
    } 

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

    @Override 
    public Object run() { 

     try { 
      RequestContext context = RequestContext.getCurrentContext(); 

      InputStream in = (InputStream) context.get("requestEntity"); 
      if (in == null) { 
       in = context.getRequest().getInputStream(); 
      } 

      String body = StreamUtils.copyToString(in, Charset.forName("UTF-8")); 

      // body = "request body modified via set('requestEntity'): "+ body; 
      body = body.toUpperCase(); 
      context.set("requestEntity", new ByteArrayInputStream(body.getBytes("UTF-8"))); 

     } catch (IOException e) { 
      log.error(e.getMessage(), e); 
     } 

     return null; 
    } 

} 

。代わりに元のものを受け取ります。私は間違ったことをしていますか?どんな助けもありがとう。ありがとう!!

+0

SimpleFilterという名前のBeanがありますか? – Laurynas

+0

ちょっと@Laurynasはい私はそのような豆を持っています。そして、私はデバッグを行い、requestEntityが変更されていることを確認し、上記の手順の後に新しいボディを含むコンテキストを含んでいます。しかし、要求がルーティングされるサービスには前の本体、すなわち小文字 – varunkr

答えて

1

これを試してくださいあなたのケースではうまくいくかもしれません。

requestContext.getCurrentContext().put("requestEntity", new ByteArrayInputStream(body.getBytes("UTF-8"))); 
0

このメソッドは、requestContext内の要求本体を変更できません。 requestContextでは、新しいフィールド "requestEntity"が追加されますが、context.getRequest()。getInputStream()のリクエスト本文はこの操作の後も変わりません。

関連する問題