如何通过休息电话的 host-name/ip 获得完整请求 URL?

How do I get the full request URL with host-name/ip of a rest call?

我需要从 restful 向我的休息服务发出的请求中获取完整的 url 主机名或 IP 地址。有什么办法可以做到吗?

类似于InetAddress ip = ip.getHostName();在 java.

使用 Jersey,您可以执行以下操作

String clientHost = req.getRemoteHost(); // req is HttpServletRequest
String clientAddr = req.getRemoteAddr();

当你说 InetAddress ip = ip.getHostName();您将获得您的休息服务所在机器的主机名 运行,要获取发出请求的机器的名称,您需要使用类似于 request.getRemoteHost(); 的东西;该值可能取决于发出请求的机器的网络环境。

要完整url请参考下面post。 What's the best way to get the current URL in Spring MVC?

Using CDI and @Context,类似于Ashir Khan 的评论,requestContext或部分请求上下文可以在 运行 时间提供。许多类型可以由 @Context 注释绑定并由容器注入,尽管这样会更好:

  1. 尽可能降低注入数据的可见性即绑定到方法而不是class
  2. 尽可能减少注入的信息量,即 如果您想要的只是 baseUri 而不是完整的请求上下文,请绑定 UriInfo .

听起来很多,但就像(修改)Ashir 的代码一样简单:

@GET
@Path("/test") 
// Look Ma, no hands!
public Response test(@Context javax.ws.rs.core.UriInfo uriInfo) { 
  return Response.status(Status.OK).entity(uriInfo.getBaseUri()).build();
}

您可以使用 UriInfo class 并使用 @Context 注释绑定它,然后在每次请求时您都可以访问主机名、端口、请求路径等 URI 信息。

这是一个例子-

@POST
@Path("/test")
public Response uriTest(@Context UriInfo uriInfo){ //helps you get all URI related information.
    System.out.println(uriInfo.getBaseUri().getHost());
    System.out.println(uriInfo.getBaseUri().getPort());
    return Response.ok(null).build();
}

您可以阅读更多关于 URIInfo here