2012-07-12 26 views
3

假設DogManagementPro程序是一個用客戶端/服務器架構編寫的應用程序,購買它的客戶應該在自己的PC上運行服務器,並在本地或遠程訪問它。在REST API中返回絕對值和相對URI

假設我想支持DogManagementPro REST API中的「列出所有狗」操作。

所以GET來http://localhost/DogManagerPro/api/dogs現在應該獲取如下回應:

<dogs> 
    <dog>http://localhost/DogManagerPro/api/dogs/ralf</dog> 
    <dog>http://localhost/DogManagerPro/api/dogs/sparky</dog> 
</dogs> 

,我想遠程訪問本地局域網上,[我的機器的本地IP是192.168.0.33] 又該aa GET到http://192.168.0.33:1234/DogManagerPro/api/dogs取閱?

它應該是:

<dogs> 
    <dog>http://localhost/DogManagerPro/api/dogs/ralf</dog> 
    <dog>http://localhost/DogManagerPro/api/dogs/sparky</dog> 
</dogs> 

或者是:

<dogs> 
    <dog>http://192.168.0.33/DogManagerPro/api/dogs/ralf</dog> 
    <dog>http://192.168.0.33/DogManagerPro/api/dogs/sparky</dog> 
</dogs> 

有些人認爲我應該像這樣只返回路徑元素完全消退的問題:

<dogs> 
    <dog>/DogManagerPro/api/dogs/ralf</dog> 
    <dog>/DogManagerPro/api/dogs/sparky</dog> 
</dogs> 

什麼是最好的方法是什麼?

+0

還有使用域的選項。然後您將擁有'http:// dogmanagerpro/api/dogs/sparky'其中'dogmanagerpro'將被設置爲指向服務器正在偵聽的特定machine:port。此選項對於更改物理地址而言是最靈活的,但它要求客戶運行可將DogManagerPro映射到絕對地址的自己的域服務器(DNS服務器)。 – 2012-07-13 06:36:18

回答

3

我個人總是使用非絕對網址。它還解決了一些其他問題,例如反向/高速緩存代理。

這對客戶來說有點複雜,如果他們想按原樣存儲文檔,這可能意味着他們現在需要存儲基本URL或擴展內部URL。

如果你確實選擇完整URL路由,我不會推薦使用HTTP_HOST,而是設置多個虛擬主機和環境變量並使用它。 如果您稍後需要在原始服務器前使用代理,則可以解決此問題。

+0

相對URL似乎從服務器端最容易,許多人建議 – 2012-07-15 14:19:21

+0

@Aviad你應該說「許多服務器端的人推薦」。 :)但這只是故事的一面。你也需要考慮客戶端。看到[這個答案](http://stackoverflow.com/questions/2239405/hateoas-absolute-or-relative-urls/2240380#2240380)和[這也是我的理解](http://stackoverflow.com/questions/2239405/hateoas-absolute-or-relative-urls/18505331#18505331) – RayLuo 2013-08-29 08:05:48

+0

@iceberg我的意思是相對URI和絕對路徑 – 2013-08-29 20:20:07

0

我要說的絕對URL創建的基礎上,Host頭的客戶端發送

<dogs> 
    <dog>http://192.168.0.33:1234/DogManagerPro/api/dogs/ralf</dog> 
    <dog>http://192.168.0.33:1234/DogManagerPro/api/dogs/sparky</dog> 
</dogs> 

返回的URI應該是客戶端能夠解決。