#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. На самом деле вам не нужно вводить строку. Пустая вещь. Обновление