順便說一句,對于那些想知道您的體系結構確實是RESTful還是REST試圖緩解的高度耦合的RPC風格的人,也許我很感興趣。 關于REST撰寫論文的Roy Fielding積極主張資源表示中的超鏈接對于REST風格必不可少的觀點,甚至進一步闡明了實現REST的不確定性。
該示例的源代碼可以在我的github存儲庫中找到
Fuse中介路由器是FuseSource的企業級硬化版Apache Camel,提供了舒適的DSL,用于描述集成,中介和路由。 它是免費的開放源代碼,并具有Apache許可證。 對于那些不熟悉Mediation Router / Camel的人,請看DZone企業集成區Apache Camel:Integration Nirvana的 Jon Anstey( Camel in Action的合著者)的介紹。
我們將使用中介路由器來幫助在REST端點和文件系統上的資源文件之間編寫簡單的集成。 我將使用camel-cxfrs組件公開REST端點,并將使用camel-file組件讀取文件系統上的目錄。 該樣本的目的是描述必要的配置,以通過中介路由器公開REST接口,以某種方式與后端集成,將數據轉換為適當的REST響應并發送回該響應。
首先,讓我們專注于如何設置REST端點。 為此,您將創建一個JAX-RS資源,該資源描述將用作REST端點的java方法。 此樣本代碼要求熟悉RESTful Web服務 (又稱JAX-RS)的Java API 。 對于那些不熟悉的人,這里有一些不錯的教程,可以幫助您理解JAX-RS。
@Path("/customerservice/")
public class CustomerServiceResource {// NOTE: The instance member variables will not be available to the
// Camel Exchange. They must be used as method parameters for them to
// be made available
@Context
private UriInfo uriInfo;public CustomerServiceResource() {
}@GET
@Path("/customers/{id}/")
@Produces("text/xml")
public Customer getCustomer(@PathParam("id") String id) {return null;
}@PUT
@Path("/customers/")
public Response updateCustomer(Customer customer) {return null;
}}
如您所見,注釋是JAX-RS注釋,用于描述REST端點所涉及的操作,HTTP方法和mime類型。 注意,返回值全為空,因為此類實際上將不會用于處理進入端點的請求。 中介路由器路由將負責處理和響應。 但是請注意,實例成員不可用于中介路由器交換,即,通過JAX-RS @Context注釋注入的任何實例成員將不可用。 要使它們可用,請將它們作為參數添加到您的方法中。
可以使用以下兩種方法之一來聲明使用中介路由器的CXF-RS端點:直接在端點配置中,如下所示:
from("cxfrs://http://localhost:9090/route?resourceClasses=com.fusesource.samples.CustomerServiceResource")
直接在配置中創建它需要較少的xml配置,但靈活性有限。 另一個選擇是創建一個負責端點的單獨的bean,然后在端點配置中引用它:
from("cxfrs:bean:rsServer")
Bean rsServer應該在駱駝上下文中定義。 例如:
<cxf:rsServer id="rsServer" address="http://localhost:9090/route"serviceClass="com.fusesource.samples.CustomerServiceResource"/>
這種方法允許您解耦端點配置,并允許端點配置更快,更省力。 盡管使用了第一個選項,但兩個選項都顯示在示例代碼中。
這就是使用中介路由器公開REST端點所需的全部配置。 很簡單。 下一步是根據來自REST端點的內容來使用文件系統中的文件。 該文件的內容將返回給REST調用的客戶端。 為此,我們使用駱駝文件組件,并通過DSL中的pollEnrich調用豐富Exchange:
.setHeader(Exchange.FILE_NAME, simple("test-${body}.xml"))
.pollEnrich("file:src/data?noop=true", 1000, new CustomerEnricher())
我們不能在pollEnrich調用中使用任何動態表達式,因此我們在設置擴展之前設置文件組件可以理解的標頭。 在這種情況下,REST消息的主體是可用于對文件系統資源進行模板化的標識符。
最后,我們可以對路線進行一些附加處理:
.process(new CustomerServiceProcessor())
如上所述,該示例的目的是顯示如何配置終結點并將其附加到進一步的中介路由器處理中。 請注意,REST端點的消息交換模式(MEP)為InOut并期望響應。 該示例并不意味著是完整的端到端解決方案,因為該解決方案將根據預期的功能而有所不同。 請注意上面有關Roy關于什么是REST和不是REST 的討論的鏈接。
如果我遺漏了一些內容,或者您??需要對示例進行更多說明,請給我評論,我們可以進行討論。
參考:來自Christian Posta Software博客的JCG合作伙伴 Christian Posta 使用Apache Camel進行集成的REST端點 。
翻譯自: https://www.javacodegeeks.com/2012/05/rest-endpoint-for-integration-using.html