记录 Rest Assured 自己的 headers

Logging Rest Assured's own headers

我正在尝试访问由 Rest Assured 注入的 HTTP headers。 Spring 的 Mock MVC 让您可以通过 MvcResult 访问几乎所有内容,并且您可以使用此结果来记录您想要的关于请求和响应的几乎所有内容。我能看到如何做到这一点的唯一方法是在 RestAssured 中使用过滤器。但是,它给您有限的请求访问权限(您只获得 RequestSpecification)。我知道访问 HttpClient 添加的 headers 可能很棘手,但看起来您甚至无法访问 Rest Assured 本身添加的 headers 。例如,我看不到任何与 OAuth 相关的 headers,也看不到 content-type 或 content-length。唯一出现的 headers 是使用 .contentType(ContentType.XML)

手动添加的那些

还有其他方法可以访问那些 headers 吗?我不需要修改请求,我只希望能够记录所有请求以及由 Rest Assured 注入的 headers。

我发现可以使用 RestAssured 注册您自己的 HttpClientFactory

RestAssured.config().httpClient(
  HttpClientConfig.httpClientConfig().httpClientFactory(
    new CustomHttpClientFactory())

所以我创建了一个新工厂,returns 一个 HTTP 客户端,我向其中注入了一些请求和响应拦截器。

public class CustomHttpClientFactory extends HttpClientConfig.HttpClientFactory {
    @Override
    public HttpClient createHttpClient() {
        DefaultHttpClient client = new DefaultHttpClient();
        client.addRequestInterceptor((request, ctx) -> {
            // do what you will 
        });
        client.addResponseInterceptor((response, ctx) -> {
            // do what you will
        });
        return client;
    }
}

这使您几乎可以完全访问操作请求和响应。要记住的一件事是,如果您要从响应的实体中读取,您应该首先将其包装在 BufferedHttpEntity 中以使其可读:

if (response.getEntity() != null && !response.getEntity().isRepeatable()) {
    response.setEntity(new BufferedHttpEntity(response.getEntity()));
}

我 运行 遇到的另一个问题是在尝试查看 OAuth 相关信息时。使用 RestAssured 的 OAuth 功能时,它会在执行请求之前将自己的 OAuthSigner 拦截器添加到 HTTP 客户端。这意味着它将始终是最后一个被调用的拦截器,并且您可能已经注入的任何拦截器都将在请求被签名之前被调用。因为我现在真的不需要看签名,所以我没有进一步调查这个,我将它留作 reader 的练习。 ;)