JSON API服務(wù)器可以選擇性支持,遵循JSON Patch規(guī)范[RFC6902]的HTTP PATCH請求。上面提到使用POST, PUT 和 DELETE進(jìn)行的操作,JSON Patch都擁有等效操作。從這里開始,PATCH請求發(fā)出的JSON Patch操作,都被簡單的稱作“PATCH"操作。
PATCH請求必須聲明Content-Type:application/json-patch+json頭。
PATCH操作必須作為數(shù)組發(fā)送,以遵循JSON Patch規(guī)范。服務(wù)器可能會(huì)限制頂層數(shù)組類型,順序和操作數(shù)量。
每個(gè)PATCH請求的URL應(yīng)該映射待更新的資源或關(guān)聯(lián)。
PATCH操作內(nèi)的每個(gè)"path"應(yīng)該相對于請求URL。請求URL和PATCH操作的"path"是附加的,合并后獲取特定資源,集合,屬性,或者關(guān)聯(lián)目標(biāo)。
PATCH操作可以在API的根URL使用。此時(shí),PATCH操作的"path"必須包含完整的資源URL。API表示的任意資源都可以進(jìn)行常規(guī)的"fire hose"更新。如上所述,服務(wù)器可能會(huì)限制類型,排序和批量操作數(shù)量。
要?jiǎng)?chuàng)建資源,執(zhí)行"add"操作, "path"指向?qū)?yīng)資源集合的末尾 ("/-")。"value"必須包含一個(gè)資源對象。
比如,新photo通過如下請求創(chuàng)建:
PATCH /photos
Content-Type: application/json-patch+json
Accept: application/json
[
{
"op": "add",
"path": "/-",
"value": {
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
}
}
]
要更新屬性,執(zhí)行"replace" 操作,"path"值指定屬性名。
例如,下面請求只更新/photos/1的src值。
PATCH /photos/1
Content-Type: application/json-patch+json
[
{
"op": "replace",
"path": "/src",
"value": "http://example.com/hamster.png"
}
]
要更新關(guān)聯(lián),向?qū)?yīng)的關(guān)聯(lián)URL發(fā)出合適的PATCH操作即可。
服務(wù)器可能支持更高層級的更新,像資源的URL(甚至是API的根URL)。如上所述,請求URL和每個(gè)操作的"path"是附加的,合并后獲得特定關(guān)聯(lián)URL目標(biāo)。
要更新單對象關(guān)聯(lián),對指向關(guān)聯(lián)的URL和"path" 執(zhí)行"replace"操作。
例如:下面請求更新article的author:
PATCH /article/1/links/author
Content-Type: application/json-patch+json
[
{
"op": "replace",
"path": "/",
"value": "1"
}
]
要移除單對象關(guān)聯(lián),對關(guān)聯(lián)執(zhí)行remove操作。例如:
PATCH /article/1/links/author
Content-Type: application/json-patch+json
[
{
"op": "remove",
"path": "/"
}
]
盡管在GET響應(yīng)中,多對象關(guān)聯(lián)以JSON數(shù)組形式表示,但是更新時(shí)更像是集合。
要添加元素到多對象關(guān)聯(lián),執(zhí)行指向關(guān)聯(lián)URL的"add" 請求。由于操作指向集合末尾, "path" 必須以"/-"結(jié)尾。
例如,考慮下面的GET請求:
GET /photos/1
Content-Type: application/vnd.api+json
{
"links": {
"comments": "http://example.com/comments/{comments}"
},
"photos": {
"id": "1",
"href": "http://example.com/photos/1",
"title": "Hamster",
"src": "images/hamster.png",
"links": {
"comments": [ "1", "5", "12", "17" ]
}
}
}
向PATCH請求執(zhí)行add操作,即可將comment 30 轉(zhuǎn)移到這個(gè)photo。
PATCH /photos/1/links/comments
Content-Type: application/json-patch+json
[
{
"op": "add",
"path": "/-",
"value": "30"
}
]
要移除多對象關(guān)聯(lián),對指向關(guān)聯(lián)對象的URL執(zhí)行"remove"操作。因?yàn)椴僮髂繕?biāo)是元素集合,"path"必須以"/<id>"結(jié)尾。
比如,要移除photo的comment 5,執(zhí)行"remove"操作:
PATCH /photos/1/links/comments
Content-Type: application/json-patch+json
[
{
"op": "remove",
"path": "/5"
}
]
要?jiǎng)h除資源,對指向資源的 URL 和"path"執(zhí)行 "remove" 操作。
例如,photo 1 能使用下面請求刪除:
PATCH /photos/1
Content-Type: application/json-patch+json
Accept: application/vnd.api+json
[
{
"op": "remove",
"path": "/"
}
]
若PATCH請求成功,客戶端當(dāng)前的屬性保持最新,服務(wù)器必須響應(yīng)204 No Content 狀態(tài)碼。
如果服務(wù)器接受更新,但是在請求指定內(nèi)容之外做了資源修改,必須響應(yīng)200 OK以及更新的資源實(shí)例。
服務(wù)器必須指定Content-Type:application/json頭。響應(yīng)內(nèi)容必須包含JSON對象數(shù)組,每個(gè)對象必須遵循JSON API媒體類型(application/vnd.api+json)。數(shù)組中的響應(yīng)對象必須有序,并且對應(yīng)請求文檔操作。
例如,一個(gè)請求以分離操作,創(chuàng)建兩個(gè)photos。
PATCH /photos
Content-Type: application/json-patch+json
Accept: application/json
[
{
"op": "add",
"path": "/-",
"value": {
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
}
},
{
"op": "add",
"path": "/-",
"value": {
"title": "Mustaches on a Stick",
"src": "http://example.com/images/mustaches.png"
}
}
]
響應(yīng)內(nèi)容在數(shù)組中包含對應(yīng)的JSON API文檔。
HTTP/1.1 200 OK
Content-Type: application/json
[
{
"photos": [{
"id": "123",
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
}]
}, {
"photos": [{
"id": "124",
"title": "Mustaches on a Stick",
"src": "http://example.com/images/mustaches.png"
}]
}
]
當(dāng)服務(wù)器執(zhí)行PATCH請求時(shí)出現(xiàn)一個(gè)或多個(gè)問題,應(yīng)該在響應(yīng)中指定最合適的HTTP狀態(tài)碼??蛻舳艘罁?jù)HTTP規(guī)范解析錯(cuò)誤。
服務(wù)器可以選擇在第一個(gè)問題出現(xiàn)時(shí),立刻終止PATCH 操作,或者繼續(xù)執(zhí)行,遇到多個(gè)問題。例如,服務(wù)器可能多屬性更新,然后返回在一個(gè)響應(yīng)里返回多個(gè)校驗(yàn)問題。
當(dāng)服務(wù)器單個(gè)請求遇到多個(gè)問題,響應(yīng)中應(yīng)該指定最通用可行的HTTP錯(cuò)誤碼。例如,400 Bad Request適用于多個(gè)4xx errors,500 Internal Server Error適用于多個(gè)5xx errors。
服務(wù)器可能會(huì)返回與每個(gè)操作對應(yīng)的錯(cuò)誤對象。服務(wù)器需要指定Content-Type:application/json頭,響應(yīng)體必須包含JSON對象數(shù)組,每個(gè)對象必須遵循JSON API媒體類型 (application/vnd.api+json)。數(shù)組中的響應(yīng)對象,必須是有序,且與請求文檔中的操作相對應(yīng)。每個(gè)響應(yīng)對象應(yīng)該僅包含error對象,當(dāng)錯(cuò)誤發(fā)生時(shí),沒有操作會(huì)完全成功。每個(gè)特定操作的錯(cuò)誤碼,應(yīng)該在每個(gè)error對象 "status" 元素反映。
服務(wù)器可能會(huì)使用遵循HTTP 1.1規(guī)范的HTTP 緩存頭 (ETag, Last-Modified)。