scala spray 概念性內容的總結

2021-09-06 22:19:20 字數 2518 閱讀 9699

spray 是基於 akka 的輕量級 scala 庫,可用於編寫 rest api 服務。了解 spray 的 dsl 後可以在很短的時間內寫出乙個 rest api 服務,它的部署並不需要 tomcat , apche 等容器,可以直接 run。對於每乙個 route, spray 都會 sprawn 乙個或多個 actor提供服務,actor 的數目是可以配置的,我們不需要關心多執行緒處理的問題。從 benchmark 來看, spray 的效能是很不錯。另外,spray 提供了一套測試套件,testkit,使用它可以在本地測試 api 的可用性,測試功能非常強大,我想它可以完全取代 soapui 之類的自動化測試工具

但是,學習使用spray的過程還是比較痛苦的,舉個例子

await.result(statement, 5.seconds)
寫下這行**後,ide 會抱怨 5.seconds 理解不了,但是它在哪,ide並不會提示。還有很多情況是,ide 不會抱怨,但是編譯過程會出錯,說找不到某個 implicit 變數。接觸spray三個月,最讓我頭疼的就是implicit變數的問題。關於常用的變數的標頭檔案位置,我想寫一篇日誌記錄一下

type route = requestcontext => unit

requestcontext 在 route 裡是區域性變數,它總是存在的,我們可以在 route 的任何位置呼叫 requestcontext 的方法。requestcontext 包含     request 和 response 兩層含義,既能獲得request傳過來的資料,也能完成.complete, .reject 等response語義。route的定義並沒有返回值,它的返回值為unit,這是因為route 採用的是 fire and forget (tell) 模式,它的好處首先是靈活,沒有限制返回值的型別,其次是這種設計是完全的非阻塞的,易於和actor結合

spray的 dsl 就是乙個個 directive 拼在一起的

def routes = }}

}}

path, get, respondwithmediatype, complete 都算是一條 directive。他們巢狀在一起形成乙個 route 的語義。一般來講,directive有四個功能,首先是複製 requestcontext 到下一層 directive,requestcontext 在傳輸的過程中是 immutable 的。其次,它可以獲取 requester 附帶的引數,比如 parameters, formdata, jsondata 等,還能完成 marshall, unmarshall 操作。定義路徑和某些邏輯來過濾一條請求,比如不符合任意乙個 path 的請求將會被 reject,邏輯可以是 header 必須拒絕快取,post data 只允許 json 格式等等。最後,他可以用返回結果到 requester,可以定義結果的型別和值,在上面的例子上就是 text/html 和 string(defaultapi)

requester的請求可能格式有錯誤,可能許可權不足,也可能資料報丟失,因此 spray 需要 」異常「處理。異常處理可以是顯式的自定義宣告,spray 也有預設的實現。對於那些不符合任何 path(或者符合 reject path), 傳輸資料出錯,沒有認證的請求,spray 會呼叫 reject handling 的實現,程式的執行過程中出現的問題會呼叫 exception handling定義的操作,比如對於除0異常的處理。 timeout 最簡單,它定義請求在多少時間沒有應答就會返回超時錯誤。

spray 通過 complete(code, message) 實現,瀏覽器會顯示 code, message。對那些比較普遍的錯誤,spray有自定義的code, message,而那些自定義的錯誤,我們要手寫 code message。

上面提到directive的四種功能,其中就包括從requestcontext中獲取parameter和formdata。除此之外,spray 還提供從 json 到 case class 的對映,這相當於乙個輕量級的 orm,讓我們的邏輯**寫的更加美觀。

object json4sprotocol extends json4ssupport
import models.json4sprotocol._
從 parameter 到 case class 也有對映,

caseclasscolor(keyword:string,sort_order:int,sort_key:string)valtestroute =path("test")}}

test-kit 能夠實現本地測試 route,配合 spec2 可以取代 soapui等自動化測試工具。

"main entrance (/) working" in 

}

step  "elasticsearch person dao" should  "create and then return a person" in new context  } step 

test-kit 支援更豐富的語法糖,比如 besome, besome(data)等等,相比於 scalatest,spec2 提供更多的語法糖支援。

CSS概念性筆記

選擇符 1 id選擇符 2 類選擇符 3 標籤選擇符 4 相鄰兄弟選擇符 h1 p 5 子元素選擇符 e1 e2 6 後代選擇符 包含選擇符 e1 e2 自我理解 後代和子元素選擇符區別 前者可以寫多個層數,後者只能是父 子。7 萬用字元 8 屬性選擇符 e1 attr e1 attr value ...

delphi概念性學習(二)

工程檔案結構與語法 乙個完整的delphi程式是由多個unit模組組成,這些模組被乙個單一的原始檔 工程檔案所聯絡。不同於傳統的pascal程式,delphi中的程式的主模組的源檔案格式為.dpr,其他模組的格式為.pas。乙個完整的程式 乙個.dpr檔案 0或者多個.pas檔案。乙個.dpr檔案的...

Socket 通訊的概念性過程

1.socket 通訊tcp方式一般流程圖 服務端 客戶端 socket socket setsockopt bind connect listen recv send write accept recv send read setsockopt的可用level為sol socket option為...