Получение необработанной строки json или клиента Jackson Mapper из запроса httpbuilder-ng get
Я обновляю отличные скрипты с httpbuilder на httpbuilder-ng. Эти скрипты взаимодействуют с различными веб-сервисами для получения сообщений. Я пытаюсь разобрать ответы, предпочтительно используя Джексона в объекты. Однако я не могу получить сырой ответ json, как в httpbuilder, так как httpbuilder-ng автоматически разбирает lazymap во всех случаях.
Старая реализация, использующая httpbuilder, позволяла вам использовать метод body.text для получения необработанной строки json без ее разбора на lazymap. Затем он может быть использован с ObjectMapper в Джексоне для создания моих POJO. Однако httpbuilder-ng, похоже, не поддерживает это.
Я уже попробовал этот метод для получения необработанного json, но метод body.text, похоже, не работает в версии 1.03, которую я использую http://coffeaelectronica.com/blog/2016/httpbuilder-ng-demo.html.
Я также попытался добавить свои собственные кодировщики, чтобы переопределить создание JSON-объектов Groovy по умолчанию, но безуспешно. Предположительно это возможно, как подробно описано в вики https://http-builder-ng.github.io/http-builder-ng/asciidoc/html5/. Если у кого-то есть фрагмент кода того, как это сделать, это будет оценено!
Старый код httpbuilder:
def http = new HTTPBuilder("http://${proxy}.domain.ie")
http.request(GET, TEXT) {
uri.path = "/blah/plugins/blah/queues"
headers.Accept = 'application/json'
headers.'Cookie' = "token=${token}"
response.success = { resp, json ->
assert resp.status < 300
LOGGER.info("GET queues request succeeded, HTTP " + resp.status)
ObjectMapper objectMapper = new ObjectMapper()
queues = objectMapper.readValue(json, Queue[].class)
}
response.failure = { resp ->
assert resp.status >= 300
LOGGER.info("GET queues request failed, HTTP " + resp.status)
return null
}
}
новый код http-builder-ng:
def http = configure {
request.uri = "http://${proxy}.domain.ie"
request.headers["Accept"] = "application/json"
request.headers["Cookie"] = "token=${token}"
request.contentType = TEXT
}
return http.get {
request.uri.path = "/blah/plugins/blah/queues"
response.success { FromServer fs, Object body ->
return body.text // doesn't work
}
response.failure {
return null
}
}
Обновить
Нашел решение. Он должен был добавить пользовательский анализатор и закрытие, используя метод FromServer.inputstream.text.
def text = httpBuilder.get {
request.uri.path = '/blah/plugins/blah/queues'
response.parser('application/json') { ChainedHttpConfig cfg, FromServer fs ->
String text = fs.inputStream.text
}
}