Должен ли я редактировать пользовательское мета-поле с помощью PUT, PATCH или POST и WP :: Editable

У меня есть простой CPT называемый App в бэкэнд.

Я добавил пользовательское поле usermeta именем favorite_apps для Users

На переднем конце я показываю список приложений, а затем пользователь нажимает значок звездочки (☆), чтобы добавить его в свой список избранных (хранится как массив post_id в пользовательском метаполе пользователя favorite_apps ).

Я решил сделать это с помощью REST API и создал пользовательскую конечную точку:

/wp-json/my-site/v1/users/{user_id}/favoriteapps

Пример: /wp-json/my-site/v1/users/555/favoriteapps

Этот маршрут принимает POST,PUT,PATCH используя WP::Editable и GET используя WP::Readable .

Запрос GET возвращает список текущих пользователей user 555 пользователя 555

Запрос POST и передать app=123 в теле. Я добавляю идентификатор приложения 123 в app_favorites

Для удаления приложения из списка я не уверен. Я не удаляю список избранных_файлов, я удаляю один из элементов.

Естественно использовать POST и DELETE для добавления / удаления из списка, но:

  1. Существует ли соглашение, которое я могу соблюдать при изменении списка элементов?
  2. Должен ли я использовать PUT или PATCH и передавать action качестве другого параметра?
  3. Должен ли я беспокоиться о поддержке браузера для определенных методов?

Для справки, это то, как я добавляю приложение 123 в / из пользователя 555 в js / jQuery:

 var uid = 555; var appId = 123; $.ajax({ method : 'POST', data : { app : 123 }, url : '/wp-json/my-site/v1/users/' + uid + '/favoriteapps', success: function( data ){ // code to tell user of success or failure; } }); 

Solutions Collecting From Web of "Должен ли я редактировать пользовательское мета-поле с помощью PUT, PATCH или POST и WP :: Editable"

Хорошо, с некоторыми замечательными примерами из: https://restfulapi.net/resource-naming/ и http://www.restapitutorial.com/lessons/restfulresourcenaming.html. Я собираюсь ответить на свой вопрос.

ESSENTIALLY , для моего варианта использования, я НЕ буду использовать PUT но полагаюсь на POST и DELETE для коллекций и одиночных конечных точек.

Заметки:

  1. Я пропустил примеры добавления wp-json/my-site-namespace/v1 для ясности
  2. Я использовал строки запроса в POST-запросах, но для ясности, но я бы отправил их в тело POST как POST-вары, а НЕ в строку запроса.

Использовать запросы GET для отдельных объектов или коллекций

 // Gets a collection of users GET /users // Gets the singleton users 3 GET /users/3/favoriteapps // Gets a collection of user 3 favorite apps GET /users/3/favoriteapps 

Использовать запросы POST только на конечных точках сбора (имеет смысл)

 // Create a new user named Joe ( returns the ID ) POST /users?name=Joe ( pass in required params in POST vars ) // Add app 123 to user's favorite apps. Technically, I'm not CREATING // a new favorite app, which is where I was getting hung up, but // in context of user 3, I AM creating a new reference to an existing app POST /users/3/favoriteapps?app_id=123 ( pass in required app id in POST vars ) 

ИСПОЛЬЗОВАТЬ PUT запросы на редактирование коллекции или объекта

В моем случае я добавляю и удаляю известные приложения и от пользователя, поэтому я НЕ буду поддерживать PUT в моей реализации, но если бы я его реализовал, я бы реализовал его только в коллекции, возможно, если бы я проходил сборник и сравнение этой коллекции с существующей.

 // Edit ( replace ) existing apps with list of apps for user 3 PUT /users/3/favoriteapps?apps=123,321,444,111,33 // In my use case, I wouldn't ONLY support PUT to a new favoriteapps // base url, outside of the user context This would but this would // change the app title for app 123 ( obviously for all users' collections ) PUT /favoriteapps/123?title=New+App+Title 

Использовать DELETE запросы для конечных точек единого объекта (в основном) **

** Использование DELETE в конечной точке коллектора должно удалить всю коллекцию (семантически), что редко бывает в том, что вы собираетесь использовать. но в некоторых случаях, как кнопка очистки для сброса коллекции на 0 элементов, вы можете ее использовать.

 // Remove app `123` from favoriteapps collection of user 3 DELETE /users/3/favoriteapps/123 // note: this is another area I got hung up, as I'm not DELETING app 123 // However, in context of user 3, I AM removing it from that user's collection