java-Jersey Web服务代理

我正在尝试实现一个Web服务,该Web服务替代我想对API的外部用户隐藏的另一个服务.基本上,我想扮演中间人,以便能够向solr隐藏的api添加功能.

我必须执行以下代码:

@POST
@Path("/update/{collection}")
public Response update(@PathParam("collection") String collection,
        @Context Request request) {
      //extract URL params
      //update URL to target internal web service
      //put body from incoming request to outgoing request
      //send request and relay response back to original requestor
}

我知道我需要重写URL以指向内部可用的服务,并添加来自URL或正文的参数.

这是我很困惑的地方,我如何才能访问原始请求正文并将其传递给内部Web服务,而不必取消编组内容?请求对象似乎没有给我执行这些操作的方法.

我正在寻找应该使用对我有帮助的潜在方法的对象.如果有人知道我还没有真正找到针对类似或便携式行为的东西,我也希望获得一些文档.

解决方法:

根据JSR-311规范的第4.2.4节,所有JAX-RS实现都必须以byte [],String或InputStream的形式提供对请求正文的访问.

您可以使用UriInfo获取有关查询参数的信息.它看起来像这样:

@POST
@Path("/update/{collection}")
public Response update(@PathParam("collection") String collection, @Context UriInfo info, InputStream inputStream) 
{
     String fullPath = info.getAbsolutePath().toASCIIString();
     System.out.println("full request path: " + fullPath);

     // query params are also available from a map.  query params can be repeated,
     // so the Map values are actually Lists.  getFirst is a convenience method
     // to get the value of the first occurrence of a given query param
     String foo = info.getQueryParameters().getFirst("bar");

     // do the rewrite...
     String newURL = SomeOtherClass.rewrite(fullPath);

     // the InputStream will have the body of the request.  use your favorite
     // HTTP client to make the request to Solr.
     String solrResponse = SomeHttpLibrary.post(newURL, inputStream);

     // send the response back to the client
     return Response.ok(solrResponse).build();

另一个想法.看起来您只是在重写请求并传递给Solr.您还有其他几种方法可以执行此操作.

如果您恰好在Java应用程序服务器或Servlet容器的前面有一个Web服务器,则可能无需编写任何Java代码即可完成您的任务.除非重写条件极其复杂,否则我个人的喜好是尝试使用Apache mod_proxy和mod_rewrite进行此操作.

还有一些Java库可用,它们会在URL到达应用服务器后但在到达您的代码之前重写URL.例如,https://code.google.com/p/urlrewritefilter/.使用类似的方法,您只需要编写一个调用Solr的非常简单的方法,因为在到达您的REST资源之前,URL将被重写.出于记录,我实际上并没有尝试过将特定库与Jersey一起使用.

上一篇:java-Solr:当使用多个单词查询字段时,默认的OR运算符返回不相关的结果


下一篇:ubuntu18.04深度学习环境安装