2 votes

Existe-t-il un moyen de changer la méthode de demande http dans le filtre de routage netflix zuul ?

J'essaie de transformer l'appel de la méthode http GET d'un ancien serveur api construit avec le modèle MVC1 en un nouveau serveur api reposant sans aucun changement du code source frontal en utilisant netflix zuul et eureka.

J'ai ajouté le pré-filtre zuul transformant l'url legacy en url convention restful fonctionnant après le PreDecorationFilter et cela fonctionne bien.

Mais maintenant, je suis confronté au problème de convertir la méthode GET en méthode appropriée comme POST, PUT, DELETE en distinguant l'url afin que les requêtes soient correctement mappées dans le contrôleur Spring via @GetMapping/@PostMapping/@PutMapping/@DeleteMapping.

J'ai examiné SimpleRoutingFilter qui gère HttpClient mais En raison d'une contrainte environnementale, je dois utiliser l'identifiant de service eureka pour acheminer les données vers le nouveau serveur api et cela signifie que je dois utiliser RibbonRoutingFilter, ce qui est assez compliqué pour trouver le bon endroit où effectuer cette opération.

Est-il possible de changer la méthode http ou de faire une nouvelle requête http avant le RibbonRoutingFilter ? Si c'est possible, pouvez-vous nous indiquer le bon endroit pour le faire ou une référence ?

Merci beaucoup !

\======================================================================

Milenko Jevremovic,

Pourriez-vous me donner plus de détails sur l'utilisation de Feign ?

J'ai défini @FeignClient comme suit

@PostMapping(value = "{url"}, consumes = "application/json")
ResponseEntity<?> postMethod(@PathVariable("url") String url);

et pour obtenir les paramètres de la requête dans le corps de la demande pour le pré-filtre POST In zuul,

après avoir transformé la logique de la demande d'url GET en nouvelle url reposante POST ...

byte[] bytes = objectMapper.writeValueAsBytes(ctx.get("requestQueryParams"));
ctx.setRequests(new HttpServletRequestWrapper(request) {
  @Override ..getMethod
  @Override ..getContentLength
  @Override ..getConentLengthLong
  @Override
  public ServletInputStream getInputStream() {
    return new ServletInputStreamWrapper(bytes);
  }
}
ResponseEntity<?> response feignClient.post(transformedNewApiUri);

et définir le code RequestContext que vous avez suggéré ....

et le contrôleur du nouveau serveur api est comme,

@PostMapping
ResponseEntity<model> post(@RequestBody req..)

Il arrive bien au contrôleur mais quand je vois la requête http dans la méthode post du contrôleur, Il n'y a pas de corps de requête pour les paramètres.

(HttpServleterRequest getInputStream montre vide)

Les données de requête définies dans le pré-filtre zuul par HttpServletRequestWrapper ne sont pas pas utilisées dans Feign peut-être... ? Pourriez-vous me donner plus d'idée sur la définition du corps de la requête lors du passage de la requête GET en constructeur POST pour utiliser Feign ?

0voto

Milenko Jevremovic Points 795

Après avoir fait quelques recherches, je n'ai pas trouvé de solution intégrée.

Mais ce qui me vient à l'esprit, tu peux l'utiliser Feindre dans votre Pre obtenir la réponse, définir la réponse et la renvoyer immédiatement au client à partir de l'interface de l'entreprise. Pre filtre.

Vous pouvez définir Feign l'url du client ou l'identifiant du service, comme cela est expliqué dans la documentation, il utilise également le ruban.

Changez la réponse dans votre run méthode comme :

...
RequestContext ctx = RequestContext.getCurrentContext();
ctx.setResponseStatusCode(your_code);
ctx.setResponseBody(new_body);
ctx.setSendZuulResponse(false);

return null

0voto

Alexei Klenin Points 1

Il n'est pas possible de changer la méthode de HttpServletRequest mais il est possible de remplacer la demande par une demande dans RequestContext . HttpServletRequestWrapper semble être très utile :

static class PostHttpServletRequest extends HttpServletRequestWrapper {
    public PostHttpServletRequest(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getMethod() {
        return "POST";
    }
}

Donc méthode run peut être réécrit comme suit :

@Override
public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();

    HttpServletRequest request = ctx.getRequest();
    HttpServletRequest requestWrapper = new PostHttpServletRequest(request);
    ctx.setRequest(requestWrapper);

    return null;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X