前言
在本篇胡岔,將設(shè)計(jì)與客戶端通信的協(xié)議格式.
正文
請(qǐng)求響應(yīng)的語(yǔ)義問(wèn)題
首先要明確,請(qǐng)求響應(yīng)的含義在單向通信與雙向通信是不同的
請(qǐng)求(Request)響應(yīng)(Response)有兩種不同的語(yǔ)義,下面用中文表示行為,英文表示數(shù)據(jù).
-
作為行為
請(qǐng)求是發(fā)送一些數(shù)據(jù),響應(yīng)是在接收到一些數(shù)據(jù)后,經(jīng)過(guò)一些處理,返回另外一些數(shù)據(jù)
-
作為數(shù)據(jù)
請(qǐng)求是作為一些數(shù)據(jù),響應(yīng)也是一些數(shù)據(jù)
HTTP是單向通信,只能由客戶端發(fā)起請(qǐng)求(Request),服務(wù)端接收請(qǐng)求(Request)并必須返回響應(yīng)(Response).服務(wù)端不能主動(dòng)發(fā)起請(qǐng)求(Response).在這種模式下,請(qǐng)求對(duì)應(yīng)Request仇让,響應(yīng)對(duì)應(yīng)Response 請(qǐng)求和響應(yīng)是一一對(duì)應(yīng)的
在TCP和WebSocket中,是雙向通信,如果套用請(qǐng)求響應(yīng),客戶端發(fā)起請(qǐng)求(Request),服務(wù)端接收請(qǐng)求(Request),可能返回響應(yīng)(Response),連接建立后,服務(wù)端也能發(fā)送請(qǐng)求(Response).客戶端接收請(qǐng)求(Response),可能返回響應(yīng)(Request) . 可以看出,在雙向通信中. 在客戶端,請(qǐng)求響應(yīng)都是Request,在服務(wù)端,請(qǐng)求響應(yīng)都是Response 請(qǐng)求不一定有響應(yīng)
設(shè)計(jì)協(xié)議格式
以proto格式來(lái)描述
/**
請(qǐng)求
*/
message Request {
int32 moduleId = 1; //模塊id
int32 commandId = 2; //命令id
bytes data = 3;
//TODO 待拓展
}
/**
響應(yīng)
*/
message Response {
int32 moduleId = 1; //模塊id
int32 commandId = 2; //命令id
bytes data = 3;
int32 errorCode = 4; //0表示正常 其他表示錯(cuò)誤碼
//TODO 待拓展
}
message Error{
string errorMsg=1;//錯(cuò)誤信息
//TODO 待拓展
}
moduleId和commandId
Request和Response都是協(xié)議包,需要有一個(gè)唯一標(biāo)識(shí),前后端才能正確映射處理.這里采用moduleId和commandId組合來(lái)唯一標(biāo)識(shí)一個(gè)協(xié)議包.相比只是用commandId,這樣有什么好處呢?
- 將同模塊業(yè)務(wù)代碼歸納在一起
考慮登錄業(yè)務(wù),一般會(huì)有 登錄,注冊(cè),退出這幾個(gè)接口, 我們可以這樣配置
moduleId=1;//登錄模塊
comamndId=1;//登錄
commandId=2;//注冊(cè)
commandId=3;//退出
后端寫(xiě)業(yè)務(wù)接口時(shí),可以根據(jù)moduleId將下屬的commandId對(duì)應(yīng)的處理邏輯都?xì)w納到一個(gè)service下面.
- 隔離命名
如果只是用commandId,并且不確定這個(gè)模塊會(huì)不會(huì)很復(fù)雜,你可能會(huì)預(yù)留100個(gè)id,比如100~200.但是有了moduleId,就起到隔離的作用,不用再考慮命令預(yù)留問(wèn)題
Response的errorCode
如果客戶端發(fā)送的請(qǐng)求數(shù)據(jù)不符合業(yè)務(wù)邏輯,那么服務(wù)端是有義務(wù)通過(guò)某種方式提醒客戶端的,這里我期望通過(guò)errorCode達(dá)成這個(gè)目標(biāo),期望是客戶端收到協(xié)議包后會(huì)檢查errorCode,如果errorCode為0,表示正常,data里就是約定的數(shù)據(jù),如果不為0,data里就Error,
后記
自定義協(xié)議這里,理清楚請(qǐng)求響應(yīng)花費(fèi)了很長(zhǎng)時(shí)間,真正制定協(xié)議并不困難.