Java Jersey 获取完整URL

11

我需要使用Jersey创建一个代理API服务。 在Jersey方法中,我需要获得完整的请求URL。 我不想指定所有可能的参数。

例如:

@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/media.json")
public  String getMedia( ){
    // here I want to get the full request URL like /media.json?param1=value1&param2=value2
}

我该怎么做?


你的意思是要在这里创建一个URL吗?你想从哪里获取param1和param2的值? - Shamse Alam
我建议使用UriInfo,这是Jersey的方式,并且使您的解决方案不依赖其他API。请参见Buddhika Alwis下面的答案。 - Jochen
4个回答

18

在 Jersey 2.x 中(请注意它使用 HttpServletRequest 对象):

@GET
@Path("/test")
public Response test(@Context HttpServletRequest request) {
    String url = request.getRequestURL().toString();
    String query = request.getQueryString();
    String reqString = url + "?" + query;
    return Response.status(Status.OK).entity(reqString).build();
}

1
这很棒,正是我需要的。我会点赞的,但它应该写成:String reqString = url + "?" + query; - javabrew

7

您可以按照以下方式尝试使用UriInfo:

    @POST
    @Consumes({ MediaType.APPLICATION_JSON})
    @Produces({ MediaType.APPLICATION_JSON})
    @Path("add")
    public Response addSuggestionAndFeedback(@Context UriInfo uriInfo, Student student) {

            System.out.println(uriInfo.getAbsolutePath());

      .........
    }

输出结果:- https://localhost:9091/api/suggestionandfeedback/add

您也可以尝试以下选项

enter image description here


如果需要一点改进:如果您想要查询参数,可以使用 uriInfo().getRequestUri().toASCIIString() - ulk200

4
如果您需要一个智能代理,您可以获取参数,对其进行筛选并创建新的URL。
@GET
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Path("/media.json")
public  String getMedia(@Context HttpServletRequest hsr){
    Enumeration parameters = hsr.getParameterNames();
    while (parameters.hasMoreElements()) {
        String key = (String) parameters.nextElement();
        String value = hsr.getParameter(key);
    //Here you can add values to a new string: key + "=" + value + "&"; 
    }

}

更新了代码。当然应该使用“key”。看起来我没有清理好从我的项目中取出的代码。 - Azee

0

你可以使用Jersey过滤器。

public class HTTPFilter implements ContainerRequestFilter {

private static final Logger logger = LoggerFactory.getLogger(HTTPFilter.class);

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {

        logger.info(containerRequestContext.getUriInfo().getPath() + " endpoint called...");
        //logger.info(containerRequestContext.getUriInfo().getAbsolutePath() + " endpoint called...");

    }
}

接下来您必须在HTTP配置文件中注册它,或者只需扩展ResourceConfig类。这是您如何在HTTP配置类中注册它的方法。

public class HTTPServer {

    public static final Logger logger = LoggerFactory.getLogger(HTTPServer.class);

    public static void init() {

        URI baseUri = UriBuilder.fromUri("http://localhost/").port(9191).build();
        ResourceConfig config = new ResourceConfig(Endpoints.class, HTTPFilter.class);
        HttpServer server = JdkHttpServerFactory.createHttpServer(baseUri, config);

        logger.info("HTTP Server started");

    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接