Короче говоря, я хотел бы вернуть разные JSON с меньшим количеством атрибутов, когда запрос поступает с телефона, чем когда он приходит с настольного ПК.
Я хочу создать службу REST. Служба будет обслуживать данные на основе объектов JPA. Служба объявляется с помощью @Path.
В зависимости от заголовка User-Agent я хочу использовать более богатый JSON для рабочего стола, чем для мобильных устройств. Выбор выполняется сервером.
Есть ли лучший способ, чем построить второй сериализатор и использовать условие (если (request useragent) вызывать их (в каждом методе) и принудительно возвращать некоторую String вместо любого объекта (делая аннотацию @Produces не используемой).
спасибо
Вы можете использовать селектор ресурсов jax-rs, который будет использовать разные подресурсы в зависимости от строки user-agent.
@Path("api")
public UserResource getResourceByUserAgent() {
//the if statement will be more sophisticated obviously :-)
if(userAgent.contains("GT-I9505") {
return new HighEndUserResource();
} else {
return new LowEndUserResource();
}
}
interface UserResource {User doSomeProcessing()}
class HighEndUserResource implements UserResource {
@Path("process")
public User doSomeProcessing() {
//serve
}
}
class LowEndUserResource implements UserResource {
@Path("process")
public User doSomeProcessing() {
//serve content for low end
}
}
Вызывая ресурс "/api/process", ответ будет зависеть от userAgent. Вы также можете легко расширить решение для других устройств и, например, реализовать MiddleEndUserResource.
Вы можете прочитать дополнительную информацию о суб-ресурсах здесь:
Один из способов добавить PathParam или QueryParam в Путь, чтобы указать тип устройства в запросе, чтобы служба могла понять тип устройства, с которого выполняется запрос, и создать соответствующий JSON.
Пожалуйста, проверьте наиболее проголосовавший ответ "SO", чтобы узнать, является ли запрос мобильным или настольным, и добавьте параметр соответственно