为多个请求重用Groovy HTTPBuilder对象是否安全?

时间:2014-12-15 20:55:42

标签: groovy httpbuilder

我有一些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请求时是否有问题需要注意?

1 个答案:

答案 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