Статьи

Чего не хватает в наших REST Services?

Читая отличную книгу RESTful Web Services, я кое-что обнаружил. Техника, используемая в Интернете с самого начала. Twitter и Facebook, кажется, используют это. Тем не менее, он отсутствовал в REST-сервисах, которые я разрабатывал, и, если предположить, большинство разработчиков REST тоже его не включают. Что такого ценного в интернете было бы бесполезно без него? Ответ гипермедиа .

Гипермедиа — это технический термин, используемый для описания того, как веб-страницы (ресурсы) связаны или связаны. Автор RESTful Web Services называет это связностью : как сервер направляет клиента из одного состояния приложения в другое, предоставляя ссылки. Хорошим примером хорошо подключенного приложения являетсяWikipedia . Это очень удобно, когда вы можете выбрать случайную страницу и просмотреть каждую запись в Википедии, даже не редактируя URL своего браузера. Выполнение поиска в Google является еще одним хорошим примером, поскольку было бы не очень полезно, если бы в результате поиска не было ссылок. Без этих ссылок клиент должен знать и создавать предопределенные правила для создания каждого URL, который он хочет посетить.

Так какое отношение ссылки на сайте имеют к REST Services? REST был создан на основе Интернета и только потому, что вы не возвращаете HTML, не означает, что вы не должны создавать отношения между вашими ресурсами. На самом деле, удивительно, насколько мощными могут быть ссылки в ваших ответах. Например, это предотвращает тесную связь между вашими клиентами и службами, поскольку клиентам не нужно создавать или даже знать точные URL-адреса, потому что службы предоставляют их.

Давайте использовать Twitter в качестве примера. Предположим, что ниже приведен URL-адрес для получения 20 самых последних твитов для моей учетной записи:

http://api.twitter.com/1/statuses/user_timeline.json?screen_name=jlorenzen

А вот сокращенный вымышленный ответ:

[
{
"text": "Finished watching Battlestar Galatica"
"id": "55947977415667712"
"url": "http://api.twitter.com/1/statuses/show/55947977415667712.json"
},
{
"text": "Started watching Battlestar Galatica"
"id": "45947977415667712"
"url": "http://api.twitter.com/1/statuses/show/45947977415667712.json"
}
]

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

Пример использования Джерси
Итак, как лучше всего включить ссылки в ваши REST-сервисы? Поскольку я использую
Джерси ежедневно, я продолжу и покажу пример того, как вставлять ссылки в ваши ответы с помощью Джерси. Скорее всего, любой REST-фреймворк будет предоставлять такие же функции.

Используя приведенный выше пример с твиттером, Служба пользовательского статуса со ссылками может выглядеть примерно так (используя groovy):

 

import javax.ws.rs.GET
import javax.ws.rs.Path
import javax.ws.rs.Produces
import javax.ws.rs.QueryParam
import javax.ws.rs.core.Context
import javax.ws.rs.core.UriInfo

import com.test.UserStatuses

@Path("/statuses")
class StatusesResource {

@Context
UriInfo uriInfo

@GET
@Path("/user_timeline")
@Produces(["application/json", "application/xml"])
def UserStatuses getUserTimeline(@QueryParam("screen_name")String screen_name) {
def statuses = getStatuses(screen_name)

statuses.each {
it.url = "${uriInfo.baseUri}statuses/show/$it.id"
}

return new UserStatuses(statuses: statuses)
}
}

В этом простом примере Джерси внедряет объект UriInfo, который мы используем для получения baseUri запроса. Это действительно так просто. Потенциальные проблемы Ну, для некоторых это может быть не так просто. Например, мы обнаружили проблему при использовании обратного прокси (apache httpd). В наших производственных средах мы обычно настраиваем apache на порту 80 для прокси-сервера JBoss локального хоста на порту 8080. К сожалению, в этой настройке UriInfo.getBaseUri () возвращает localhost: 8080, а не фактический исходный URL, используемый клиентом; что явно не хорошо. Теперь, если вы не используете обратный прокси-сервер, не беспокойтесь. Однако, если вы это сделаете или, возможно, потенциально в будущем, простое решение, по-видимому, состоит в том, чтобы установить для параметра модуля Proxy Apache ProxyPreserveHost значение On. Установка этого параметра на On и перезапуск Apache, похоже, решают проблему.



Плагин JSONView Firefox
После того, как вы начали встраивать URL-адреса в ответы REST, вам может быть полезно установить плагин JSONView Firefox. У него есть действительно приятные функции, такие как форматирование JSON и создание кликабельных ссылок для URL.

 

От http://jlorenzen.blogspot.com/2011/04/whats-missing-from-our-rest-services.html