首页 > 解决方案 > 在 Spring Rest Docs 中添加基本 url 的路径?

问题描述

我有以下配置与 Rest Docs 一起使用:

webTestClient = buildWebClient().mutate()
  .filter(documentationConfiguration(restDocumentation))
  .baseUrl("https://api.my-domain.com/")
  .build()

在我的情况下,我对我的服务使用路径前缀 -service/foo因为我使用 k8s 入口并且我的服务是在路径偏移上提供的。

有没有办法在不修改生产代码的情况下插入这样的前缀?

相关文档片段:

https://docs.spring.io/spring-restdocs/docs/current/reference/html5/#configuration-uris-webtestclient

标签: kotlinspring-webfluxspring-restdocs

解决方案


要记录另一个 URI 而不是生成文档所调用的 URI,您必须编写自己的OperationPreprocessor. 有一些预定义的类似Preprocessors.modifyUris,但它不允许修改请求路径。

检查下面的 webTestClient 配置和URIUpdaterOperationRequest类。代码在 GitHub 上可用:https ://github.com/Query-Interface/SO-Answers/blob/master/java/spring/rest-docs-modify-uripath/src/test/java/com/example/demo/ DemoApplicationTests.java

public void init() throws Exception {
    final URIUpdaterPreprocessor preprocessor = new URIUpdaterPreprocessor();
    webTestClient = webTestClient.mutate()
        .filter((documentationConfiguration(this.restDocumentation)
                .operationPreprocessors()
                    .withRequestDefaults(preprocessor)
                    .withResponseDefaults(prettyPrint()))
                )
        .build();
}

private static final class URIUpdaterPreprocessor
    implements OperationPreprocessor {

    @Override
    public OperationRequest preprocess(OperationRequest request) {
        return new URIUpdaterOperationRequest(request);
    }

    @Override
    public OperationResponse preprocess(OperationResponse response) {
        return response;
    }

}

private static final class URIUpdaterOperationRequest
    implements OperationRequest {

    private OperationRequest delegate;

    public URIUpdaterOperationRequest(OperationRequest request) {
        delegate = request;
    }

    public byte[] getContent() {
        return delegate.getContent();
    }

    public String getContentAsString() {
        return delegate.getContentAsString();
    }

    public HttpHeaders getHeaders() {
        return delegate.getHeaders();
    }

    public HttpMethod getMethod() {
        return delegate.getMethod();
    }

    public Parameters getParameters() {
        return delegate.getParameters();
    }

    public Collection<OperationRequestPart> getParts() {
        return delegate.getParts();
    }

    public URI getUri() {
        URI sourceUri = delegate.getUri();
        UriComponentsBuilder builder = UriComponentsBuilder.fromUri(sourceUri);
        return builder
            .host(sourceUri.getHost())
            .replacePath("/service/foo"+sourceUri.getPath())
            .build().toUri();
    }

    public Collection<RequestCookie> getCookies() {
        return delegate.getCookies();
    }
}

我认为另一种可能性是更新 mustache 模板,以便在所有请求路径引用之前添加前缀。默认模板位于 github 上


推荐阅读