Groovy HTTPBuilder是否可以对请求解析具有不同内容类型的响应?

Groovy HTTPBuilder是否可以对请求解析具有不同内容类型的响应?,groovy,content-type,httpbuilder,Groovy,Content Type,Httpbuilder,我们试图使用Groovy的HTTPBuilder的请求方法发送内容类型为application/x-www-form-urlencoded的POST请求,并解析来自服务器的响应,该服务器的内容类型为application/json 库忽略响应中的内容类型标题,并希望将其解析为application/x-www-form-urlencoded 我们的代码如下所示: import static groovyx.net.http.ContentType.URLENC import static gro

我们试图使用Groovy的HTTPBuilder的请求方法发送内容类型为
application/x-www-form-urlencoded
的POST请求,并解析来自服务器的响应,该服务器的内容类型为
application/json

库忽略响应中的
内容类型
标题,并希望将其解析为
application/x-www-form-urlencoded

我们的代码如下所示:

import static groovyx.net.http.ContentType.URLENC
import static groovyx.net.http.Method.POST
import groovyx.net.http.HTTPBuilder


def http = new HTTPBuilder('https://example.com')
def result = http.request(POST, URLENC) {
    uri.path = "/some/path"
    body = [
        someProperty: "someValue"
    ]
}
def http = new HTTPBuilder('https://example.com')
def result = http.request(POST) {
    requestContentType = URLENC
    uri.path = "/some/path"
    body = [
        someProperty: "someValue"
    ]
}
我可以从wire日志中看到,请求有一个
内容类型:application/x-www-form-urlencoded
头,响应有一个
内容类型:application/json
头,响应是格式良好的json,但HTTPBuilder的调试日志发出以下行:

DEBUG http.HTTPBuilder  - Parsing response as: application/x-www-form-urlencoded
实际上,解析响应就像它是x-www-urlencoded一样

我查看了HTTPBuilder的源代码,如果请求的内容类型不是
*/*
,它似乎希望忽略响应的内容类型

基于此,我们通过配置HTTPBuilder实例使其能够按预期工作,如下所示:

http.parser.'application/x-www-form-urlencoded' = http.parser.'application/json'

…但是更改x-www-form-urlencoded的解析器似乎像是拿撬棍去图书馆一样。有没有一种惯用的方法告诉HTTPBuilder对请求使用一种内容类型,并使用响应的内容类型头来解析结果?

回答我自己的问题

http.request的第二个参数告诉它显式使用该内容类型进行响应,我们可以得到我们想要的结果,如下所示:

import static groovyx.net.http.ContentType.URLENC
import static groovyx.net.http.Method.POST
import groovyx.net.http.HTTPBuilder


def http = new HTTPBuilder('https://example.com')
def result = http.request(POST, URLENC) {
    uri.path = "/some/path"
    body = [
        someProperty: "someValue"
    ]
}
def http = new HTTPBuilder('https://example.com')
def result = http.request(POST) {
    requestContentType = URLENC
    uri.path = "/some/path"
    body = [
        someProperty: "someValue"
    ]
}