服務(wù)器可能支持資源獲取,創(chuàng)建,更新和刪除。
服務(wù)器允許單次請求,更新多個(gè)資源,如下所述。多個(gè)資源更新必須完全成功或者失敗,不允許部分更新成功。
任何包含內(nèi)容的請求,必須包含Content-Type:application/vnd.api+json請求頭。
支持資源創(chuàng)建的服務(wù)器,必須支持創(chuàng)建單獨(dú)的資源,可以選擇性支持一次請求,創(chuàng)建多個(gè)資源。
向表示待創(chuàng)建資源所屬資源集的URL,發(fā)出POST請求,創(chuàng)建一個(gè)或多個(gè)資源。
創(chuàng)建單獨(dú)資源的請求必須包含單一主要資源對象。
例如,新photo可以通過如下請求創(chuàng)建:
POST /photos
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"photos": {
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
}
}
創(chuàng)建多個(gè)資源的請求必須包含主要主要資源集合。
例如,多個(gè)photos通過如下請求創(chuàng)建:
POST /photos
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"photos": [{
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
}, {
"title": "Mustaches on a Stick",
"src": "http://example.com/images/mustaches.png"
}]
}
服務(wù)器依據(jù)HTTP semantics規(guī)范,響應(yīng)成功的資源創(chuàng)建請求。
當(dāng)一個(gè)或多個(gè)資源創(chuàng)建成功,服務(wù)器返回201 Created狀態(tài)碼。
響應(yīng)必須包含Location頭,用以標(biāo)示請求創(chuàng)建所有資源的位置。
如果創(chuàng)建了單個(gè)資源,且資源對象包含href鍵,Location URL必須匹配href值。
響應(yīng)必須含有一個(gè)文檔,用以存儲所創(chuàng)建的主要資源。如果缺失,客戶端則判定資源創(chuàng)建時(shí),傳輸?shù)奈臋n未經(jīng)修改。
HTTP/1.1 201 Created
Location: http://example.com/photos/550e8400-e29b-41d4-a716-446655440000
Content-Type: application/vnd.api+json
{
"photos": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"href": "http://example.com/photos/550e8400-e29b-41d4-a716-446655440000",
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
}
}
服務(wù)器可能使用其它HTTP錯(cuò)誤狀態(tài)碼反映錯(cuò)誤??蛻舳吮仨氁罁?jù)HTTP規(guī)范處理這些錯(cuò)誤信息。如下所述,錯(cuò)誤細(xì)節(jié)可能會一并返回。
請求創(chuàng)建一個(gè)或多個(gè)資源時(shí),服務(wù)器可能接受客戶端生成IDs。IDs必須使用"id"鍵來指定,其值必須正確生成,且為格式化的UUID。
例如:
POST /photos
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"photos": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
}
}
支持資源更新的服務(wù)器必須支持單個(gè)資源的更新,可以選擇性的支持單次請求更新多個(gè)資源。
向表示單獨(dú)資源或多個(gè)單獨(dú)資源的URL發(fā)出PUT請求,即可進(jìn)行資源更新。
為更新單獨(dú)資源,向表示資源的URL發(fā)出PUT請求。請求必須包含一個(gè)頂層資源對象。
例如:
PUT /articles/1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"articles": {
"id": "1",
"title": "To TDD or Not"
}
}
向表示多個(gè)單獨(dú)資源(不是全部的資源集合)的URL發(fā)出PUT請求,即可更新多個(gè)資源。請求必須包含頂層資源對象集合,且每個(gè)資源具有“id"元素。
例如:
PUT /articles/1,2
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"articles": [{
"id": "1",
"title": "To TDD or Not"
}, {
"id": "2",
"title": "LOL Engineering"
}]
}
要更新資源的一個(gè)或多個(gè)屬性,主要資源對象應(yīng)該只包括待更新的屬性。資源對象缺省的屬性將不會更新。
例如,下面的PUT請求,僅會更新article的title和text屬性。
PUT /articles/1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"articles": {
"id": "1",
"title": "To TDD or Not",
"text": "TLDR; It's complicated... but check your test coverage regardless."
}
}
單對象關(guān)聯(lián)更新,可以在PUT請求資源對象中包含links鍵,從而與其它屬性一起更新。
例如,下面的PUT請求將會更新article的title和author屬性:
PUT /articles/1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"articles": {
"title": "Rails is a Melting Pot",
"links": {
"author": "1"
}
}
}
若要移除單對象關(guān)聯(lián),指定null作為值即可。
另外,單對象關(guān)聯(lián)也可以通過它的關(guān)聯(lián)URL訪問。
向關(guān)聯(lián)URL發(fā)出帶有主要資源的POST請求,即可添加單對象關(guān)聯(lián)。
例如:
POST /articles/1/links/author
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"people": "12"
}
向關(guān)聯(lián)URL發(fā)出DELETE請求,即可刪除單對象關(guān)聯(lián)。例如:
DELETE /articles/1/links/author
更新多對象關(guān)聯(lián),可以在PUT請求中資源對象包含links鍵,從而與其它屬性一起更新。
例如,下面PUT請求完全替換article的tags。
PUT /articles/1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"articles": {
"id": "1",
"title": "Rails is a Melting Pot",
"links": {
"tags": ["2", "3"]
}
}
}
若要移除多對象關(guān)聯(lián),指定空數(shù)組[]為值即可。
在分布式系統(tǒng)中,完全替換一個(gè)數(shù)據(jù)集合并不總是合適。替換方案是允許單獨(dú)的添加或移除關(guān)聯(lián)。
為促進(jìn)細(xì)化訪問,多對象關(guān)聯(lián)也可以通過關(guān)聯(lián)URL訪問。
向關(guān)聯(lián)URL發(fā)出帶有主要資源的POST請求,即可添加多對象關(guān)聯(lián)。
POST /articles/1/links/comments
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"comments": ["1", "2"]
}
向關(guān)聯(lián)URL發(fā)出DELETE請求,即可刪除多對象對象關(guān)聯(lián)。例如:
DELETE /articles/1/links/tags/1
向關(guān)聯(lián)URL發(fā)出DELETE請求,即可刪除多個(gè)多對象對象關(guān)聯(lián)。例如:
DELETE /articles/1/links/tags/1,2
如果更新成功,且客戶端屬性保持最新,服務(wù)器必須返回204 No Content狀態(tài)碼。適用于PUT請求,以及僅調(diào)整links,不涉及其它屬性的POST, DELETE請求。
如果服務(wù)器接受更新,但是在請求指定內(nèi)容之外做了資源修改,必須響應(yīng)200 OK以及更新的資源實(shí)例,像是向此URL發(fā)出GET請求。
服務(wù)器使用其它HTTP錯(cuò)誤狀態(tài)碼反映錯(cuò)誤??蛻舳吮仨氁罁?jù)HTTP規(guī)范處理這些錯(cuò)誤信息。如下所述,錯(cuò)誤細(xì)節(jié)可能會一并返回。
向資源URL發(fā)出DELETE請求即可刪除單個(gè)資源。
DELETE /photos/1
服務(wù)器可以選擇性的支持,在一個(gè)請求里刪除多個(gè)資源。
DELETE /photos/1,2,3
如果刪除請求成功,服務(wù)器必須返回204 No Content 狀態(tài)碼。
服務(wù)器使用其它HTTP錯(cuò)誤狀態(tài)碼反映錯(cuò)誤。客戶端必須依據(jù)HTTP規(guī)范處理這些錯(cuò)誤信息。如下所述,錯(cuò)誤細(xì)節(jié)可能會一并返回。