2017-09-11 1 views
0

Je travaille sur le repos api avec la botte de ressort. J'ai besoin de consigner toutes les demandes avec des paramètres d'entrée (avec des méthodes, par exemple GET, POST, etc), demander Url, chaîne de requête, aussi réponse de cette action, succès et erreurs et code d'état.Enregistrement de démarrage de ressort Communication Http

Je dois être connecté non seulement entrant https demande/réponse, mais sortant également https demandes/réponse. Je dois enregistrer une requête/réponse avec le format json. Pourriez-vous me dire la meilleure pratique au printemps pour y parvenir, et avec un exemple concret s'il vous plaît?

+0

Utilisez-vous une jetée intégrée ou un tomcat externe? –

+0

J'utilise Tomcat externe. – NAZEHA

+0

Quel client HTTP utilisez-vous? –

Répondre

0

Habituellement, cela peut être accompli en utilisant un servlet filter. Un filtre de servlet "intercepte" les requêtes à l'entrée et la réponse à sa sortie. Vous pouvez accéder à toutes les informations dont vous avez besoin dans HttpServletRequest et HttpServletResponse et les enregistrer comme vous le souhaitez.

Exemple simple:

public class LoggingFilter implements javax.servlet.Filter { 

private static final Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class); 

@Override 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
    HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; 
    HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; 

    // log information from the httpServletRequest like url, params, etc 
    filterChain.doFilter(servletRequest, servletResponse); 
    // log information regarding the httpServletResponse like status code, etc 
} 
} 

Enregistrement du filtre dans votre @ classe SpringBootApplication annotée:

@Bean 
public FilterRegistrationBean loadBalancerHealthCheckHandler() { 
    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new LoggingFilter()); 
    registration.addUrlPatterns("/*"); 
    return registration; 
} 
+0

Merci jorgen.ringen. Je peux l'utiliser pour les demandes entrantes mais comment intercepter les requêtes à sa sortie? – NAZEHA

+0

C'est un bon début. C'est aussi la façon dont j'accomplis actuellement la même chose. Mais il y a un problème avec l'accès au corps de la requête avant le Spring MVC. Le HttpServletRequest ne crache le corps de la requête qu'une seule fois via un InputStream. Vous devez faire une supercherie pour mettre en cache le corps de la requête afin qu'il soit accessible plusieurs fois. –

1

Il est org.springframework.web.filter.CommonsRequestLoggingFilter que vous pouvez utiliser pour connecter les chaînes de requête, en-têtes et le contenu du corps avant et après la demande.

// filter will be applied to all paths 
@Bean 
public CommonsRequestLoggingFilter loggingFilter() { 
    CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter(); 
    filter.setIncludeQueryString(true); 
    filter.setIncludeHeaders(true); 
    filter.setIncludePayload(true); 
    filter.setMaxPayloadLength(1000); // default is 50 bytes 
    return filter; 
} 

Il existe quelques paramètres supplémentaires. En outre, si cette implémentation ne vous convient pas, vous pouvez hériter de org.springframework.web.filter.AbstractRequestLoggingFilter et remplacer les méthodes pour les adapter à vos besoins.

Il utilise le org.springframework.web.util.ContentCachingRequestWrapper qui vous permet de lire le contenu de la requête plusieurs fois.