2013-02-03 16 views
1

我用RESTEasy使用Java和JBoss7。我創建了我的RESTful服務和一個客戶端來測試我的服務:客戶如何知道REST中對象的正確結構?

ClientRequest request = new ClientRequest(
     "http://localhost:8080/test/rest/cars"); 
request.accept(MediaType.APPLICATION_XML); 

String input = "<car><carId>10.99</carId><carName>Ford</carName></car>"; 

request.body(MediaType.APPLICATION_XML, input); 
ClientResponse<String> response = request.post(String.class); 
System.out.println("Output from Server .... \n"); 
System.out.println(response.getStatus()); 

這很好用!這裏唯一的問題是在客戶端。我必須發送硬編碼的XML,就像您在String input = "<car><carId>10.99</carId><carName>Ford</carName></car>";中看到的那樣,因爲客戶端沒有我擁有的對象。

客戶端將模仿從get方法收到的XML表示,這對於一個龐大而複雜的資源來說很難做到。

  • 有沒有一種方法可以讓客戶端知道他們想要發送的對象的正確結構還是他們必須發送類型化的XML?

  • 我可以給客戶端類似於WSDL或XSD的東西,還是會違背REST的約束?

  • 我見過人們會使用Xsteam和unmarshalling的解決方案,但他們假設客戶端具有資源的類表示形式。

回答

1

不要在客戶端代碼硬編碼XML消息。 XML是服務和客戶端之間傳遞的信息。

假設我們想到的情況是,您將相同的服務暴露於不同的位置,並且只能理解XML格式,而另一個只能理解JSON。如果您要使用硬編碼消息的客戶端,則只能調用與XML對話的服務。記住REST是關於資源的表示。

因爲客戶端沒有我擁有的對象。客戶端將模仿從get方法獲得的XML表示,這對於大型複雜資源來說很難做到。

有沒有一種方式讓客戶端知道他們想發送的對象的正確結構,還是他們必須發送類型化的XML?

請考慮您的客戶端是通常與對象一起工作的Java應用程序。這些對象代表資源(例如car),這就是您的客戶在內部使用的內容。

當需要調用服務時,您只需將這些對象編組爲XML。當服務響應時,您將XML解組爲對象。

基於AcceptContent-Type使用的標題,它只是選擇適當的編組/解組器的問題。然後,您甚至可以將某些內容作爲XML發送並以JSON形式接收回來。

當然,RESTeasy clients可以使用與服務端相同的註釋,甚至可以在服務和客戶端之間重用一些Java類型(類),但是這些Java類在寫入客戶端時變得毫無用處一些其他技術:C#,Python,C++等。

爲什麼客戶端應該關心服務使用的類型?它應該只關心表示。客戶可以在內部使用所需的任何類型(獨立於服務),並在與服務對話時與適當的表示進行通信。

我可以給客戶端類似於WSDL或xsd的東西嗎?或者這會違背REST的約束嗎?

這會變得有點棘手。

REST是建立分佈式系統的軟件架構風格。不幸的是,不同的人對這種「風格」有不同的理解,結果就是有大量所謂的RESTful API在那裏簡單地描述使用什麼方法,什麼URL以及什麼「類型」發送回去。

這是Roy T. Fielding自己強調的做REST的錯誤方式:REST APIs must be hypertext-driven

RESTful客戶端不需要事先知道要訪問的URL或用於通信的「類型」。瞭解交換中使用的媒體類型是它所需要的一切(我不是在談論application/xml,它只說了一些關於消息格式的內容,沒有語義或者關於內部內容的描述)。

因此,爲什麼服務應提供WSDL?實際上(雖然WSDL 2.0可以描述RESTful服務),但實際上我們正在談論的是WADL。但是REST社區並沒有真正意識到WADL,所以這也是is a matter of "style"

如果你正在做REST「按書」,那麼WADL不應該是必需的。如果你實際上只有一個基於HTTP的接口,我認爲你可以提供一個WADL來緩解其他程序員在開發客戶端時的生活。

我見過解決方案,人們會使用Xsteam和解組,但他們假設客戶端具有資源的類表示。

RESTeasy支持JAXB編組,因此應該盡一點努力工作。

相關問題