Публикация данных JSON с помощью Groovy HTTPBuilder

Я нашел этот документ о том, как публиковать данные 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)

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


person Chris Laconsay    schedule 26.07.2011    source источник


Ответы (5)


Я взглянул на HttpBuilder.java:1131, и я m предполагая, что кодировщик типа содержимого, который он извлекает в этом методе, имеет значение 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}"
    }
}
person Rob Hruska    schedule 26.07.2011
comment
Спасибо за ответ, но все еще бесполезно :( java.lang.NullPointerExceptionat groovyx.net.http.HTTPBuilder$RequestConfigDelegate.setBody(HTTPBuilder.java:1147) Пробовали ли вы этот пример на своем компьютере? Он работает? А также , значение uri.path, должен ли это быть существующий путь? - person Chris Laconsay; 26.07.2011
comment
Похоже, вы продвинулись дальше; новый NPE — это когда он пытается найти подходящий обработчик ответа. Запрос, вероятно, завершился неудачно, поэтому вам понадобится обработчик ошибок. Я обновлю свой пример. - person Rob Hruska; 26.07.2011
comment
в значении uri.path должен быть существующий путь — если хост не существует, вы получите какую-то ошибку подключения. Если он существует, но ресурс, который вы отправляете POST, не существует, вы получите HTTP 404 или что-то в этом роде. - person Rob Hruska; 26.07.2011
comment
Ничего хорошего, я все еще получаю тот же NPE, используя пример, который вы предоставили. Я думаю, что исключение выбрасывается до достижения строки обработчика сбоя. - person Chris Laconsay; 27.07.2011
comment
Это сработало для меня. У меня был NPE at groovyx.net.http.HTTPBuilder$RequestConfigDelegate.setBody(HTTPBuilder.java:1200) и был исправлен добавлением requestContentType. Спасибо - person protoboolean; 08.01.2013
comment
Если вы запускаете файл groovy в автономном режиме. Не забудьте импортировать HTTPBuilder в groovy-файл @Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7.1') - person Arjang; 31.01.2017
comment
единственная проблема, если я пытаюсь опубликовать объект как json, он помещает пустую строку в пустые поля String, но мне действительно нужны нули - person dmitryvim; 17.03.2017

У меня была такая же проблема некоторое время назад, и я нашел блог, в котором отмечалось, что «requestContentType» должен быть установлен перед «телом». С тех пор я добавил комментарий «Установить 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}"
    }
}

Ваше здоровье!

person Community    schedule 26.04.2013
comment
единственная проблема, если я пытаюсь опубликовать объект как json, он помещает пустую строку в пустые поля String, но мне действительно нужны нули - person dmitryvim; 17.03.2017
comment
Привет, dmitryvim, Вы говорите об ответе JSON на POST-запрос? Или вы пытаетесь установить для строковых полей в теле JSON значение null? - person Robert; 31.05.2017

Если вам нужно выполнить POST с contentType JSON и передать сложные данные 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 -> }
}    
person Carlos André Oliveira    schedule 21.11.2013

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

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

person Michael D Johnson    schedule 02.10.2012

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

(Имейте в виду, что если вы используете 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
}
person perlyking    schedule 31.01.2012