Groovy RestClient没有为Content-Type使用正确的响应处理程序:application / json?

时间:2015-04-14 16:36:54

标签: rest http groovy http-headers httpresponse

我正在使用Groovy的RestClient.java将一些纯文本发送到服务器,我得到的响应是JSON但是我有一些问题要弄清楚为什么将响应解析为{{3} } object而不是StringReader对象。

根据我的理解,应该根据响应头中的内容类型将响应体解析为一个对象,我得到的响应头是application/json,但它似乎是默认并解析响应进入StringReader对象。我不确定我是否错误地定义了我的标题或是否需要指定我自己的成功处理程序?我有其他方法使用POST方法并且工作正常,但是他们发布XML并期待响应中的XML,所以我认为标题在该实例中运行良好。

以下是我尝试它和我的日志的方式,因为您可以看到响应标头Content-Typeapplication/json所以我很困惑为什么restClientResponse.getData()是{{1} 1}}对象而不是StringReader对象

JsonSlurper

日志:

def restClient = new RESTClient("http://this.doesnt.matter", 'text/plain')

restClient.setProxy("someproxy", 8080, "http")
restClient.setHeaders(Accept: "application/json")

def restClientResponse = restClient.post(body: "requestPayload:ACCOUNTPROFILE")
log.info(restClientResponse.getData())
log.info("What is in StringReader")

//Printing out what is in StringReader Object
def reader = restClientResponse.getData()
StringBuilder builder = new StringBuilder()
char[] characters = new char[1000]
builder.append(characters, 0, reader.read(characters, 0, characters.length))
log.info(builder.toString())

// Printing out each header in the response
restClientResponse.getAllHeaders().each {
    log.info("HEADER: " + it.getName() + ":" + it.getValue())
}

return restClientResponse.getData()

关于为什么没有将响应主体解析为14 Apr 2015 17:25:04,561 uui.RestService java.io.StringReader@2a2e625 14 Apr 2015 17:25:04,562 uui.RestService What is in StringReader 14 Apr 2015 17:25:04,568 uui.RestService {"rbscResponse":{"errorMessage":"Unexpectederror","INSTALLATIONNUMBER":"","PRODUCTCOMMONNAME":"","errorCode":"30003","BTWSID":"","SERVICELINETYPE":"","CUSTOMERTYPE":"","RBSID":""}} 14 Apr 2015 17:25:04,590 uui.RestService HEADER: Date:Tue, 14 Apr 2015 16:28:20 GMT 14 Apr 2015 17:25:04,591 uui.RestService HEADER: Content-Type:application/json 14 Apr 2015 17:25:04,591 uui.RestService HEADER: X-Powered-By:Servlet/2.5 JSP/2.1 14 Apr 2015 17:25:04,591 uui.RestService HEADER: X-Cache:MISS from someproxy 14 Apr 2015 17:25:04,592 uui.RestService HEADER: X-Cache-Lookup:MISS from someproxy:8080 14 Apr 2015 17:25:04,592 uui.RestService HEADER: Via:1.0 someproxy (squid/3.1.10) 14 Apr 2015 17:25:04,593 uui.RestService HEADER: Connection:close 对象的任何想法?

1 个答案:

答案 0 :(得分:2)

解决方法是从RESTClient构造函数中删除Content-Type参数,并在post参数中指定requestContentType,如下所示:

def restClient = new RESTClient("http://this.doesnt.matter")
...
def restClientResponse = restClient.post(
    body:"requestPayload:ACCOUNTPROFILE",
    requestContentType: 'text/plain'
)

问题是我(缺乏)了解为RESTClient构造函数提供默认Content-Type的原因。我假设为RESTClient构造函数提供了内容类型text/plain,它会在请求标题中将内容类型设置为text/plain,然后从响应标头中的Content-Type,用于响应正文的解析器。但是,我认为通过为RESTClient提供text/plain参数,当它收到响应时,它会忽略响应头中的Content-Type并使用RESTClient构造函数中提供的Content-Type。

感谢@dmahapatro指出我的this问题,这导致我阅读文档的POST a status update to Twitter!部分