您現在的位置:首頁 > 新聞頻道 > 數碼電子 > 正文
用Scala實現簡單的Web和API服務器

時間:2019-10-09 02:04:58    來源:本站    瀏覽次數:    新聞首頁    我來說兩句()

  Web和API服務器在互聯網中的重要性,在計算機網絡方面提供了最基本的界面。本文主要介紹了怎樣利用Scala實現實時聊天網站和API服務器,通過本篇文章,你定將受益匪淺。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  Web和API服務器是互聯網系統的骨干,它們為計算機通過網絡交互提供了基本的界面,特別是在不同公司和組織之間。這篇指南將向你介紹如何利用Scala簡單的HTTP服務器,來提供Web內容和API。本文還會介紹一個完整的例子,告訴你如何構建簡單的實時聊天網站,同時支持HTML網頁和JSON API端點。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  這篇文及章的目的是介紹怎樣用Scala實現簡單的HTTP服務器,從而提供網頁服務,以響應API請求。我們會建立一個簡單的聊天網站,可以讓用戶發表聊天信息,其他訪問網站的用戶都可以看見這些信息。為簡單起見,我們將忽略認證、性能、用戶掛歷、數據庫持久存儲等問題。但是,這篇文章應該足夠你開始用Scala構建網站和API服務器了,并為你學習并構建更多產品級項目打下基礎。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  該命令將在后臺運行Cask Web服務器,同時監視文件系統,如果文件發生了變化,則重啟服務器。然后我們可以使用瀏覽器瀏覽服務器,默認網址是localhost:8080:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  第一件事就是將純文本的Hello, World!轉換成HTML網頁。最簡單的方式就是利用Scalatags這個HTML生成庫。要在項目中使用Scalatags,只需將其作為依賴項加入到build.sc文件即可:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  我們應該可以看到./mill -w app.runBackground命令重新編譯了代碼并重啟了服務器。然后刷新網頁額,就會看到純文本已經被替換成HTML頁面了。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  為了讓頁面更好看一些,我們使用Bootstrap這個CSS框架。只需按照它的指南,使用link標簽引入bootstrap:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  在本節的末尾,我們修改一下Scalatags的HTML模板,加上硬編碼的聊天文本和假的輸入框,讓它看起來更像一個聊天應用程序。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  現在我們有了一個簡單的靜態網站,其利用Cask web框架和Scalatags HTML庫提供HTML網頁服務。現在的服務器代碼如下所示:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  為網站添加交互的第一次嘗試是使用HTML表單。首先我們要刪掉硬編碼的消息列表,轉而根據數據來輸出HTML網頁:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  這里我們簡單地使用了內存上的mssages存儲。關于如何將消息持久存儲到數據庫中,我將在以后的文章中介紹。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  接下來,我們需要讓頁面底部的兩個input支持交互。為實現這一點,我們需要將它們包裹在form元素中:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  這樣我們就有了一個可以交互的表單,外觀跟之前的差不多。但是,提交表單會導致Error 404: Not Found錯誤。這是因為我們還沒有將表單與服務器連接起來,來處理表單提交并獲取新的聊天信息。我們可以這樣做:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  @cast.postForm定義為根URL(即 / )添加了另一個處理函數,但該處理函數處理POST請求,而不處理GET請求。Cask文檔()中還有關于@cask.*注釋的其他例子,你可以利用它們來定義處理函數。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  現在,用戶能夠以任何名字提交任何評論。但是,并非所有的評論和名字都是有效的:最低限度,我們希望保證評論和名字字段非空,同時我們還需要限制最大長度。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  這樣就可以阻止用戶輸入非法的name和msg,但出現了另一個問題:用戶輸入了非法的名字或信息并提交,那么這些信息就會消失,而且不會為錯誤產生任何反饋。解決方法是,給hello頁面渲染一個可選的錯誤信息,用它來告訴用戶出現了什么問題:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  現在比較煩人的是,每次向聊天室中輸入消息時,都要重新輸入用戶名。此外,如果用戶名或信息非法,那消息就會被清除,只能重新輸入并提交。可以讓hello頁面處理函數來填充這些字段,這樣就可以解決:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  這里我們使用了可選的userName和msg查詢參數,如果它們存在,則將其作為HTML input標簽的value的默認值。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  接下來在postHello的處理函數中渲染頁面時,填充userName和msg,再發送給用戶:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  注意任何情況下我們都保留name,但只有錯誤的情況才保留msg。這樣做是正確的,因為我們只希望用戶在出錯時才進行編輯并重新提交。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  現在有了一個簡單的、基于表單的聊天網站,用戶可以發表消息,其他用戶加載頁面即可看到已發表的消息。下一步就是讓網站變成動態的,這樣用戶不需要刷新頁面就能發表消息了。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  要想只渲染需要更新的那部分頁面,我們可以重構下代碼,從hello頁面處理函數中提取出messageList輔助函數:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  接下來,我們可以修改postHello處理函數,從而僅渲染可能發生了變化的messageList,而不是渲染整個頁面:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  現在我們寫好了服務器端代碼,接下來我們編寫相關的客戶端代碼,從服務器接收JSON響應,并利用它來更新HTML界面jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  這樣就可以了。現在向網站添加聊天文本,文本就會立即出現在網頁上,之后加載頁面的其他人也能看見。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  注意盡管你輸入的消息你自己可以立即看到,但其他人只有刷新頁面,或者輸入自己的消息迫使messageList重新加載,才能看到你的消息。本文的最后一節將介紹怎樣讓所有人立即看到你的消息,而不需要手動刷新。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  推送更新的概念和簡單:每次提交新消息后,就將消息”推送到所有中的瀏覽器上,而不是等待瀏覽器刷新并“拉取”更新后的數據。實現這一目的有多種方法。本文我們使用Websockets。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  Websockets可以讓瀏覽器和服務器在正常的HTTP請求-響應流之外互相發送消息。連接一旦建立,任何一方都可以在任何時間發送消息,消息可以包含任意字符串或任意字節。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  該處理函數接收來自瀏覽器的msg,檢查其內容是否應該立即響應,還是應該利用openConnections注冊一個連接再稍后響應。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  最后,我們需要在瀏覽器的標簽中添加一點Java代碼,來打開Websocket連接,并處理消息的交換:jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  這里,我們首先打開一個連接,發送第一條0消息來啟動整個流程,然后每次收到更新后,就將json.txt渲染到messageList中,然后將json.index發送回服務器,來訂閱下一次更新。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  本文我們介紹了怎樣利用Scala實現實時聊天網站和API服務器。我們從靜態網站開始,添加基于表單的交互,再利用Ajax訪問JSON API實現動態頁面,最后利用websocket實現推送通知。我們使用了Cask web框架,Scalatags HTML庫,以及uJson序列化庫,代碼大約125行。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

  這里展示的聊天網站非常簡單。我們故意忽略了將消息保存到持久數據庫、認證、用戶賬號、多聊天室、使用量限制以及許多其他的功能。這里僅使用了內存上的messages列表和openConnections集合,從并發更新的角度來看,它們并非線程安全的。但無論如何,希望這篇文章能夠讓你體會到怎樣使用Scala實現簡單的網站和API服務器,進而用它構建更大、更宏偉的應用程序。jnp零點資訊網_新聞資訊門戶|新聞|中國新聞|國際新聞|中國新聞網

分享到: 更多
相關閱讀:
網友評論:
用戶:
 密碼:
 驗證碼: 
 匿名發表
如果你對新聞頻道有任何意見或建議,請到交流平臺反饋。
企業服務
推廣信息
點擊排行
1.5分彩