服務計算:模仿 Github,設計一個博客網站的 API

1. 博客網站應該具有的基本能力

  • 個人介紹 對於個人博客來說,它首先要支持展示博主的個人介紹。這個個人介紹裏面可能包括了暱稱、聯繫方式、相關經歷等基本內容,能夠讓讀者能夠對這個博客的主人有一個基本的認識。
  • 文章的撰寫與展示 對一個博客來說,最重要的就是它的內容,也就是裏面的文章。一個好用的博客平臺應該具備易於讓博主撰寫文章的能力,讓夠讓博主毫無負擔地撰寫、編輯自己的文章。此外,還必須能夠有層次,條理的展示文章的信息,比如展示標題、節選、封面,創建 /修改時間,評論點贊數等等。
  • 歸檔能力 一篇文章的撰寫時間、內容標籤 /分類等都是不同的,如何按照不同的要求對這些文章進行歸檔整理,也是考驗博客平臺的能力之一。而當文章數量較多的時候,添加一個搜索的功能也能大大方便讀者對某博主博客的瀏覽。
  • 博主與讀者互動的能力 僅僅只有博主一個人自嗨可能難以激發寫作的動力,如果博客能夠提供博主與讀者互動的能力,將能有效激勵博主持續創作,更能提升文章的傳播度——點贊和評論功能則是互動能力中最重要的功能之一。

2. RESTful風格

  1. RESTFUL是一種網絡應用程序的設計風格和開發方式,基於HTTP,可以使用XML格式定義或JSON格式定義。RESTFUL適用於移動互聯網廠商作爲業務使能接口的場景,實現第三方OTT調用移動網絡資源的功能,動作類型爲新增、變更、刪除所調用資源。
  2. 特點:
    a. 每一個URI代表1種資源;
    b. 客戶端使用GET、POST、PUT、DELETE4個表示操作方式的動詞對服務端資源進行操作:GET用來獲取資源,POST用來新建資源(也可以用於更新資源),PUT用來更新資源,DELETE用來刪除資源;
    c. 通過操作資源的表現形式來操作資源;
    d. 資源的表現形式是XML或者HTML;
    e. 客戶端與服務端之間的交互在請求之間是無狀態的,從客戶端到服務端的每個請求都必須包含理解請求所必需的信息。

3. 基本規則

1)通信協議:API與用戶的通信協議,總是使用HTTPs協議。
2)數據格式:統一採用JSON。
3)URI格式統一:同一作者發佈另一篇博文,則僅僅改變URI後面的部分,URI的前面部分不應改變。
4)狀態碼:統一根據HTTP協議:

  • 200 OK - [GET]:服務器成功返回用戶請求的數據,該操作是冪等的(Idempotent)。
  • 201 CREATED - [POST/PUT/PATCH]:用戶新建或修改數據成功。
  • 202 Accepted - [*]:表示一個請求已經進入後臺排隊(異步任務)
  • 204 NO CONTENT - [DELETE]:用戶刪除數據成功。
  • 400 INVALID REQUEST - [POST/PUT/PATCH]:用戶發出的請求有錯誤,服務器沒有進行新建或修改數據的操作,該操作是冪等的。
  • 401 Unauthorized - [*]:表示用戶沒有權限(令牌、用戶名、密碼錯誤)。
  • 403 Forbidden - [*] 表示用戶得到授權(與401錯誤相對),但是訪問是被禁止的。
  • 404 NOT FOUND - [*]:用戶發出的請求針對的是不存在的記錄,服務器沒有進行操作,該操作是冪等的。
  • 406 Not Acceptable - [GET]:用戶請求的格式不可得(比如用戶請求JSON格式,但是隻有XML格式)。
  • 410 Gone -[GET]:用戶請求的資源被永久刪除,且不會再得到的。
  • 422 Unprocesable entity - [POST/PUT/PATCH] 當創建一個對象時,發生一個驗證錯誤。
  • 500 INTERNAL SERVER ERROR - [*]:服務器發生錯誤,用戶將無法判斷髮出的請求是否成功。

4. 設計博客網站的REST API

4.1 查看當前版本

默認情況下,所有https://api.weblog.com接收當前版本(V1)的REST API的請求。

Accept:application/vnd.weblog.v1+json

注:所有的時間戳都以ISO 8601格式返回:

YYYY-MM-DDTHH:MM:SSZ

4.2 用戶登錄

curl -u username -p password https://weblog.com/v1

登錄成功:返回狀態碼爲:2xx
登錄失敗:返回狀態碼爲:4xx

注:以下API均在登錄的情況下使用。

4.3 查看用戶信息

GET /username

curl -u https://weblog.com/v1/huangshim23

響應:

{
	Status:200 OK
	----------------
	"username":huangshim23.
	"age":20,
	"gender": man,
	"fans":null,
	"coin":0,
	"interestring field":Computing Service,3D,
	"created_at":2017-10-01T14:20:35+08:00
}

4.4 修改用戶信息

PUT /user

data //修改用戶的參數
{
	"age": 21,
	...
}
    
curl -u -d {"age": 21, ...} https://weblog.com/v1/huangshim23

響應:

{
	Status:200 OK
	----------------
	"username":huangshim23.
	"age":21,
	"gender": man,
	"fans":null,
	"coin":0,
	"interestring field":Computing Service,3D,
	"created_at":2017-10-01T14:20:35+08:00
}

4.5 查看文章

1)查看用戶發表的所有文章

GET /username/articles

curl -a https://weblog.com/v1/huangshim23/articles

響應:

{
  "username":"huangshim23"
  "total_num":20,
  "articles":[
    {
      "title":"title1",
      "id": 1,
      "href":"https://weblog.com/v1/huangshim23/articles/1",
      "action":"GET",
      "status":"original"
      "created_time": "2010-11-11T17:31:50Z",
      "updated_time": "2014-11-11T17:58:47Z",
      "words": 3000,
      "visits": 1000
    },
    {
      "title":"title2",
      "id": 1,
      "href":"https://weblog.com/v1/huangshim23/articles/2",
      "action":"GET",
      "status":"reproduced"
      "created_time": "2016-11-21T17:31:50Z",
      "updated_time": "2018-08-11T17:58:47Z",
      "words": 5000,
      "visits": 10
    },
    ...
   ]
}

2)查看特定的文章

GET /username/articles/{id}
GET /username/articles/{title}

curl -u https://weblog.com/v1/huangshim23/articles/1
curl -u https://weblog.com/v1/huangshim23/articles/hello-world

響應:

{
  "username": huangshim23,
  "title":"hello-world",
  "id": 1,
  "href":"https://weblog.com/v1/huangshim23/articles/1",
  "action":"GET",
  "status":"original"
  "created_time": "2016-11-21T17:31:50Z",
  "updated_time": "2018-08-11T17:58:47Z",
  "words": 3000,
  "visits": 1000
}

4.6 發佈文章

POST /user/articles

data //發佈文章的數據參數
{
	"title":
	"content":
	"description":
	"visibility":
	"status":
}
curl -u -p -d '{"title":"xxx","content":"xxx","description":"xxxx","visibility":true, "status": "orginal"}' https://weblog.com/v1/huangshim23/articles

響應:

Status:200 OK
--------------------------
	"isPublished":true ,
	"article":{
      "id": 3,
      "title": "articleTitle",
      "owner": {
        "name": "haungshim23",
        "id": 123,
        "url": "https://weblog.com/v1/huangshim23",
        "type": "User"
      },
      "article_url": "https://weblog.com/v1/huangshim23/articles/3",
      "private": false,
      "description": "...",
      "reading number": 1,
      "created_at": "2016-11-11T17:31:50Z",
      "updated_at": "2016-11-11T17:31:50Z",
      "words": 1502,
      "language": "Chinese",
      "content":"article contents...."
    }
}

4.7 刪除文章

DELETE /user/articles/id

curl -d -i https://weblog.com/v1/huangshim23/articles/1

響應:

Status:200 OK
--------------------------
{
"successed": "true",
"article_id": "1",
"created_at":"2019-09-01T11:30:50Z",
"deleted_at": "2019-11-20T10:30:50Z"
}

4.8 查看文章評論

GET /user/articles/id/comments

curl -u https://weblog.com/v1/huangshim23/articles/1/comments

響應:

{
Status:200 OK
--------------------------
"comments":[
    {
      "userName":"user1",
      "comment": "...",
      "comment_time":"2019-11-11T10:30:50Z",
      "stars": 100
    },
    {
      "userName":"user2",
      "comment": "...",
      "comment_time":"2019-11-21T12:30:20Z",
      "stars": 1
    },
    ...
   ]
}

4.9 發佈文章評論

POST /user/articles/id/comments

curl  -c '評論內容' https://weblog.com/v1/huangshim23/articles/1/comments

響應:

{
"comment_status": "succeeded",
"comment": "評論內容",
"userName": "huangshim23",
"comment_time": "2019-11-21T12:30:20Z"
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章