RESTful — получение списка ресурсов по идентификатору владельца

#c# #.net #rest #asp.net-web-api

#c# #.net #rest #asp.net-веб-api

Вопрос:

Мне нужно получить список отделов, которые принадлежат определенному подразделению. /dept/1 URL-адрес, согласно основам REST, должен использоваться для получения определенного отдела по идентификатору, поэтому он не может быть использован здесь.

Тогда у меня есть следующие варианты:

/dept/division/1

Не выглядит как настоящий REST. Кроме того, я не знаю, как реализовать это в терминах действий WebAPI.

/dept?divId=1

Выглядит более RESTful. Для этого потребуется создать Get(int divId) действие, но есть также Get(int id) одно, предназначенное для извлечения одного отдела и имеющее ту же подпись.

/dept (with divId=1 in the body)
Достаточно ли это RESTful? Однако у него будет такая же проблема с подписью, как и в # 2…

Пожалуйста, посоветуйте, какой способ лучше. Спасибо!

Ответ №1:

Как бы я это сделал

 /divisions/1/depts
  

/divisions/1 получает единственное подразделение с идентификатором 1, а /depts за ним — все отделы, принадлежащие этому конкретному подразделению

Затем это, конечно, можно было бы расширить до

 /divisions/1/depts/234
  

Чтобы получить отдел с идентификатором 234 из подразделения 1.

Нет необходимости передавать информацию через тело таким образом.

Я использовал множественное число для имен ресурсов, потому что я привык делать это таким образом, если вы хотите использовать division и dept вместо этого, это было бы просто прекрасно.

Комментарии:

1. да, это хороший 4-й вариант. Пожалуйста, как будет выглядеть действие вашего контроллера подразделения?

2. И это очень успокаивает, в отличие от большинства ночей сна для меня!

3. @LINQ2Vodka Я отвечаю на остальную часть вопроса, с которой я не знаком asp.net так что я не могу вам здесь помочь:-(

4. @TimCastelijns, все равно спасибо. Я буду ждать ответов .net. Голосование завершено.

Ответ №2:

 public class DivisionsController : ApiController
{
    [Route("/Divisions/{id}")]
    [HttpGet]
    public Division GetDivision(int id)
    {
        return // your code here
    }

    [Route("/Divisions/{id}/Dept")]
    [HttpGet]
    public IEnumerable<Department> GetDepartments(int id)
    {
        return // your code here
    }

    [Route("/Divisions/{id}/Dept/{deptId}")]
    [HttpGet]
    public Department GetDepartment(int id, int deptId)
    {
        return // your code here
    }
}
  

Или более кратким способом

 [RoutePrefix("/divisions/{id}")]
public class DivisionsController : ApiController
{
    [Route]
    [HttpGet]
    public Division GetDivision(int id)
    {
        return // your code here
    }

    [Route("Dept")]
    [HttpGet]
    public IEnumerable<Department> GetDepartments(int id)
    {
        return // your code here
    }

    [Route("Dept/{deptId}")]
    [HttpGet]
    public Department GetDepartment(int id, int deptId)
    {
        return // your code here
    }
}
  

Комментарии:

1. Спасибо, Visual Studio не проверяет орфографию 🙂

2. На самом деле вам не нужно вводить строку. Пустая вещь. Обновление