micronaut перенаправляет httprequest на другой сервис - PullRequest
0 голосов
/ 25 мая 2020

В micronaut есть декларативные клиенты:

@Client("http://localhost:5000")
public interface ServiceB {

    @Get("/ping")
    HttpResponse ping(HttpRequest httpRequest);
}

В моем классе controller я хочу перенаправить входящий запрос на ServiceB

@Controller("/api")
public class ServiceA {

    @Inject
    private ServiceB serviceB;

    @Get("/ping)
    HttpResponse pingOtherService(HttpRequest httpRequest){
        return serviceB.ping(httpRequest)
    }

}

Однако кажется, что ServiceB никогда не получит запрос из-за информации, закодированной в запросе. Как я могу переслать запрос с ServiceA на ServiceB?

1 Ответ

1 голос
/ 26 мая 2020

Клиент не может отправлять и HttpRequest напрямую. Он построит один из параметров клиента.

Я попытался отправить запрос на перенаправление в теле клиента, но получил ошибку переполнения стека: Джексон не может преобразовать его в строку.

Вы не можете изменить URI в запросе, чтобы отправить его обратно, к сожалению, ни одна реализация HttpRequest не имеет сеттера для URI.

Если вы действительно хотите отправить полный запрос (заголовок, тело, params ...) вы можете попробовать настроить прокси.

Иначе, если вам не нужно передавать полный запрос, вы можете передать через клиента то, что вам нужно:

Client пример:

@Client("http://localhost:8080/test")
public interface RedirectClient {

  @Get("/redirect")
  String redirect(@Header(value = "test") String header);

}

Контроллер:

@Slf4j
@Controller("/test")
public class RedirectController {

  @Inject
  private RedirectClient client;

  @Get
  public String redirect(HttpRequest request){
    log.info("headers : {}", request.getHeaders().findFirst("test"));
    return client.redirect(request.getHeaders().get("test"));
  }

  @Get("/redirect")
  public String hello(HttpRequest request){
    log.info("headers : {}", request.getHeaders().findFirst("test"));
    return "Hello from redirect";
  }
}

Я сделал это для одного заголовка, но вы можете сделать это с телом (если не методом GET), для параметров запроса, и т. д.

...