REST - Как една PUT заявка би обработила автоматично увеличаващи се идентификатори на ресурси

Според HTTP 1.1. спецификация:

Ако Request-URI не сочи към съществуващ ресурс и този URI може да бъде дефиниран като нов ресурс от искащия потребителски агент, първоначалният сървър може да създаде ресурса с този URI.

С други думи, PUT може да се използва за създаване и актуализиране. По-конкретно, ако направя PUT заявка, напр.

PUT /users/1

и този потребител не съществува, бих очаквал резултатът от тази заявка да създаде потребител с този идентификатор. Как обаче ще работи това, ако вашият бекенд използва ключ за автоматично увеличаване? Ще бъде ли случай на просто игнориране, ако не е осъществимо (напр. автоматичното нарастване е на 6 и аз изисквам 10) и създаване, ако е възможно (напр. заявка 7)?

От фрагмента, който извадих по-горе, изглежда, че ви дава тази гъвкавост, просто търся малко разяснение.


person James    schedule 26.03.2012    source източник


Отговори (2)


Предлагам ви да използвате POST, а не PUT, за ключ за автоматично нарастване или да не използвате ключа за автоматично увеличаване в идентификатора на ресурса.

Ако използвате POST, тогава бихте направили POST до /users, а не до /users/1. Отговорът може да ви пренасочи към /users/1 или какъвто и да е идентификаторът.

Ако използвате PUT, тогава може да PUT до /users/10292829, където номерът е уникален ресурсен ключ, генериран на клиента. Този ключ може да бъде генериран във времето или може да бъде хеш от време, идентификатор на сесия и някои други фактори, за да се гарантира уникалността на стойността в цялата клиентска аудитория. След това сървърът може да генерира свой собствен автоматично увеличаващ се индекс, различен от 10292829 или друг.

За повече информация вижте PUT срещу POST в REST


Проследяване. . .

В случай на разрешаване на PUT до /users/XXXXXXX, за всички потребители, ще получите два различни уникални ключа, които се отнасят до един и същ ресурс. (10292829 и 1 може да се отнасят за един и същ потребител). Трябва да решите как да разрешите използването на всеки от тези различни ключове в URL адрес в стил REST. Поради необходимостта да съгласувам използването на тези два различни идентификатора, бих предпочел да използвам първата опция, POSTing до /users и получаване на уникален REST url на създадения ресурс в отговора.

Току-що прочетох отново съответния раздел на RFC 2616 и видях код за връщане, специално създаден за това в REST приложения:

10.2.2 201 Създаден

Заявката беше изпълнена и доведе до създаването на нов ресурс. Новосъздаденият ресурс може да бъде посочен от URI адресите, върнати в обекта на отговора, с най-специфичния URI за ресурса, даден от полето за заглавка на местоположението. Отговорът ТРЯБВА да включва обект, съдържащ списък с характеристики на ресурси и местоположение(я), от които потребителят или потребителският агент може да избере най-подходящия. Форматът на обекта се определя от типа на носителя, даден в полето за заглавка Content-Type. Първоначалният сървър ТРЯБВА да създаде ресурса, преди да върне кода на състоянието 201. Ако действието не може да бъде извършено незабавно, сървърът ТРЯБВА да отговори с отговор 202 (Прието).

И така, RESTful начинът да отидете е да POST до /users и да върнете 201 Created, с Location: хедър, указващ /users/1.

person Cheeso    schedule 26.03.2012
comment
Моят REST API в момента поддържа POST, но искам да поддържам и PUT, за да разреша актуализации. Така че, за да се избегне усложнението от предаването на уникални идентификатори от страна на клиента, трябва ли PUT просто да върне 404, ако ресурсът не съществува, вместо да се опитва да го създаде? Това все още ли ще се счита за RESTful? - person James; 27.03.2012
comment
Да, PUT е предназначен за актуализации. Ако URI, към който се изпраща PUT, не препраща към наличен ресурс, тогава 404 е разумно нещо за връщане. Ако е REST/JSON, можете да включите съобщение за грешка във формат json в тялото на съобщението на отговора. {"error":"resource does not exist."}. Но всъщност изпращането на информация в тялото на съобщението е подходящо само ако добавя към информацията, която предава кодът на състоянието. Ако съобщението не съществува, тогава 404 е достатъчно и не е необходимо тяло на съобщението. - person Cheeso; 27.03.2012
comment
Страхотно, така че наистина с PUT имате избор дали искате да създавате или не (което наистина търсех разяснение). Мисля, че в моя сценарий тогава PUT ще се използва само за актуализиране (ако ресурсът съществува). Благодаря! - person James; 27.03.2012
comment
да, мисля, че спецификацията е донякъде отворена за това как точно трябва да се използва PUT. Но на практика се опитвам да проектирам модел, който е възможно най-прост. За мен използването на PUT за актуализации, посочване на съществуващ URL адрес на ресурс, е това, което има интуитивен смисъл; използването на POST за създаване, посочването на URL към фабрика за ресурси или мениджър на ресурси и отговорът 201 Created има смисъл. - person Cheeso; 27.03.2012

Трябва да използвате POST за създаване на ресурси, докато PUT трябва да се използва само за актуализиране. Всъщност семантиката на REST ви принуждава да го направите.

person Ruwan    schedule 27.03.2012
comment
Според спецификацията PUT може да се използва за създаване на ресурси в сценария, при който ресурсът на посочения URI не съществува... това е дилемата. - person James; 27.03.2012