Класс HTTPBuilder предоставляет API для создания HTTP-запросов и анализа ответов и основывается на классе Apache AbstractHttpClient . Класс HTTPBuilder может быть создан с помощью URI, который будет использоваться по умолчанию для всех методов запроса. Тип контента по умолчанию также может быть предоставлен, но для этого примера это будет экземпляр по умолчаниюContentType.ANY .
Приведенный ниже метод принимает POJO AccountFilter, создает объект JSONBuilder и создает экземпляр HTTPBuilder с URI по умолчанию. Затем он делает запрос с указанием метода (POST) и contentType (JSON). Тело запроса будет преобразовано в строку формы в кодировке URL. Код также показывает, как можно установить заголовки, в этом случае X-Application и X-Authentication с использованием переменных экземпляра.
ПРИМЕЧАНИЕ: запрос извлекает данные, а не создает или обновляет данные, поэтому обычно это GET, но критерии могут быть сложными и вложенными, и, следовательно, его необходимо отправлять в виде JSON в теле запроса, следовательно, с использованием POST. (В интернете целая дискуссия о GET-запросах, содержащих тело запроса.)
Set<Customer> listCustomers(AccountFilter accountFilter) {
def resultList = new ArrayList<Customer>()
def builder = new JsonBuilder(accountFilter)
def http = new HTTPBuilder( 'https://beta-api.city81.com/json-rpc' )
// POST request
http.request (POST, JSON){req->
body = [
"jsonrpc" : "2.0",
"method" : "Bank/v1.0/listCustomers",
"params" : builder.toString(),
"id" : 1
]
headers.'X-Application' = this.applicationKey
headers.'X-Authentication' = this.sessionToken
// success response handler
response.success = { resp, json ->
json.result.each {
resultList.add(new Customer(
it.customer.id, it.customer.name))
}
}
// failure response handler
response.failure = { resp ->
println "Unexpected error: ${resp.statusLine.statusCode}"
println ${resp.statusLine.reasonPhrase}
}
}
return resultList
}
Обработчик успешного ответа будет перебирать набор результатов JSON и создавать объекты Customer, добавляя их в коллекцию. Обработчик ответа на ошибку выведет код состояния и фразу причины сбоя запроса POST.
Как упоминалось выше, код использует JSONBuilder, чтобы превратить POJO в JSON. Для фильтра POJO с установленным полем accountIds JSON будет выглядеть следующим образом:
«params»: {«filter»: {«accountIds»: [1]}}
В этом есть недостаток, заключающийся в том, что если атрибут фильтра MarketFilter не установлен, то тег Filter не будет присутствовать в JSON. Если служба, к которой вы делаете POST, требует, чтобы это было обязательным (хотя и пустым), тогда строка req body params будет выглядеть так:
«params»: [filter: [:]],
который будет генерировать JSON:
«param»: {«filter»: {}}
Этот пост охватывает только небольшую часть HTTPBuilder и один из нескольких способов POST-запроса, генерации JSON и анализа его ответа, многие из которых были упрощены с помощью RESTClient учебный класс.
POJOS используется в приведенном выше примере:
public class Customer {
private String id;
private String name;
public Customer(String id, String name) {
this.id = id;
this.name = name;
}
// ... getters and setters
}
public class AccountFilter {
private Filter filter;
public AccountFilter(Filter filter) {
this.filter = filter;
}
// ... getters and setters
}
public class Filter {
private Set<String> accountIds;
// ... getters and setters
}