簡體   English   中英

澤西島網絡服務代理

[英]Jersey web service proxy

我正在嘗試實現一個Web服務,該服務代理我想要從API的外部用戶隱藏的另一個服務。 基本上我想扮演中間人有能力為隱藏的api添加功能,這是solr。

我必須遵循以下代碼:

@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到達app服務器之后但在它們到達你的代碼之前重寫URL。 例如, https://code.google.com/p/urlrewritefilter/ 有了類似的東西,你只需要編寫一個調用Solr的非常簡單的方法,因為URL會在它到達你的REST資源之前被重寫。 為了記錄,我實際上沒有嘗試使用澤西島的特定庫。

1 /對於網關taht的問題將隱藏數據庫或索引,我寧願使用配置了@Path({regex})的端點(而不是在端點中重建正則表達式分析器)。 直接在@path中使用這個正則表達式,這是一個很好的做法。

請看一下與此相近的另一篇文章: @Path和正則表達式(Jersey / REST)

例如,你可以像這樣的regexp:

@Path("/user/{name : [a-zA-Z][a-zA-Z_0-9]}")

2 /第二點為了處理來自一個端點的所有請求,您需要有一個動態參數。 我會使用一個MultivaluedMap,使您可以在不修改端點的情況下將params添加到請求中:

@POST
@Path("/search")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces({"application/json"})
public Response search( MultivaluedMap<String, String> params ) {
    // perform search operations
    return search( params);

}

3 /我的第三個建議是重復使用:讓經濟和經濟減少錯誤。 為了執行solr搜索,重寫一個rest api真是太可憐了。 你可以隱藏params和端點,但是可以很好地保持solr uri Rest params的格式化,以便直接在你的api中重用solr的所有搜索邏輯。 即使您將solr實例隱藏在REST GATEWAY SERVER后面,這也會使您在代碼中表現出色。

在這種情況下,您可以想象:1。在搜索網關端點接收查詢2.轉換查詢以添加您的參數,控件... 3.在solr上執行REST查詢(在您的網關后面)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM