REST API
準備用一個簡單的列子來描述什么是Representation,什么是State,以及什么是Representation State Transfer。
例如我訂閱了一個人的博客,想要獲取他發表的所有文章(這里『他發表的所有文章』就是一個資源Resource)。于是我就向他的服務發出請求,說『我要獲取你發表的所有文章,最好是atom格式的』,這時候服務器向你返回了atom格式的文章列表第一頁(這里『atom格式的文章列表』就是表征Representation)。你看到了第一頁的頁尾,想要看第二頁,這時候有趣的事情就來了。如果服務器記錄了應用的狀態(stateful),那么你只要向服務詢問『我要看下一頁』,那么服務器自然就會返回第二頁。類似的,如果你當前在第二頁,想服務器請求『我要看下一頁』,那就會得到第三頁。但是REST的服務器恰恰是無狀態的(stateless),服務器并沒有保持你當前處于第幾頁,也就無法響應『下一頁』這種具有狀態性質的請求。因此客戶端需要去維護當前應用的狀態(application state),也就是『如何獲取下一頁資源』。當然,『下一頁資源』的業務邏輯必然是由服務端來提供。服務器在文章列表的atom表征中加入一個URI超鏈接(hyper link),指向下一頁文章列表對應的資源。客戶端就可以使用統一接口(Uniform Interface)的方式,從這個URI中獲取到他想要的下一頁文章列表資源。上面的『能夠進入下一頁』就是應用的狀態(State)。服務器把『能夠進入下一頁』這個狀態以atom表征形式傳輸(Transfer)給客戶端就是表征狀態傳輸(REpresentational State Transfer)這個概念。
舉個具體API的例子:
請求: GET /posts HTTP/1.1 Accept: application/atom+xml響應: HTTP/1.1 200 OK Content-Type: application/atom+xml<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"><title>Posts</title><link href="http://example.org/posts" rel="self" /><link href="http://example.org/posts?pn=2" rel="next" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-12-13T18:30:02Z</updated><entry><title>Post XXX</title><link href="http://example.org/post-xxx" /><id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id><updated>2003-12-13T18:30:02Z</updated><content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This is the post content.</p></div></content></entry><entry>...</entry> </feed> 注意上面atom格式中的多個<link>元素,它們分別定義了當前狀態下合法的狀態轉移。
作者:季文昊
鏈接:http://www.zhihu.com/question/28557115/answer/48120528
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
例如我訂閱了一個人的博客,想要獲取他發表的所有文章(這里『他發表的所有文章』就是一個資源Resource)。于是我就向他的服務發出請求,說『我要獲取你發表的所有文章,最好是atom格式的』,這時候服務器向你返回了atom格式的文章列表第一頁(這里『atom格式的文章列表』就是表征Representation)。你看到了第一頁的頁尾,想要看第二頁,這時候有趣的事情就來了。如果服務器記錄了應用的狀態(stateful),那么你只要向服務詢問『我要看下一頁』,那么服務器自然就會返回第二頁。類似的,如果你當前在第二頁,想服務器請求『我要看下一頁』,那就會得到第三頁。但是REST的服務器恰恰是無狀態的(stateless),服務器并沒有保持你當前處于第幾頁,也就無法響應『下一頁』這種具有狀態性質的請求。因此客戶端需要去維護當前應用的狀態(application state),也就是『如何獲取下一頁資源』。當然,『下一頁資源』的業務邏輯必然是由服務端來提供。服務器在文章列表的atom表征中加入一個URI超鏈接(hyper link),指向下一頁文章列表對應的資源。客戶端就可以使用統一接口(Uniform Interface)的方式,從這個URI中獲取到他想要的下一頁文章列表資源。上面的『能夠進入下一頁』就是應用的狀態(State)。服務器把『能夠進入下一頁』這個狀態以atom表征形式傳輸(Transfer)給客戶端就是表征狀態傳輸(REpresentational State Transfer)這個概念。
舉個具體API的例子:
請求: GET /posts HTTP/1.1 Accept: application/atom+xml響應: HTTP/1.1 200 OK Content-Type: application/atom+xml<?xml version="1.0" encoding="utf-8"?> <feed xmlns="http://www.w3.org/2005/Atom"><title>Posts</title><link href="http://example.org/posts" rel="self" /><link href="http://example.org/posts?pn=2" rel="next" /><id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id><updated>2003-12-13T18:30:02Z</updated><entry><title>Post XXX</title><link href="http://example.org/post-xxx" /><id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id><updated>2003-12-13T18:30:02Z</updated><content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This is the post content.</p></div></content></entry><entry>...</entry> </feed> 注意上面atom格式中的多個<link>元素,它們分別定義了當前狀態下合法的狀態轉移。
作者:季文昊
鏈接:http://www.zhihu.com/question/28557115/answer/48120528
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
轉載于:https://www.cnblogs.com/double12gzh/p/10166190.html
總結
- 上一篇: Shell脚本[运算表达式,条件控制语句
- 下一篇: 结对编程——四则运算