我正在尝试实现一个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一起使用.