Мы строим Java SDK, чтобы упростить доступ к одной из наших услуг, предоставляющих API REST. Этот SDK будет использоваться сторонними разработчиками.Как передать параметры запроса REST методу Java?
Одна из проблем заключалась в том, чтобы найти хороший способ представления необязательных параметров каждого запроса.
Допустим, мы имеем покоя конечной точки: GET /photos
, который имеет несколько необязательных параметров: sortBy
, pageSize
, pageNumber
и т.д.
Одно решение было бы принять Map<String,String>
в качестве параметра метода апи, который представляет, что вызов отдыха.
interface RestService {
public List<Photo> getPhotos(Map<String,String> parameters);
}
Есть несколько проблем с этим решением:
- Подпись метода дает разработчику никакой информации о названиях необязательных параметров, доступных для данного метода (а также допустимые значения). Ему нужно будет проконсультироваться с документацией REST api, и в идеале мы хотели бы избежать необходимости.
- Разработчик создаст несколько карт с параметрами методов, которые он вызовет, жестко кодируя имена и значения параметров во всем мире. Это означает, что если они когда-либо изменятся, это будет хлопот, чтобы исправить их.
Другим решением было бы использовать объект Options, который будет содержать информацию о дополнительных параметрах. Мы могли бы даже использовать шаблон строителя для создания этого объекта.
Это как метод подписи будет выглядеть следующим образом:
interface RestService {
public List<Photo> getPhotos(PhotosOptions options);
}
Разработчик теперь знает, какие доступны дополнительные параметры и могут легко построить PhotosOptions
так:
PhotosOptions options = PhotosOptions.builder().sortBy(DESC).pageSize(200).build();
List<Photo> photos = getPhotos(options);
Проблема заключается в том, что сервис, который мы пытаемся покрыть с помощью SDK, имеет огромный диапазон запросов, которые нам нужно реализовать, и почти все они имеют другой список опций, которые они позволяют. Это может привести к большому количеству классов параметров.
Какое здесь самое лучшее решение? Создайте объект Option (и его построитель) для каждой комбинации? Наследование здесь не совсем помогает, потому что у меня есть всевозможные комбинации параметров.
Не сейчас, если это поможет вам. Я написал этот https://github.com/spacifici/simple-rest-client, это клиентская библиотека REST, которая позволяет использовать службы REST, написав свой интерфейс (буквально java-интерфейс). Не стесняйтесь использовать его. – j0n0