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?
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. –
Das ist gut für mich. Ich habe getestet und es funktioniert. Würde es Ihnen etwas ausmachen, als Antwort zu posten? – Klaus
Das ist gut. Ich habe es mit etwas Ausarbeitung gemacht. –