HTTPBuilder,以不正确的格式返回JSON

时间:2013-11-25 17:04:22

标签: json grails post httpbuilder

我使用以下格式返回数据构建了一个服务。

def responseData = [
'results': results,
'status': results ? "OK" : "Nothing present"
]

render(responseData as JSON)

输出看起来像这样,我根据Fiddler验证了输出

  

{ “结果”:[{ “类”: “com.companyName.srm.ods.territory.Apo”, “ID”:2 “apoId”: “5T9B0”}], “状态”:“行“}

这是一个简单的POST调用,带有一系列来自搜索的参数。

使用HTTPBuilder我得到了不同的结果

http.request(groovyx.net.http.Method.POST, groovyx.net.http.ContentType.URLENC) {req ->
        uri.path = restUrl
        body = requestData
        response.success = {resp, json ->
            println resp.statusLine.statusCode
            println resp.statusLine
            def slurper = new JsonSlurper()
            String s = json.toString()
            println s
            returnJson = slurper.parseText(s)
        }
        response."422" = {resp, json ->
            println ${resp.statusLine}
        }
        response.failure = {resp ->
            println ${resp.statusLine}
        }
    }
  

[ “结果”:[{ “类”: “com.companyName.srm.ods.territory.Apo”, “ID”:2 “apoId”: “5T9B0”}], “状态”:“行“:空]

这变成了一个映射对,其中键是JSON,值为null,这使得HTTPBuilder为什么会这样做感到困惑。

为了解析JSON,我必须进行以下附加编码     s = s.replace(':null]','')     s = s.replace('[','')

对于这种类型的实现,这似乎过于复杂。 我已经调试了,没有任何有趣的东西来自于此。 任何想法

1 个答案:

答案 0 :(得分:0)

我使用构建器0.7.1并以下一种方式获取json响应:

http.request(Method.POST, ContentType.TEXT) {
            uri.path = pathToService          
            headers.'User' = user
            headers.Accept = 'application/json'
            body  = requestBody  //here I post some json 

            response.success = { resp, reader ->

                //println reader.text;
                println "response status: ${resp.statusLine}"
                return = reader.text
            }

            response.failure = { resp, reader ->
                println "Request failed with status ${resp.status}"
                reader.responseData.results.each {
                println "  ${it.titleNoFormatting} : ${it.visibleUrl}"
                }
            }
        }