2014-01-08 38 views
4

我們正試圖爲外部終端提供一個乾淨的URI結構來從CQ5中提取json信息。是否可以將變量放置到吊繩servlet中的資源路徑中?

例如,如果你想獲取有關特定用戶的歷史信息(假設你有權限等),地理位置優越,我們想端點能夠做到以下幾點:

/斌/ API /用戶/abc123/phone/555-klondike-5/history.json

在URI中,我們將指定/bin/api/user/{username}/phone/{phoneNumber}/history.json,以便它非常容易利用調度程序來使緩存更改無效等,而不會使大量的緩存信息失效。

我們希望使用一個sling servlet來處理請求,但是,我不知道如何將變量放入路徑中。

如果JaxRS中的@PathParam添加到索引路徑變量中,但是我懷疑它不可用,那將會很棒。

我們想到的另一種方法是使用選擇器來識別我們何時訪問api,從而可以從路徑返回任何我們想要的東西,但它需要一個單獨的吊索servlet來處理所有的請求,所以我對這種方法並不滿意,因爲它將很多不相關的代碼粘合在一起。

任何幫助,這將不勝感激。


UPDATE:

如果我們使用OptingServlet,然後把一些邏輯裏面的接受功能,我們可以疊加上一系列吊索的servlet,並用正則表達式進行從路徑受理的決定。

然後在執行過程中,可以爲變量分析路徑本身。

回答

1

沒有直接的方法來創建這樣的動態路徑。你可以/bin/api/user.json下注冊的servlet,並提供路徑的其餘部分爲suffix

/bin/api/user.json/abc123/phone/555-klondike-5/history 
^    ^
|     | 
servlet path  suffix starts here 

,那麼你可以解析手動後綴:

@SlingServlet(paths = "/bin/api/user", extensions = "json") 
public class UserServlet extends SlingSafeMethodsServlet { 
    public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) { 
     String suffix = request.getRequestPathInfo().getSuffix(); 
     String[] split = StringUtils.split(suffix, '/'); 
     // parse split path and check if the path is valid 
     // if path is not valid, send 404: 
     // response.sendError(HttpURLConnection.HTTP_NOT_FOUND); 
    } 
} 
+0

嗨Tomek,謝謝你的迴應。不幸的是,由於我們正在處理遺留的應用程序,因此我們的要求相當堅定,我們正試圖避免重寫。 –

+0

@TomekRękawek我懷疑這是否是您在CQ5中建議作爲REST web服務的替代方案,假設某些外部應用程序工具想要通過REST訪問,並且我們提供了此servlet,並且該工具會嘗試爲此生成WADL RESTWebservice(我們的servlet)然後失敗。那麼您是否知道我們可以像精確寧靜的web服務那樣執行任何方式,以便爲該REST URL生成WADL甚至可以成功完成? – samir

0

的RESTful的方式來處理,這將是有存儲在您要使用的結構中的信息。即/ content/user/abc123/phone/555-klondike-5/history /將包含該路徑的所有歷史節點。

在那個用法。你可以通過簡單地調用

/content/user/abc123/phone/555-klondike-5/history.json 

獲得開箱即用JSON響應,或者如果你需要的東西在一個特定的JSON格式,你可以使用吊索資源分辨率使用自定義的JSON響應。

+0

不幸的是,這是不可能的,因爲我們正在處理遺留應用程序,這些應用程序將userid放在restful請求的開始處。我們無法將數據存儲在那種圖表中。 –

5

如果您提供的數據來自JCR存儲庫,那麼最好的辦法就是按照您希望的URL來構建它,這是推薦使用Sling的方式。

如果數據是外部可以創建掛載/ bin中/ API /用戶路徑並且獲取關於或基於該路徑的其餘部分的相應數據的自定義吊帶ResourceProvider。

吊衣測試套件的PlanetsResourceProvider就是一個簡單的例子,看看http://svn.apache.org/repos/asf/sling/trunk/launchpad/test-services/src/main/java/org/apache/sling/launchpad/testservices/resourceprovider/

的吊帶資源文檔在一般資源解決機制https://sling.apache.org/documentation/the-sling-engine/resources.html文件。

+0

感謝您的回覆。這是一個非常酷的方法。 –

0

期待分享這個!我已經工作〜一個星期解決這個問題,終於有最好的答案。

第一:儘量使用澤西

通過kallada提出的OSGi的JAX-RS-連接器是最好的,但我無法得到它吊帶8.工作,我失去了一整天的努力,所有的我必須表現出它是幽靈類沒有發現錯誤和依賴性問題。

解決方案:ResourceProvider

Bertrand的鏈接是吊帶9只,這不會被釋放。所以這裏是你如何在8歲以上的Sling中做到這一點!

兩個文件:

  • ResourceProvider
  • 的Servlet

的ResourceProvider

這樣做的目的只是爲了在聽取/服務的所有請求,然後產生該虛擬路徑上的「資源」,實際上並不存在於JCR中。

@Component 
@Service(value=ResourceProvider.class) 
@Properties({ 
     @Property(name = ResourceProvider.ROOTS, value = "service/image"), 
     @Property(name = ResourceProvider.OWNS_ROOTS, value = "true") 
}) 
public class ImageResourceProvider implements ResourceProvider { 

@Override 
public Resource getResource(ResourceResolver resourceResolver, String path) { 

    AbstractResource abstractResource; 
    abstractResource = new AbstractResource() { 
     @Override 
     public String getResourceType() { 
      return TypeServlet.RESOURCE_TYPE; 
     } 

     @Override 
     public String getResourceSuperType() { 
      return null; 
     } 

     @Override 
     public String getPath() { 
      return path; 
     } 

     @Override 
     public ResourceResolver getResourceResolver() { 
      return resourceResolver; 
     } 

     @Override 
     public ResourceMetadata getResourceMetadata() { 
      return new ResourceMetadata(); 
     } 
    }; 

    return abstractResource; 
} 

@Override 
public Resource getResource(ResourceResolver resourceResolver, HttpServletRequest httpServletRequest, String path) { 
    return getResource(resourceResolver , path); 
} 

@Override 
public Iterator<Resource> listChildren(Resource resource) { 
    return null; 
} 
} 

servlet的

現在,你只寫它處理任何從路而到來的資源的一個servlet - 但這是通過與由ResourceProvider產生的資源型處理任何資源完成聽着那條路。

@SlingServlet(
     resourceTypes = TypeServlet.RESOURCE_TYPE, 
     methods = {"GET" , "POST"}) 
public class TypeServlet extends SlingAllMethodsServlet { 


    static final String RESOURCE_TYPE = "mycompany/components/service/myservice"; 

    @Override 
    protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException { 

     final String [] pathParts = request.getResource().getPath().split("/"); 
     final String id = pathParts[pathParts.length-1]; 
     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 
     try { 
      out.print("<html><body>Hello, received this id: " + id + "</body></html>"); 
     } finally { 
      out.close(); 
     } 
    } 
} 

顯然你的servlet會做更聰明的事情,比如更智能地處理「path」字符串,可能會產生JSON。

相關問題