【问题标题】:Spring REST Docs: how to replace request parametersSpring REST Docs:如何替换请求参数
【发布时间】:2020-04-08 12:02:21
【问题描述】:

我们要替换请求参数。

在代码中,状态是活动的。我使用方法 maskStatus() 来屏蔽状态。

this.mockMvc
        .perform(RestDocumentationRequestBuilders.get("/helloworld")
                .accept(MediaType.APPLICATION_JSON)
                .param("status", "active"))
        .andExpect(status().isOk())
        .andDo(document("{class-name}/{method-name}",
                Preprocessors.preprocessRequest(Preprocessors.prettyPrint(), Preprocessors.removeHeaders("Accept"),
                        maskStatus()),
                RequestDocumentation.requestParameters(RequestDocumentation.parameterWithName("status").description("The status"))

        ));

在生成的 http-request.adoc 中,我们希望状态为“*status*”:

[source,http,options="nowrap"]
----
GET /missioncontrol/v1/helloworld?status=*status* HTTP/1.1
Host: localhost:8080
----

但实际结果是:

[source,http,options="nowrap"]
----
GET /missioncontrol/v1/helloworld?status=active&status=*status* HTTP/1.1
Host: localhost:8080

----

代码:

@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = Application.class)
public class TestControllerTest {

    @Rule
    public JUnitRestDocumentation restDocumentation = new JUnitRestDocumentation( "target/snippets");

    @Autowired
    private WebApplicationContext wac;

    @Autowired
    private FilterChainProxy springSecurityFilterChain;

    protected MockMvc mockMvc;


    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac)
                .apply(MockMvcRestDocumentation.documentationConfiguration(this.restDocumentation))     
                .addFilter(springSecurityFilterChain)
                .build();
    }

    @Test
    public void hellWorldTest() throws Exception {
        this.mockMvc
        .perform(RestDocumentationRequestBuilders.get("/helloworld")
                .accept(MediaType.APPLICATION_JSON)
                .param("status", "active"))
        .andExpect(status().isOk())
        .andDo(document("{class-name}/{method-name}",
                Preprocessors.preprocessRequest(Preprocessors.prettyPrint(), Preprocessors.removeHeaders("Accept"),
                        maskStatus()),
                RequestDocumentation.requestParameters(RequestDocumentation.parameterWithName("status").description("The status"))

        ));
    }

    private OperationPreprocessor maskStatus() {
        return new StatusMaskingPreprocessor();
    }

    private static class StatusMaskingPreprocessor implements OperationPreprocessor {

        @Override
        public OperationRequest preprocess(OperationRequest request) {
            Parameters parameters = new Parameters();
            parameters.set("status", "*status*");
            return new OperationRequestFactory().create(request.getUri(),
                    request.getMethod(), request.getContent(), request.getHeaders(),
                    parameters, request.getParts());
        }

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

    }

问题: 我们要替换状态。但它不起作用,它只是附加新的分配。为什么?

我尝试过的其他方法:

@Test
    public void hellWorldTest() throws Exception {
        this.mockMvc
        .perform(RestDocumentationRequestBuilders.get("/helloworld")
                .accept(MediaType.APPLICATION_JSON)
                .param("status", "active"))
        .andExpect(status().isOk())
        .andDo(document("{class-name}/{method-name}",
                Preprocessors.preprocessRequest(Preprocessors.prettyPrint(), Preprocessors.removeHeaders("Accept"),
                        Preprocessors.modifyParameters().remove("status").set("status", "*status*")),
                RequestDocumentation.requestParameters(RequestDocumentation.parameterWithName("status").description("The status"))

        ));
    }

结果仍然是“GET /helloworld?status=active&status=*status* HTTP/1.1”

有人知道如何替换请求参数吗?

提前致谢。

【问题讨论】:

    标签: spring-restdocs


    【解决方案1】:

    您正在发出GET 请求,因此status 将成为请求URI 的查询字符串的一部分。问题是预处理器(您的自定义实现和 REST Docs 的内置预处理器)正在修改参数,但没有对 URI 进行相应的更改。您可以通过更新 StatusMaskingPreprocessor 来修改 URI 以及参数来解决此问题。

    我已经打开了Spring REST Docs issue,看看我们是否可以以通用方式解决此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2017-01-08
      • 2014-08-02
      相关资源
      最近更新 更多