2

データコンテンツとして JSON を使用して HttpBuilder を介して Post 呼び出しを送信する方法について、これと SO および他の場所に関する他のいくつかの投稿を読みました。私の問題は、これらのソリューションがどれも機能していないことです!

私の問題はわずかに異なります。 ファイルに既存の JSON データがあります。 これをcurlでRESTインターフェースに送信しようとすると:

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」はありません。「ボディ」行を「[ jsonBldr.toString() ]」から「[ ConvertText ]」に変更すると、そのコードがそこにある理由であり、同じエラーが発生します。本体の括弧を外すと、本体が配列のデータではないというエラーが表示されます (マップとして)。

誰でも (私よりもはるかにグルーヴィーな) %%$#@ が間違っていることを教えてもらえますか?

4

1 に答える 1

4

JsonBuilderの代わりに JsonSlurperが必要です。その後、実装は次のようになります。

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

于 2013-08-08T04:18:35.257 に答える