Есть ли способ изменить метод HTTP-запроса в фильтре маршрутизации netflix zuul? - PullRequest
2 голосов
/ 26 апреля 2019

Я пытаюсь преобразовать вызов метода http GET с устаревшего API-сервера, построенного по шаблону MVC1, на новый сервер API с сохранением состояния без изменения внешнего исходного кода с помощью netflix zuul и eureka.

Я добавил zuul pre filter, преобразующий устаревший url в url restful Convention, работающий после PreDecorationFilter, и он работает нормально.

Но теперь я сталкиваюсь с проблемой преобразования метода GET в правильный метод, такой как POST, PUTУДАЛИТЬ, различая URL так, чтобы запросы правильно отображались в контроллере пружины через @ GetMapping / @ PostMapping / @ PutMapping / @ DeleteMapping.

Я посмотрел на SimpleRoutingFilter, который обрабатывает HttpClient, но из-за ограничений среды мне приходитсяиспользуйте eureka service id для маршрутизации на новый сервер API, и это означает, что я должен использовать RibbonRoutingFilter, что довольно сложно, чтобы найти правильное место для этой операции.

Итак, возможно ли изменить метод http или сделатьновый запрос http перед RibbonRoutingFilter?Если возможно, не могли бы вы подсказать, где находится правильное место для этого или какая-нибудь ссылка?

Большое спасибо!

======================================================================

Миленко Евремович,

Не могли бы вы рассказать подробнее об использовании Feign?

Я защищаю @FeignClient, как показано ниже

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

и получить параметры запроса для запроса тела для POST В предварительном фильтре zuul,

после логики преобразования из URL-адреса запроса GET в новый URL-адрес восстановления 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);

и установите код RequestContext, которыйВы предложили ....

и контроллер нового сервера API, как,

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

Это нормально для контроллера, но когда я вижу запрос http в методе post контроллера, естьнет тела запроса параметров.

(HttpServleterRequest getInputStream показывает пустой)

Набор данных запроса в предварительном фильтре zuul от HttpServletRequestWrapper не используется в Feign, может быть ...?Не могли бы вы дать мне больше идей по настройке тела запроса при изменении запроса GET на конструктор POST для использования Feign?

1 Ответ

0 голосов
/ 26 апреля 2019

После проведенных исследований не нашел ни одного встроенного решения.

Но что мне приходит в голову, вы можете использовать Feign клиента в вашем Pre фильтре, получить ответ, установить ответ и немедленно вернуть его клиенту из вашего фильтра Pre.

Вы можете установить Feign URL-адрес клиента или идентификатор вашей службы, как описано в документации, также используется лента.

Изменение ответа в вашем run методе, например:

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

return null
...