如何使用 Spring MockMVC 将 JSON 编码为请求参数

How to encode JSON as request parameter using Spring MockMVC

几个小时以来,我一直在尝试将 JSON 编码为我正在使用 Spring 的 MockMVC 编写的测试的请求参数,但没有成功。

我的测试看起来像

@Before
public void setUp() {       
    mockMvc = MockMvcBuilders.standaloneSetup(new TestController())
            .build();
}

@Test
public void shouldReturnJSONGeneratedByView() throws Exception {
    String sampleJson = "{\"key\":\"value\"}";

    String json = UriComponentsBuilder.newInstance()
    .path(sampleJson)
    .build().encode().toUriString();

    mockMvc.perform(MockMvcRequestBuilders.get("/Node?json="+json))
    .andExpect(status().isOk());
}

但是到达我的控制器的字符串仍然是编码的(“%7B%22key%22:%22value%22%7D”),因此不能反序列化为 JSON。

我缺少什么来Spring理解编码参数?

感谢您的帮助

我相信您的 JSON 被编码了两次,因此控制器收到一个仍然编码的字符串(仅解码一次后)。

JavaDoc for MockMvcRequestBuildersget 的第一个参数声明如下:

urlTemplate - a URL template; the resulting URL will be encoded

因此我认为您不需要自己对 JSON 进行编码,下面的方法应该可行:

mockMvc.perform(MockMvcRequestBuilders.get("/Node?json={json}", sampleJson))
.andExpect(status().isOk());