何時使用自定義HTTP 方法
何時使用自定義HTTP 方法
問題描述
您想知道使用自定義HTTP 方法的影響。
解決方案
避免使用非標準的自定義HTTP 方法,因為引入新方法後,就不能依賴那些只瞭解標準HTTP 方法的現有軟體了。
您應該設計一個可以抽象此類操作的控制器(詳見2.6 節)資源,並使用HTTP 的POST方法。
問題討論
擴充套件HTTP 方法最重要的好處是,它可以讓伺服器為擴充套件方法定義清晰的語義並保持介面一致。但是,除非得到廣泛支援,否則擴充套件方法將會降低互操作性。
例如,WebDAV 將MOVE 的語義定義為“邏輯上與複製一致,接著是一致性維護處理,最後進行原始檔的刪除,所有這三個動作是以原子操作的形式來執行的。”任何客戶端都可以透過提交OPTIONS 請求以確認一個WebDAV 資源是否實現了MOVE方法。需要時,如果資源支援MOVE方法,客戶端可以提交MOVE請求把資源從一個地方移動到另一個地方:
# 發現所支援方法的請求
OPTIONS /docs/annual_report HTTP/1.1
Host:
# 響應
HTTP/1.1. 204 No Content
Allow: GET, PUT, DELETE, MOVE
# 移動
MOVE /docs/annual_report HTTP/1.1
Host:
Destination: http:///docs/annual_report_2009
# 響應
HTTP/1.1 201 Created
Location: http:///docs/annual_report_2009
當然也可以遵循WebDAV 的做法,設計一個新方法,比如CLONE,建立一個現有的
資源的副本:
# 克隆請求
CLONE /po/1234 HTTP/1.1
Host:
# 已建立克隆
HTTP/1.1 201 Created
Location: /po/5678
客戶端會發現伺服器支援這一方法,並提交CLONE請求。
實際上,代理、快取及HTTP 庫會將這些方法認定為非冪等、不安全及不可快取的。
換言之,它們對這樣的擴充套件方法使用和POST 一樣的處理規則,POST 也是非冪等、不安全且在大部分情況下是不可快取的。這是因為冪等性和安全性是伺服器必須保證的。對於未知的自定義方法,代理、快取和HTTP 庫不能假定伺服器提供了這樣的保證。因此,對大部分基於HTTP 的軟體和工具,自定義HTTP 方法等同於POST方法。
# 克隆請求
POST /clone-orders HTTP/1.1
Host:
Content-Type: application/x-www-form-urlencoded
id=urn:example:po:1234
# 已建立克隆
HTTP/1.1 201 Created
Location: /po/5678
此外,並不是所有的HTTP 軟體(包括防火牆)都支援任意的擴充套件方法。因此,只有在互操作性不是主要問題時才考慮使用自定義HTTP 方法。
優先使用POST而非自定義HTTP 方法。不是每一個HTTP 軟體都可以讓您使用自定義HTTP 方法的。使用POST是一個更安全的選擇。
本文節選自《RESTful Web Services Cookbook中文版 》一書
圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-708384
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-708474/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flutter自定義Widget和使用方法Flutter
- IPFS何時能取代HTTP?HTTP
- SAP UI5 OData 請求的自定義 HTTP header 設定方法UIHTTPHeader
- python中什麼時候使用自定義類Python
- Spring 定時器的使用—Xml、Annotation、自定義Spring定時器XML
- Spring 定時器的使用---Xml、Annotation、自定義Spring定時器XML
- .Net Core AutoMapper自定義擴充套件方法的使用APP套件
- 使用 Laravel Resource 類時自定義分頁資訊Laravel
- GitLab使用自定義埠Gitlab
- 微信小程式使用自定義字型的三種方法微信小程式自定義字型
- AntD框架的upload元件上傳圖片時使用customRequest方法自定義上傳行為框架元件
- 使用 JWT 時,新增自定義資料並在登陸時校驗JWT
- 再遇CORS -- 自定義HTTP header的導致跨域CORSHTTPHeader跨域
- @Scheduled 定時任務自定義
- Flutter自定義時間軸timelineFlutter
- 自定義時間選擇器
- MySQL使用之五_自定義函式和自定義過程MySql函式
- 使用 GNOME 優化工具自定義 Linux 桌面的 10 種方法優化Linux
- 使用自定義 HTTP Interceptor 記錄 SAP Spartacus 傳送的 OCC API 以及響應HTTPAPI
- 使用者自定義定時任務的php實現PHP
- 使用 Dockerfile 自定義 Nginx 映象DockerNginx
- Facade 門面自定義使用
- 使用 FVWM 自定義 Linux 桌面Linux
- jquery自定義事件的使用jQuery事件
- Android自定義View之requestLayout方法和invalidate方法AndroidView
- Android自定義View之invalidate方法和postInvalidate方法AndroidView
- go 自定義http.Client - 動態修改請求BodyGoHTTPclient
- 自定義元件-資料、方法、屬性元件
- 匯入自定義板塊的方法
- FormRequest 自定義獲取方法名字ORM
- 怎樣用apipost自定義加密方法API加密
- 建立Laravel自定義Helper輔助方法Laravel
- 20190118-自定義實現replace方法
- layui下拉框xm-select自定義搜尋使用方法UI
- AbpVnext使用分散式IDistributedCache Redis快取(自定義擴充套件方法)分散式Redis快取套件
- 測試 iris 時自定義 context 包Context
- 自定義View合輯(1)-時鐘View
- IDEA自定義類註釋和方法註釋(自定義groovyScript方法實現多行引數註釋)Idea
- 優思學院|何時應該使用8D方法?