我有一些HTTPBuilder代码的行为有所不同,具体取决于我是否重用相同的HTTPBuilder对象来对同一个REST服务执行两个不同的请求:
def http = new HTTPBuilder( 'https://myBaseURI/' )
http.auth.basic username, password.getPlainText()
http.ignoreSSLIssues()
http.request(GET,JSON) { req ->
uri.path = 'some/api/path/'
headers.'User-Agent' = 'Mozilla/5.0'
} // this request always behaves as expected
http.request(POST, JSON) { req ->
uri.path = 'some/other/api/path'
headers.'User-Agent' = 'Mozilla/5.0'
body = {
// Request body elided for brevity
}
}
'正确'行为是POST返回201 - Created,但响应返回200 OK 除非我创建一个新的HTTPBuilder来处理发出第二个请求,在这种情况下,API调用按预期运行
当然,不同结果的原因可能在其他地方,但我首先想确保我没有滥用这个对象。重用HTTPBuilder发出多个HTTP请求时是否有问题需要注意?
答案 0 :(得分:0)
在GET请求中设置uri.path时,请尝试删除末尾的正斜杠。
查看setPath in URIBuilder的文档:
//Set the path component of this URI. The value may be absolute or relative to the current path. e.g.
def uri = new URIBuilder( 'http://localhost/p1/p2?a=1' )
uri.path = '/p3/p2'
assert uri.toString() == 'http://localhost/p3/p2?a=1'
uri.path = 'p2a'
assert uri.toString() == 'http://localhost/p3/p2a?a=1'
uri.path = '../p4'
assert uri.toString() == 'http://localhost/p4?a=1&b=2&c=3#frag'
我理解这意味着如果你在最后用斜杠设置一个httpbuilder对象的uri.path,你基本上已经更新了工作路径,所以任何后续相对路径更新到uri.path将导致串联路径。因此,该示例中的POST最终指向https://myBaseURI/some/api/path/some/other/api/path