Wie, um eine Reaktion zu erhalten Körper in Zuul post-filter?
Wie es möglich ist, zu Lesen, eine Antwort-Körpers während der Verwendung Zuul als proxy in post
filter?
Ich versuche zu rufen, wird der code wie folgt:
@Component
public class PostFilter extends ZuulFilter {
private static final Logger log = LoggerFactory.getLogger(PostFilter.class);
@Override
public String filterType() {
return "post";
}
@Override
public int filterOrder() {
return 2000;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.getResponseBody(); //null
//cant't do this, cause input stream is used later in other filters and I got InputStream Closed exception
//GZIPInputStream gzipInputStream = new GZIPInputStream(stream);
return null;
}
}
InformationsquelleAutor Dariusz Mydlarz | 2016-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich es geschafft, dies zu überwinden. Die Lösung besteht aus 4 Schritten:
ctx.getResponseDataStream()
in einen ByteArrayOutputStreamcontext.setResponseBody(inputStream)
2000
?Erinnere mich nicht genau, aber wahrscheinlich ja. Hast du kopiert inputstream?
Kopieren der
InputStream
Super geklappt, aber ich musste meinen filter um, bevororg.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter
. Mit etwas mehr als 1000 führt zu einer "InputStream bereits geschlossen" - Fehler, weil die Antwort Körper bereits gelesen und zurückgegeben.Ok, gut. Die Nummer, die ich verwendet, im Beispiel war wohl nicht so wichtig für meine Frage 😉
der filter sollte ein Teil der Antwort. Ich war versucht, für Stunden, wurde nur der filter Nummer 10 und es funktionierte
InformationsquelleAutor Dariusz Mydlarz
Wie Sie sehen können, in diesem Beispiel, haben Sie zwei Methoden zur Verfügung zum extrahieren der Antwort der Körper:
1 - ctx.getResponseBody();
2 - ctx.getResponseDataStream();
Müssen Sie überprüfen, welche nicht null sind, und diese verwenden.
in meinem Fall, ctx.getResponseBody(); return null, so dass ich verwendet, ctx.getResponseDataStream(); statt
gerade festgestellt, dass die
delete
hatctx.getResponseBody()
aberpost
undput
hatgetResponseDataStream()
InformationsquelleAutor Pablo Valiente
Vielen Dank für die Anregung, das ist der code, den ich verwendet, funktioniert.
CharStreams.toString()
wird@Beta
(IntelliJ warnt davor, es), könnte man auch verwenden, SpringStreamUtils.copyToString()
wenn es eine Abhängigkeit. Auf diese Weise kann man auch weglassenInputStreamReader
Instanz. Auch, imho ist es ein bisschen sauberer zu verwendenStandardCharsets.UTF_8
statt"UTF-8"
.InformationsquelleAutor codesalsa
Vorsichtig sein, die filterNumber
Benutzte ich die Nummer 10 und fein gearbeitet
InformationsquelleAutor Pedro Romão
Wenn jemand kämpft mit komprimierten Antwort, hier die Lösung die ich verwendet habe:
Versuchen Sie nie, ein problem zu lösen, bevor die Suche, wenn das problem existiert in SO! 😉 Im ernst, bin froh, dass es geholfen hat!
InformationsquelleAutor VincentS
Keiner der Antworten, die für mich gearbeitet.
1) Reihenfolge der filter muss niedriger sein, 1000 (senden response filter)
2) Code:
InformationsquelleAutor Damian