我正在使用最新的grails(2.1.2)和rest-client-builder插件版本1.0.3。我试图将自定义请求标头值(比如SEC_USER)传递给目标服务器,该目标服务器使用此请求标头值预先验证请求。我使用以下代码传递值,但我没有得到接收端的标头值。
RestBuilder rest = new RestBuilder(connectTimeout:5000, readTimeout:20000);
rest.get("<some uri>") {
contentType MediaType.APPLICATION_JSON.toString()
header("SEC_USER", "foo")
}
查看RequestCustomizer时,header()方法应该在调用时设置HttpHeaders字段 headers [name] = value
这可能是此插件在内部使用的RestTemplate类(方法交换(...))中的问题吗?
答案 0 :(得分:4)
Grails使用动态方法增强控制器类:
header(Object instance, String headerName, Object headerValue)
根据您使用构建器的位置,可能会调用此代码,而不是实际将header()
块传递给构建器。当我将上面的代码放入控制器时,我看到了这种行为。解决此问题的一种方法是将闭包移到src/groovy
中的类中。例如,当我将调用代码更改为
def check() {
RestBuilder rest = new RestBuilder(connectTimeout:5000, readTimeout:20000);
rest.get("http://localhost:8080/so13789857/hello", Thing.getRestBuilderClosure())
}
关闭来自src/groovy/so/Thing.groovy
static Closure getRestBuilderClosure() {
return {
contentType MediaType.APPLICATION_JSON.toString()
header("SEC_USER", "foo")
}
}
它解决了这个问题。