2016-08-03 48 views
2

Ich habe einige JAX-RS-Webdienste mit Methodensignaturen wie unten. Ist es möglich, die rohen JSON-Anforderungen, die von den Clients kommen, und die rohe JSON-Antwort, die an die Clients zurückgegeben wird, auszudrucken?Drucken JSON-Anforderungen/Antworten für jeden JAX-RS-Dienst

@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public Response XXX(@Context HttpServletRequest request, Parameters requestParameters) { 
    ... 
} 

Vielen Dank im Voraus.

+0

Für die Wieder json 'Rückkehr Response.ok (returnedJsonString, MediaType.APPLICATION_JSON) .build() hilft,' –

+0

Sie haben meine Anforderung falsch verstanden. Ich möchte die JSON-Anforderungen, die von den Clients kommen, ausdrucken und die JSON-Antworten, die an die Clients zurückgegeben werden, ausdrucken. Wenn der Client beispielsweise {"x": "123"} gesendet hat, möchte ich diese genaue Zeichenfolge zum Zweck der Fehlerbehebung ausgeben können. – user3573403

Antwort

2

Dies kann über Anfrage Filter für Sie getan werden. Dies ist meine Implementierung:

@Path("test") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class HelloResource { 

    private static final Logger log = Logger.getLogger(HelloResource.class); 

    @POST 
    @Path("/test") 
    public Response test(String body) { 
     Map<String, String> tmp = new HashMap<>(); 
     tmp.put("test", "value"); 
     return Response.ok(tmp).build(); 
    } 

} 

Die Ressource zum Testen. Nimmt nur den Körper als eine Schnur.

Jetzt können Sie einen ContainerResponseFilter und einen ContainerRequestFilter registrieren.

Diese Filter werden vor und nach der Anfrage aufgerufen. Vorher wird der eingehende Körper gedruckt, danach wird der Antwortkörper gedruckt.

Es ist wichtig, beides nicht im Antwortfilter zu tun, da die Anfrageeinheit Stream zum Zeitpunkt der Ausführung des Antwortfilters geschlossen ist.

Das ist, wenn Sie Ihre Körper, z. wie folgt:

Ich benutze Apache-Commons, um den Request Stream in einen String zu lesen.

Für meine JSON-Datei, wie die Suche:

[email protected]:~/tmp/test$ cat 1.json 
{ 
    "eventType": 1, 
    "params": { 
    "field1" : 10 
    } 
} 

ich eine Locke machen, wie folgt aussehen:

[email protected]:~/tmp/test$ curl -XPOST "localhost:9085/api/test/test" -H "Content-Type: application/json" --data @1.json 
{"test":"value"} 

Welche meiner Konsole gedruckt wird:

request body: { "eventType": 1, "params": { "field1" : 10 }} 
Response body: {test=value} 

Das ist offensichtlich nur eine von vielen Lösungen. Dies würde für alle Json-Inhaltstypen funktionieren (und ehrlich gesagt, die meisten anderen Inhaltstypen, die ich auch erwarten würde).

Hoffnung, dass

Artur

+0

Danke pandaadb. Ihr Anfrageteil funktioniert gut für mich. Für den Antwortteil protokolliert er nicht die genaue JSON-Antwort. Ich bezweifle wirklich, dass es möglich ist, die genaue JSON-Antwort auf den Client zu protokollieren. Wie auch immer, die Anfrageprotokollierung ist mir wichtiger und Ihre Lösung ist gut genug. – user3573403

+0

Hallo @ user3573403 Bitte stellen Sie sicher, dass, nachdem Sie den INputstream in Ihrem Filter verbraucht und drucken, Sie es zurück auf die Anfrage setzen. Ein Stream kann nur einmal gelesen werden und Sie müssen möglicherweise einen neuen Stream erstellen, damit die Anfrage nach dem Lesen verwendet werden kann. Bitte debuggen und stellen Sie sicher, dass die Ressource abruft, was Sie erwarten! – pandaadb