2016-12-03 3 views
1

Ich benutze Zuul, um einen fremden Klienten zu vertreten, der einen Körper als Teil einer GET-Anfrage sendet. Leider kann ich den Kunden nicht ändern.Verarbeitung GET-Körper mit Zuul

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

und die Daten wirklich im Körper gesendet:

Mit curl eine solche Anfrage kann gesendet werden. Auf der Zuulseite jedoch, wenn ich versuche, den Körper zu lesen, ist es leer. Hier ist mein Prototyp zuul Code ist:

@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); 
     } 

    } 

Wenn ich eine POST-Anforderung senden, die dieser Code druckt die Anfrage Körper ohne Problem. Wenn ich jedoch die obige GET-Anfrage sende, wird der Körper nicht gedruckt. Alles, was ich tun kann, um den Body als Teil einer GET-Anfrage zu erhalten?

+0

Es scheint, dass einige zugrunde liegende Maschinen nicht Proxy-Input-Stream, wenn es GET-Methode mit Körper ist. Da, wenn 'filterOder' auf '10' gesetzt ist, wird 'HttpServletRequestWrapper' von 'ctx.getRequest()' zurückgegeben, das normalerweise in der Lage ist, Mehrfacherfassung von Eingabestrom zu verarbeiten. Wenn 'filterOrder' z. '-10', dann funktioniert es für diesen Filter, da mehr rohe' HttpServletRequest' verwendet wird (kein anderer Filter könnte 'HttpServletRequest' durch' HttpServletRequestWrapper' ersetzen). Aber es könnte den Eingangsstrom für etwas anderes erschöpfen. –

+0

Das ist gut für mich. Ich habe getestet und es funktioniert. Würde es Ihnen etwas ausmachen, als Antwort zu posten? – Klaus

+0

Das ist gut. Ich habe es mit etwas Ausarbeitung gemacht. –

Antwort

1

Es scheint, dass einige zugrunde liegenden Maschinen [0], z.B. einig integrierte in Zuul Filter mit geringerer Filterordnung ersetzt „raw“ HttpServletRequest mit HttpServletRequestWrapper, die unter Standard Umstände (d.h. nicht GET Methode mit Körper) ist standardmäßig die Lage, mehrere Übernahme von Eingangsstrom zu handhaben. Aber im Fall von GET Methode mit Körper HttpServletRequestWrapper scheint nicht Proxy-Eingangsstrom überhaupt.

So konnte Lösung filterOrder zum Beispiel zu ändern sein zu -10.

Dann funktioniert es für die Filter seit HttpServletRequest verwendet wird - die genannten Maschinen nicht seinerseits bekamen und somit nicht HttpServletRequest mit HttpServletRequestWrapper noch ersetzen haben. Ein potentielles Problem bei dieser Lösung besteht jedoch darin, dass der Filter den Eingangsstrom für etwas anderes, z. Filter mit höherer Filterreihenfolge. Aber seit GET mit Körper ist keine gute Praxis sowieso, es könnte doch gut genug Lösung sein :)

[0] Ich habe debuggen in diesem vor längerer Zeit, aber nicht genau Punkt - also vage Definition von "der Maschinerie".