1

我正在使用最新的 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 类(方法交换(...))中的问题吗?

4

1 回答 1

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")
    }
}

它解决了这个问题。

于 2012-12-13T05:20:20.317 回答