Публикация данных JSON с помощью Groovy HTTPBuilder - PullRequest
13 голосов
/ 26 июля 2011

Я нашел этот документ о том, как публиковать данные JSON с помощью HttpBuilder.Я новичок в этом, но это очень простой пример, которому легко следовать.Вот код, предполагающий, что я импортировал все необходимые зависимости.

def http = new HTTPBuilder( 'http://example.com/handler.php' )
http.request( POST, JSON ) { req ->
    body = [name:'bob', title:'construction worker']

     response.success = { resp, json ->
        // response handling here
    }
}

Теперь моя проблема в том, что я получаю исключение

java.lang.NullPointerException
    at groovyx.net.http.HTTPBuilder$RequestConfigDelegate.setBody(HTTPBuilder.java:1131)

Я что-то пропустил?Я буду очень признателен за любую помощь, которую вы можете сделать.

Ответы [ 5 ]

18 голосов
/ 26 июля 2011

Я посмотрел на HttpBuilder.java: 1131 , и я предполагаю, что кодировщик типа содержимого, который он получает в этом методе, имеет значение null.

Большинство примеров POST здесь устанавливают свойство requestContentType в компоновщике, которое выглядит так, как будто код использует этот кодер для получения. Попробуйте установить это так:

import groovyx.net.http.ContentType

http.request(POST) {
    uri.path = 'http://example.com/handler.php'
    body = [name: 'bob', title: 'construction worker']
    requestContentType = ContentType.JSON

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

    response.failure = { resp ->
        println "Request failed with status ${resp.status}"
    }
}
8 голосов
/ 26 апреля 2013

У меня была такая же проблема некоторое время назад, и я обнаружил блог, в котором отмечалось, что «requestContentType» должен быть установлен перед «body».С тех пор я добавил комментарий «Установить ConentType перед нулевым указателем тела или риска» в каждом из моих методов httpBuilder.

Вот изменение, которое я бы предложил для вашего кода:

import groovyx.net.http.ContentType

http.request(POST) {
    uri.path = 'http://example.com/handler.php'
    // Note: Set ConentType before body or risk null pointer.
    requestContentType = ContentType.JSON
    body = [name: 'bob', title: 'construction worker']

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

    response.failure = { resp ->
        println "Request failed with status ${resp.status}"
    }
}

Ура! * * 1006

2 голосов
/ 21 ноября 2013

Если вам нужно выполнить POST с JSON для contentType и передать сложные данные JSON, попробуйте преобразовать ваше тело вручную:

def attributes = [a:[b:[c:[]]], d:[]] //Complex structure
def http = new HTTPBuilder("your-url")
http.auth.basic('user', 'pass') // Optional
http.request (POST, ContentType.JSON) { req ->
  uri.path = path
  body = (attributes as JSON).toString()
  response.success = { resp, json -> }
  response.failure = { resp, json -> }
}    
1 голос
/ 02 октября 2012

Я нашел ответ в этом сообщении: POST с HTTPBuilder -> NullPointerException?

Это не принятый ответ, но он работал для меня. Возможно, вам придется установить тип содержимого, прежде чем указывать атрибут body. Мне кажется глупым, но это так. Вы также можете использовать синтаксис send contentType, [attrs], но я обнаружил, что его сложнее выполнить модульным тестом. Надеюсь, что это поможет (поздно, как это)!

0 голосов
/ 31 января 2012

Я отказался от HTTPBuilder в своем приложении Grails (по крайней мере для POST) и использовал предложенный метод *1002* здесь .

(Имейте в виду, что если вы используете прямойGroovy вне приложения Grails, методы де / кодирования JSON будут отличаться от приведенных ниже)

Просто замените тип контента на application/json в следующих строках sendHttps()

httpPost.setHeader("Content-Type", "text/xml")
...
reqEntity.setContentType("text/xml")

Вы также будете нести ответственность за упорядочение данных JSON

 import grails.converters.*

 def uploadContact(Contact contact){  
   def packet = [
      person : [
       first_name: contact.firstName,
       last_name: contact.lastName,
       email: contact.email,
       company_name: contact.company
      ]
   ] as JSON //encode as JSON
  def response = sendHttps(SOME_URL, packet.toString())
  def json = JSON.parse(response) //decode response 
  // do something with json
}
...