何時使用自定義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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 自定義HttpMessageHandler實現HTTP方法的重寫HTTP
- IPFS何時能取代HTTP?HTTP
- Flutter自定義Widget和使用方法Flutter
- 使用 Laravel Resource 類時自定義分頁資訊Laravel
- Angular過濾器 自定義及使用方法Angular過濾器
- 自定義動畫方法animate()動畫
- [ARKit]5-載入自定義幾何體
- Spring 定時器的使用—Xml、Annotation、自定義Spring定時器XML
- python中什麼時候使用自定義類Python
- Spring 定時器的使用---Xml、Annotation、自定義Spring定時器XML
- SAP UI5 OData 請求的自定義 HTTP header 設定方法UIHTTPHeader
- 微信小程式使用自定義字型的三種方法微信小程式自定義字型
- ListView中使用自定義Adapter及時更新資料ViewAPT
- 使用Photos自定義相簿
- 使用 JWT 時,新增自定義資料並在登陸時校驗JWT
- WebService中使用自定義類的解決方法(5種)Web
- 自定義時間選擇器
- 工具類——自定義Collections集合方法
- 使用者自定義定時任務的php實現PHP
- MySQL使用之五_自定義函式和自定義過程MySql函式
- .Net Core AutoMapper自定義擴充套件方法的使用APP套件
- 使用自定義 HTTP Interceptor 記錄 SAP Spartacus 傳送的 OCC API 以及響應HTTPAPI
- 使用 Dockerfile 自定義 Nginx 映象DockerNginx
- jquery自定義事件的使用jQuery事件
- GitLab使用自定義埠Gitlab
- C#使用自定義特性C#
- 自定義Directive使用ngModel
- Win10系統自定義設定日期和時間的方法Win10
- 自定義View合輯(1)-時鐘View
- 何時使用Entity或DTO
- 瞭解何時使用RabbitMQMQ
- openfire使用自定義使用者表
- AntD框架的upload元件上傳圖片時使用customRequest方法自定義上傳行為框架元件
- 再遇CORS -- 自定義HTTP header的導致跨域CORSHTTPHeader跨域
- go 自定義http.Client - 動態修改請求BodyGoHTTPclient
- FormRequest 自定義獲取方法名字ORM
- 建立Laravel自定義Helper輔助方法Laravel
- 怎樣用apipost自定義加密方法API加密