Groovy HTTPBuilder и Джексон - PullRequest
       28

Groovy HTTPBuilder и Джексон

1 голос
/ 05 ноября 2011

Могу ли я использовать Джексона вместо JSON-lib с HTTPBuilder Groovy при настройке тела по запросу?

Пример:

client.request(method){
      uri.path = path
      requestContentType = JSON

      body = customer

      response.success = { HttpResponseDecorator resp, JSONObject returnedUser ->

        customer = getMapper().readValue(returnedUser.content[0].toString(), Customer.class)
        return customer
      }
}

В этом примере я хорошо использую Джексона, когдаобработка ответа, но я считаю, что запрос использует JSON-lib.

Ответы [ 2 ]

6 голосов
/ 04 декабря 2012

Вместо ручной установки заголовков и вызова метода с неправильным ContentType, как предлагается в принятом ответе, было бы чище и проще переписать синтаксический анализатор для application/json.

def http = new HTTPBuilder()
http.parser.'application/json' = http.parser.'text/plain'

Это приведет к тому, что ответы JSON будут обрабатываться так же, как и простой текст. Обработчик простого текста дает вам InputReader вместе с HttpResponseDecorator. Чтобы использовать Джексона для привязки ответа к вашему классу, вам просто нужно использовать ObjectMapper:

http.request( GET, JSON ) {

    response.success = { resp, reader ->
        def mapper = new ObjectMapper()
        mapper.readValue( reader, Customer.class )
    }
}
1 голос
/ 05 ноября 2011

Да.Чтобы использовать другую библиотеку JSON для анализа входящего JSON в ответе, установите тип содержимого на ContentType.TEXT и установите заголовок Accept вручную, как в этом примере: http://groovy.codehaus.org/modules/http-builder/doc/contentTypes.html. Вы получите JSON в виде текста, который вызатем можно передать Джексону.

Чтобы установить кодированный JSON-вывод для запроса POST, просто задайте тело запроса в виде строки после того, как вы преобразовали его с помощью Джексона.Пример:

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.1' )

import groovyx.net.http.*

new HTTPBuilder('http://localhost:8080/').request(Method.POST) {
    uri.path = 'myurl'
    requestContentType = ContentType.JSON
    body = convertToJSONWithJackson(payload)

    response.success = { resp ->
        println "success!"
    }
}

Также обратите внимание, что при публикации необходимо установить requestContentType перед настройкой тела .

...