Java jersey получить полный URL

Мне нужно прокси-сервис API с Джерси. Мне нужен полный 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
}

Как я могу это сделать?

Ответ 1

В 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();
}

Ответ 2

Если вам нужен интеллектуальный прокси-сервер, вы можете получить параметры, фильтровать их и создать новый 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 + "&"; 
    }

}

Ответ 3

попробуйте 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());

      .........
    }

OUT PUT: - https://localhost: 9091/api/offertionandfeedback/add

Вы также можете попробовать следующие варианты

enter image description here

Ответ 4

вы можете использовать фильтры Джерси.

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...");

    }
}

После этого u должен зарегистрировать его в файле конфигурации http или просто расширить класс ResourceConfig. Вот как можно зарегистрировать его в http config class

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");

    }

}