0

在 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永远不会收到请求。如何将请求转发ServiceAServiceB

4

1 回答 1

1

客户端不能直接发送和HttpRequest。他将根据客户端的参数构建一个。

我试图在客户端的正文中发送重定向请求,但出现堆栈溢出错误:杰克逊无法将其转换为字符串。

不幸的是,您无法更改请求中的 URI 以将其发回,没有 HttpRequest 实现在 URI 上具有设置器。

如果您真的想发送完整的请求(标​​头、正文、参数...),您可以尝试配置代理。

否则,如果您不必传递完整的请求,您可以通过客户端传递您需要的内容:

客户端示例:

@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 方法)、请求参数等来做。

于 2020-05-26T09:26:35.103 回答