Другая проблема при попытке POST JSON для REST URL через HttpBuilder

Я прочитал эту и несколько других публикаций в SO и других местах о том, как отправить вызов Post через HttpBuilder с JSON в качестве содержимого данных. Моя проблема в том, что ни одно из этих решений не работает!

Моя проблема только немного отличается. У меня есть данные JSON в файле. Когда я пытаюсь отправить это в интерфейс REST с помощью curl:

curl -X POST -u "username:password" -d @/path/to/myFile.json http://localhost:8080/path/here --header "Content-Type:application/json"

все работает на отлично Вот где я нахожусь (некоторый дополнительный код там, читайте дальше):

def myFile = new File('/path/to/myFile.json')
if (!myFile.exists()) println "ERROR!  Do not have JSON file!"

def convertedText = myFile.text.replaceAll('\\{', '[')
convertedText = convertedText.replaceAll('\\}', ']') 

def jsonBldr = new JsonBuilder()
jsonBldr myFile.text

println jsonBldr.toString()

def myClient = new groovyx.net.http.HTTPBuilder('http://username:password@localhost:8080/my/path')
myClient.setHeaders(Accept: 'application/json')

results = myClient.request(POST, JSON) { req ->
    body = [ jsonBldr.toString() ]
    requestContentType = JSON
    response.success = { resp, reader ->
        println "SUCCESS! ${resp.statusLine}"
    }

    response.failure = { resp ->
        println "FAILURE! ${resp.properties}"
    }
}

Это приводит к закрытию "сбой" с этими данными:

statusLine:HTTP/1.1 400 Exception evaluating property 'id' for java.util.ArrayList, Reason: groovy.lang.MissingPropertyException: No such property: id for class: java.lang.String

FWIW, в моем JSON нет "id". Если я изменю строку "body" с "[ jsonBldr.toString() ]" на "[ convertText ]" - вот почему этот код находится там, я получаю ту же ошибку. Если я уберу скобки с тела, я получу сообщение об ошибке, в котором говорится, что тело не является данными для массива (как его Map).

Может ли кто-нибудь (гораздо лучше, чем я) сказать мне, что %%$#@ я делаю неправильно???

1 ответ

Решение

Вам нужен JsonSlurper вместо JsonBuilder. После чего реализация будет выглядеть так:

def myFile = new File('/path/to/myFile.json')
if (!myFile.exists()) println "ERROR!  Do not have JSON file!"

def bodyMap = new JsonSlurper().parseText(myFile.text)

def myClient = new groovyx.net.http.HTTPBuilder('http://username:password@localhost:8080/my/path')
modelClient.setHeaders(Accept: 'application/json')

results = myClient.request(POST, JSON) { req ->
    requestContentType = JSON
    body = bodyMap
    response.success = { resp, reader ->
        println "SUCCESS! ${resp.statusLine}"
    }

    response.failure = { resp ->
        println "FAILURE! ${resp.properties}"
    }
}

Однако мне не ясно, в чем разница myFile а также modelFile в вашем коде.

Другие вопросы по тегам