2011-05-26 63 views
1

我想了解更多來自soap-rpc背景的restlets。有一件事,我似乎無法弄清楚如何去做(也許不可能),就是修改請求上的對象或發送帶有修改的複製版本。Restlet修改入站對象並返回它或返回新的副本?

我試圖做這樣的事情:

public interface AddressService { 
    @Get 
    Address addOnZipCode(Address address); 
} 

服務器將與執行和客戶端可以使用動態代理來完成它的工作進行部署了。

服務器啓動正常,但是當客戶端進行呼叫時,服務器上沒有顯示正在調用實現方法。此外,直到對服務器的調用返回,客戶端纔會出錯 - 返回的對象爲空?!?

是我在這裏試圖做的可能與restlets?如果是這樣,關於我可能會做錯什麼想法?

如有必要,我可以發佈更多的代碼。

在此先感謝。

編輯#1:

我甚至試圖簡化它不使用自定義對象:

@Post 
String execute(String message); 

我得到如下:

INFO: Starting the default HTTP client 
Exception in thread "main" Method Not Allowed (405) - Method Not Allowed 
    at org.restlet.resource.ClientResource$1.invoke(ClientResource.java:1615) 
    at $Proxy5.execute(Unknown Source) 

我開始認爲這是不可能的,因此,我很難看到這是一種可行的SOAP + RPC Web服務的替代方案。

編輯#2: 看起來這是可能根據書中的例子: 「Restlets在行動」

public interface AccountsResource {   
    @Get("txt") 
    public String represent();    

    @Post("txt") 
    public String add(String account);  
} 

編輯#3: 事實證明,簡單地擊中我的Eclipse控制檯中的「停止」按鈕並未關閉服務器實例。打開一個瀏覽器到服務器的URL顯示了一些可怕的結果 - 有多箇舊的服務器實例在運行。關閉他們後,我得到了它的工作。最終答案是使用@Post而不是@Get1

回答

1

看一看這樣的:

http://wiki.restlet.org/docs_2.0/13-restlet/21-restlet/318-restlet/303-restlet.html

在服務器端的實現必須像這樣:

class AddressServerResource extends ServerResource implements AddressService { 
    // implementation 
} 

在客戶端:

ClientResource cr = new ClientResource("http://your-api.com/address/123"); 
AddressService service = cr.wrap(AddressService.class); 
// use the service transparently 

編輯:

@Post 
Address addOnZipCode(Address address); 
+0

這就是我現在要做的。不幸的是,這些例子都沒有涉及並返回一個值。 – javamonkey79 2011-05-26 00:20:22

+0

啊,你不能在'Get'方法中傳遞一個值。這在文檔中沒有明確說明,但是我在使用Restlet幾周後才意識到。 – Finbarr 2011-05-26 00:21:25

+0

'Get' HTTP方法不允許請求主體。請求體是RESTlet使用內容協商將其轉換爲Java對象的內容。您只能在'PUT'和'POST'方法中傳遞參數。 – Finbarr 2011-05-26 00:22:32

相關問題