2013-10-15 19 views
0

Мы разрабатываем API REST, и мы разрешаем все четыре стандартных глагола. В случае POST/PUT клиенту API необходимо будет изменять значения для определенных полей. Возьмем пример псевдо:Рекомендации по использованию REST API

class Employee { 
    long Id; 
    long DepartmentId; // should i expose this? 
    string Department; // or should i expose this? 
} 
  • Потребительная дело здесь в том, что клиент будет POST нового сотрудника и заполнить все поля.
  • Существует таблица отделов в нашей базе данных за API
  • Клиент должен будет получить список допустимых отделов отправить
  • клиент может сделать вызов API, чтобы получить список отделов, как например:

{ "department_id": "1", "отдел": "Технология" },
{ "department_id": "2", «departm ent ":" Людские ресурсы " }

Клиент может включать один из вышеуказанных действующих департаментов. Мой вопрос: должен ли запрос POST/PUT включать идентификатор отдела или имя? Идентификатор кажется более легким для проверки, но менее «дружественным» для клиента. В любом случае мы можем правильно проверить нашу справочную таблицу, но мне интересно, что такое лучшая практика.

+1

Будет ли клиент быть какой-то формой выбора, как выпадающий список для отдела? Я думаю, что должен быть класс 'Департамент'. – christiandev

+0

Я могу сделать класс отдела, но это все еще не решает мою проблему. Я предполагаю, что API не имеет интерфейса, и клиент должен делать запросы, чтобы получить все справочные данные загодя. –

+0

API Потребители должны отправить вам ID * и * полномасштабный объект. Легче для них (новый объект(), заполнить реквизит, отправить материал) и для вас (захватить объект, использовать его как есть после проверки содержимого, мало усилий). Никогда, * никогда * не используйте имена для связывания данных. – Alex

ответ

1

Он должен использовать идентификатор. Пользователь API должен понимать ссылки. В этом случае он должен понимать, что он относится к одному конкретному отделу. Для этого клиенту, возможно, придется сначала запросить список доступных отделов, но это не должно вас беспокоить, пока вы выставляете такую ​​конечную точку.

Использование имени отдела сделает имя отдела уникальным ключом, который сильно изменит семантику. Кроме того, вам может потребоваться индексировать название отдела, чтобы эффективно реализовать это, что является еще одним тяжелым недостатком использования имени.

0
class Employee { 
    long Id; 
    Department Dept; 
} 

или

class Employee { 
     long Id; 
     long DepartmentId; 
    } 

    class Department{ 
     long DepartmentId; 
     string DepartmentName; 
    } 

Это моющее средство для структуры класса. Что касается клиента, им нужен элемент управления выбора для выбора отдела - вы не можете ожидать, что они узнают идентификатор или вернут имя. Я использовал коробку AutoComplete для больших выборов или коробку dropdown для небольшого списка.

Чтобы ответить на вопрос о том, что отправить обратно from клиенту, я пришлю обратно ID.

+0

Почему у сотрудника есть отдел? Почему первичный ключ Employee просто «Id», но основным ключом отдела является «DepartmentId»? – mnemosyn

+0

Что нет интерфейса API? Клиенту нужно будет заблаговременно получить список отделов, и это нормально, это просто вопрос о том, что для них больше смысла возвращаться? –

+0

@mnemosyn, я не придумал соглашение об именах, и это пример psuedo. Работнику нужна ссылка на Департамент, либо имеющий объект Департамента, либо ПК, DepartmentId. Я просто иллюстрировал, что Сотрудник не должен иметь информацию отдела. – christiandev

0

Как правило, лучше иметь URI, которые передают смысл. Например

www.mylocalpaper.com/news/local/politics/2013_town_budget_approved 

лучше

www.mylocalpaper.com/sections/12/subsection/13/article/45 

, поскольку раздел 12 подраздел 13 статьи 45 ничего никому не значит, что за пределами кода веб-сервера. Очевидно, убедитесь, что URL для каждого отдела уникален (URL-адрес U).

Вы также должны вернуть полный URL-адрес клиенту для отдела, а не просто краткое имя, и использовать этот URL-адрес, чтобы добавить пользователя в этот отдел. Таким образом, возвращение

{ "add_employee_url": "/departments/tech/employees/", "name": "Technology" }, 
{ "add_employee_url": "/departments/hr/employees/", "name": "Human Resources" } 

Затем клиент просто публикует сведения о сотруднике по URL-адресу, соответствующему выбранному. Пользователь клиента выбирает «Технология», а клиент отправляет /departments/tech/employees/.

Если URL-адрес отдела изменяется (скажем, tech становится technology по строке), клиенту все равно, потому что он получает полный URL-адрес для действия.

+0

Что делать, если объект Employee имеет на нем много полей? Не только отдел ... –

+0

Информация для нового сотрудника должна быть в теле запроса, например, в формате JSON или XML или в любом другом формате. POSTing этих данных в/department/tech/employees в основном говорит, что здесь новый ресурс сотрудника, пожалуйста, добавьте этого нового сотрудника в этот отдел, используя эту информацию (например, имя, возраст, зарплата и т. Д.). Вы делаете это, если сервер решает конечный URL-адрес, скажем, он генерирует новый идентификатор для пользователя на основе номера автоматического увеличения в БД. Затем сервер должен вернуть URL-адрес, который он создал клиенту, например/department/tech/employees/13434. –

+0

Если клиент решает URL-адрес, скажем, например, URL-адрес ресурса сотрудника должен быть ее номером штата, который уже известен, тогда клиент может просто перенаправить данные на этот URL (например, PUT/department/tech/employees/AB3423) , Сервер должен признать, что этот сотрудник еще не находится в системе и создает новую запись базы данных на основе данных, но это создание должно быть скрыто от клиента. Вы делаете это, если клиент определяет конечный URL. –

Смежные вопросы