Сочетание GET и POST в Синатре (Рубин) - PullRequest
0 голосов
/ 10 сентября 2011

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

Один из способов сделать это - отправить все это с помощью GET следующим образом: http://myapi.heroku.com/getNearbyPlaces?lon=12.343523&lat=56.123533&radius=30&username=john&password=blabla123

но, очевидно, это худший из возможных способов сделать это.

Можно ли вместо этого переместить поля имени пользователя и пароля и встроить их в качестве переменных POST по SSL, чтобы URL выглядел только каквот так: https://myapi.heroku.com/getNearbyPlaces?lon=12.343523&lat=56.123533&radius=30

и учетные данные будут отправлены в зашифрованном виде.

Как бы я тогда в Синатре и Руби правильно получал переменные GET и POST?Это правильный способ сделать это?Если нет, то почему?

Ответы [ 3 ]

2 голосов
/ 10 сентября 2011

Если вы действительно пытаетесь создать спокойный API вместо этого, если некоторые конечные точки URL-адресов, которые говорят на каком-то HTTP-диалекте, вам следует придерживаться GET. Это даже снова на вашем пути, так что вы, кажется, уверены, что это получится.

Вместо того, чтобы пытаться скрыть имя пользователя и пароль в параметрах GET или POST, вместо этого следует использовать Обычная аутентификация , которая была изобретена специально для этой цели и универсально доступна для клиентов (и доступно с использованием удобных методов в Синатре).

Кроме того, если вы пытаетесь использовать REST, вам следует принять концепцию ресурсов и коллекций ресурсов (что подразумевается под R и E REST). Таким образом, у вас есть один URL, например, http://myapi.heroku.com/NearbyPlaces. Если вы GET там, вы собираете информацию об этом ресурсе, если вы POST, вы создаете новый ресурс, если вы PUT обновляете существующий ресурс, и если вы DELETE, вы удаляете его. То, что вы должны сделать прежде, это структурировать ваше объектное пространство в эти ресурсы и спроектировать ваш API вокруг него.

Возможно, вы могли бы иметь коллекцию ресурсов на http://myapi.heroku.com/places. Каждое место в качестве ресурса имеет уникальный URL-адрес, такой как http://myapi.heroku.com/places/123. Новые поляки могут быть созданы с помощью POST ing до http://myapi.heroku.com/places., а соседние места могут быть собраны с помощью GET ing http://myapi.heroku.com/places/nearby?lon=12.343523&lat=56.123533&radius=30. Если вызов может вернуть массив или URL-адреса в близлежащие места, например,

[
    "http://myapi.heroku.com/places/123",
    "http://myapi.heroku.com/places/17",
    "http://myapi.heroku.com/places/42"
]

Если вы хотите быть действительно доступным для обнаружения, вы можете также принять HATEOAS , который ограничивает возможности REST для того, чтобы позволить клиентам API «просматривать» API, как это сделал бы пользователь с браузером. Чтобы разрешить это, вы используете в своем API гиперссылку, которая указывает на другие ресурсы, как в примере выше.

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

Я предлагаю использовать обычную или дайджест-аутентификацию и простой запрос GET. Другими словами, ваш запрос должен быть «GET / place? Lat = x & lon = x & radius = x», и вы должны позволить HTTP обрабатывать аутентификацию. Если я правильно понимаю вашу ситуацию, это идеальный подход и, безусловно, будет самым НАСТОЯЩИМ решением.

Кроме того, ваш URI может быть улучшен. Наличие глаголов («get») и прилагательных, похожих на запрос («рядом») в именах ваших ресурсов не совсем подходит. В общем, ресурсы должны быть существительными (т. Е. «Места», «человек», «книги»). Смотрите пример запроса, который я написал выше; «get» избыточен, потому что вы используете GET-запрос, а «поблизости» избыточен, потому что вы уже запрашиваете местоположение.

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

Параметры, которые являются частью URL (а именно lon, lat и radius), называются параметрами запроса, а информация о пользователе и пароле, которую вы хотите отправить в форму, называется параметрами формы.В Sinatra оба этих типа параметров доступны в хеше params контроллера.

Так что в Sinatra вы сможете получить доступ к параметру lon как params[:lon] и userпараметр как params[:user].

...