SlideShare a Scribd company logo
1 of 75
12. 網路通訊方案
• 學習目標
– 探索XMLHttpRequest
– 封裝XMLHttpRequest
– 使用Fetch API
– 認識Server-Sent Events與
WebSocket
2
Ajax
• 〈Ajax: A New Approach to Web
Applications〉
• Asynchronous JavaScript + XML
3
XMLHttpRequest
• open(method, url, [asynch,
username, password])
• setRequestHeader(header, value)
• send(content)
• abort()
• getAllResponseHeaders()
• getResponseHeader(header)
4
readystatechange
• XMLHttpRequest.UNSENT
• XMLHttpRequest.OPENED
• XMLHttpRequest.HEADERS_RECEIVED
• XMLHttpRequest.LOADING
• XMLHttpRequest.DONE
5
• 多數情況下,只會對readyState為
XMLHttpRequest.DONE時進行處理
6
• responseText預設會使用UTF-8
• 如果回應是XML,伺服端必須指定回應標
頭Content-Type為text/xml
• responseXML
7
8
9
• 早期XMLHttpRequest並非標準介面
• 就歷史上來說,非同步物件的概念,始於
Microsoft為Exchange Server建立的
Outlook Web Access
• 後來被定義為IXMLHTTPRequest介面,
並在MSXML程式庫的第二版中實現
• 1995年的Internet Explorer 5.0搭載了該程
式庫,可透過ActiveXObject,指定
'XMLHTTP'建立實例來存取
10
• Mozilla後來在Gecko樣版引擎仿造了類似
的介面nsIXMLHttpRequest
• 而後Mozilla建立了XMLHttpRequest物件,
在2002年Gecko 1.0中獲得了完整實現
• 在Internet Explorer之外的其他主流瀏覽器
上,XMLHttpRequest成了產業標準
• Internet Explorer從2006年的7.0之後,也
開始支援XMLHttpRequest
11
• W3C在2006年開始著手進行
XMLHttpRequest的標準化
• 由於HTML5概念的成形,W3C考慮進化
XMLHttpRequest,在2008年發佈了曾經
被稱為XMLHttpRequest 2或
XMLHttpRequest Level 2的草案
12
• 在2011年時,XMLHttpRequest Level 2草
案被納入了原本的XMLHttpRequest規範
中,成為XMLHttpRequest Level 1
• 曾經的XMLHttpRequest Level 2草案就被
廢棄了
• 現行的XMLHttpRequest規範,可以在
〈XMLHttpRequest〉找到
13
14
使用GET請求
• 應用於安全(Safe)操作
– 就規範來說,GET與HEAD(與GET同為取得資
訊,不過僅取得回應標頭)對使用者來說是
「取得」資訊
• 應用於等冪(Idempotent)操作
– 在提供相同的請求資訊下,單一請求產生的結
果,與請求多次的結果必須是相同的
15
• 如果使用傳統表單發送GET請求,GET的請
求參數會出現在網址列
• 然而使用XMLHttpRequest時,GET的請
求參數並不會出現在網址列
16
17
• 在使用XMLHttpRequest、Fetch API等進
行網路請求時,伺服端採用哪種技術,基
本上與前端無關
• 重點將會擺在伺服端期待收到哪種請求,
瀏覽器又會收到什麼回應
18
19
20
編碼請求參數
• /、?、@、空白等字元,在URL中是保留字
元,RFC 3986規範了保留字元
• 若要在URL表達這些保留字或其他非的
ASCII的字元,必須使用%hexhex編碼形式,
又稱百分比編碼(Percent-Encoding)
– url=https://openhome.cc 
url=https%3A%2F%2Fopenhome.cc
21
• 可以使用encodeURIComponent()為字
元編碼
• 編碼後的結果是遵循RFC 3986的規範
• HTTP亦規範了GET與POST在發送請求參數
時的編碼
• 基本上與RFC 3986相同,不過空白字元是
編碼為+而不是RFC 3986規範的%20
22
• 若使用encodeURIComponent()編碼,
事後必須將%20取代為+
23
• JavaScript內部實作上,使用UTF-16碼元
作為字串的元素
• encodeURIComponent()的傳回值,是
將字串處理為UTF-8編碼後,再進行百分
比編碼
• encodeURIComponent()的結果若發送
給伺服端後,伺服端必須以UTF-8來處理
接收到的字串
24
25
26
使用POST請求
• 用於非等冪操作,若請求有副作用,多次
POST請求的結果可以不同
• 為非安全操作,常用來改變伺服端狀態,
運用的場景是新增資料庫的內容、上傳檔
案等
27
• 使用setRequestHeader()設定內容類型
• 因為POST發送的資料不一定是key=value
形式
• 著在呼叫send()時,將發送的資料作為引
數傳入,這是因為POST的資料會放在請求
本體
28
封裝XMLHttpRequest
29
30
31
32
上傳檔案
• 在XMLHttpRequest標準化之後可以結合
FormData進行檔案上傳
• 請求標頭Content-Type會自動設為
multipart/form-data
33
• 表單中有type為"file"的input標籤
34
35
• 如果想實作檔案上傳進度的顯示,是透過
XMLHttpRequestUpload的progress事
件
36
37
38
39
40
• 若要傳送XML
41
responseXML
42
43
• 在XMLHttpRequest標準化後,增加了
responseType特性
– 'arraybuffer'
– 'blob'
– 'document'
– 'json'
– 'text‘
• 透過response特性取得的對應型態,分別
會是ArrayBuffer、Blob、Document
(XML剖析後的結果)、JSON回應剖析後
的物件與字串。
44
45
46
47
48
封裝XMLHttpRequest操作
49
50
51
52
53
54
55
56
57
58
Fetch API
• fetch()函式只指定網址,預設會發出
GET請求
• 傳回值是Promise,任務達成的結果是個
Response物件
59
• 設定請求資訊
60
• 在method為'GET'或'HEAD'時不能指定
body
• fetch()支援跨站請求
• fetch()預設不接受或發送Cookie
61
Request物件
62
• Fetch API會取代XMLHttpRequest?
• XMLHttpRequest有豐富的事件類型、必
要時可以設為同步請求、可以中斷請求等
• 在不施加額外的技法或設計時,fetch()
就無法提供逾時、進度處理等功能
63
Server-Sent Events
• 模擬伺服端推送
– 輪詢(Polling)
– 長輪詢(Long polling)
• HTML5規範了Server-Sent Events
– 協定
– EventSource
• 除了Edge與Internet Explorer之外,現代
瀏覽器都支援EventSource介面
64
• 要包含Content-Type: text/event-
stream標頭
• 回應訊息內容時,必須是UTF-8編碼文字
• 格式為field: valuen
• 發送一個註解與三個訊息
65
• 預設會觸發的事件為message
• 若發生錯誤(像是連線上出了問題)會觸
發error事件
• 可以純綷發出data來觸發message事件
66
• 訊息中若包含id: number,伺服端要送
出回應標頭Last-Event-ID與對應值
number
• 若只發送id,表示清除Last-Event-ID
67
• 可以使用event來指定要觸發哪個事件
• 分別觸發add、remove事件:
• retry用來指定重新發出連線的時間
68
EventSource
• 實例建立後就會發出請求
• 支援跨域請求,然而跨域時預設不發送
Cookie
69
• readyState
• 事件
– open
– message
– error
70
71
簡介WebSocket
• WebSocket於2011年標準化,在連線建立
之後,客戶端與伺服端可以雙向互動
• 並非基於HTTP,是基於TCP的協定
• 協定昇級機制
• 對前端來說,主要關心的是W3C規範的
The WebSocket API
72
• 如果不考慮IE與Edge,對於僅需要單向接
受伺服端訊息的應用程式來說,使用
Server-Sent Events就足夠了
• 如果客戶端與伺服端需要雙向互動,而不
單只是伺服端推送訊息,例如網路遊戲,
才適合使用WebSocket
73
74
75

More Related Content

What's hot

Parse, cloud code 介紹
Parse, cloud code 介紹Parse, cloud code 介紹
Parse, cloud code 介紹wantingj
 
前端MVVM框架安全
前端MVVM框架安全前端MVVM框架安全
前端MVVM框架安全Borg Han
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Justin Lin
 
CH10:輸入輸出
CH10:輸入輸出CH10:輸入輸出
CH10:輸入輸出Justin Lin
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用hugo
 
Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架Cabin WJ
 
CH14:NIO 與 NIO2
CH14:NIO 與 NIO2CH14:NIO 與 NIO2
CH14:NIO 與 NIO2Justin Lin
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTLJustin Lin
 
Web Caching Architecture and Design
Web Caching Architecture and DesignWeb Caching Architecture and Design
Web Caching Architecture and DesignHo Kim
 

What's hot (11)

Parse, cloud code 介紹
Parse, cloud code 介紹Parse, cloud code 介紹
Parse, cloud code 介紹
 
前端MVVM框架安全
前端MVVM框架安全前端MVVM框架安全
前端MVVM框架安全
 
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
Servlet & JSP 教學手冊第二版 - 第 4 章:會話管理
 
Elasticsearch 簡介
Elasticsearch 簡介Elasticsearch 簡介
Elasticsearch 簡介
 
CH10:輸入輸出
CH10:輸入輸出CH10:輸入輸出
CH10:輸入輸出
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用
 
Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架
 
CH14:NIO 與 NIO2
CH14:NIO 與 NIO2CH14:NIO 與 NIO2
CH14:NIO 與 NIO2
 
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
Servlet & JSP 教學手冊第二版 - 第 5 章:Servlet 進階 API、過濾器與傾聽器
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Web Caching Architecture and Design
Web Caching Architecture and DesignWeb Caching Architecture and Design
Web Caching Architecture and Design
 

Similar to 12. 網路通訊方案

Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Justin Lin
 
【第一季•第六期】Ajax & JSONP in Action
【第一季•第六期】Ajax & JSONP in Action【第一季•第六期】Ajax & JSONP in Action
【第一季•第六期】Ajax & JSONP in Actiontbosstraining
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践self study
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践Li JianYe
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用redhat9
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應Justin Lin
 
Node.js长连接开发实践
Node.js长连接开发实践Node.js长连接开发实践
Node.js长连接开发实践longhao
 
Spring mvc
Spring mvcSpring mvc
Spring mvcpepsixp
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用redhat9
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践Jackson Tian
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門Will Huang
 
Razor_MVC3_Quick_Reference
Razor_MVC3_Quick_ReferenceRazor_MVC3_Quick_Reference
Razor_MVC3_Quick_Reference振林 谭
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Servicesjavatwo2011
 
Python xmlrpc-odoo
Python xmlrpc-odooPython xmlrpc-odoo
Python xmlrpc-odoorobin yang
 

Similar to 12. 網路通訊方案 (20)

Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
Servlet & JSP 教學手冊第二版 - 第 3 章:請求與回應
 
【第一季•第六期】Ajax & JSONP in Action
【第一季•第六期】Ajax & JSONP in Action【第一季•第六期】Ajax & JSONP in Action
【第一季•第六期】Ajax & JSONP in Action
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Node.js长连接开发实践
Node.js长连接开发实践Node.js长连接开发实践
Node.js长连接开发实践
 
AJAX Basic
AJAX BasicAJAX Basic
AJAX Basic
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用高性能Web服务器nginx及相关新技术的应用
高性能Web服务器nginx及相关新技术的应用
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践D2_Node在淘宝的应用实践
D2_Node在淘宝的应用实践
 
RxJS 6 新手入門
RxJS 6 新手入門RxJS 6 新手入門
RxJS 6 新手入門
 
Razor_MVC3_Quick_Reference
Razor_MVC3_Quick_ReferenceRazor_MVC3_Quick_Reference
Razor_MVC3_Quick_Reference
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services
 
Python xmlrpc-odoo
Python xmlrpc-odooPython xmlrpc-odoo
Python xmlrpc-odoo
 

More from Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring BootJustin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityJustin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMailJustin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤Justin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSPJustin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletJustin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構Justin Lin
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組Justin Lin
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理Justin Lin
 

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理
 

12. 網路通訊方案