URI OpenRasta и разъяснение привязки метода - RESTful webservice - PullRequest
0 голосов
/ 20 сентября 2011

Я использую Openrasta для своего веб-сервиса RESTful, и у меня есть небольшое сомнение относительно параметров метода и URI

Например: я следую настройке для пользовательского объекта.

Конфигурация:

 ResourceSpace.Has.ResourcesOfType<User>()
          .AtUri("/user")
          .And.AtUri("/user/{userId}")
          .HandledBy<UserHandler>()
          .AsJsonDataContract()
          .And.AsXmlDataContract();

Метод обработки для PUT:

public OperationResult Put(long userId, User user){}

URI для того же будет http://localhost/User/1

Тело запроса будет содержать JSON, как показано ниже:

{
  "userId":1,
  "userName":"FirstName"
}

Здесь мой вопрос: правильно ли определять метод PUT с двумя параметрами? Если это правильный способ, то параметр userId в методе PUT будет содержать то же значение, что и свойство объекта User UserId.

И в методе PUT мне нужно проверить, являются ли эти два значения одинаковыми или нет, и если они не одинаковы, я возвращаю BadRequest, заявляя, что URI не совпадает с сущностью, предоставленной в запросе. Почему мы должны делать это явно, почему бы не обработать его при обработке запроса, и чтобы метод PUT принимал в качестве параметра только сущность пользователя? Я что-то упускаю радикально или мое понимание этого дизайна совершенно неверно? Любые мысли или мнения, пожалуйста?

1 Ответ

1 голос
/ 20 сентября 2011

Для этого есть несколько причин.

Во-первых, это техническое ограничение того, как параметры URI обрабатываются и сопоставляются с входными данными по одной переменной за раз.То же самое применяется к кодекам ключ / значение, поэтому у вас должен быть один объект User.но когда вы используете кодек json, мы получаем полный объект, так что в итоге пользователь полностью переопределяет.

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

И последнее, что не менее важно, с точки зрения моделирования, API ReST должен использовать URI в качестве идентификаторов и ссылок вместо внешних ключей,поэтому, если у вас уже есть свой идентификатор (URI), есть небольшая причина, по которой он должен моделироваться в вашем теле сущности.

...