在spring mvc测试中访问请求体和请求头

Posted

技术标签:

【中文标题】在spring mvc测试中访问请求体和请求头【英文标题】:Access request body and request header in spring mvc test 【发布时间】:2018-02-18 15:37:18 【问题描述】:

我创建了一个 Spring Boot 应用程序,这就是我的控制器的样子。我正在使用邮递员在请求正文中发送 json 并在请求标头中发送一个字符串,然后进一步对 json 进行散列并将其与请求标头获取的字符串进行比较。问题是我不知道获取请求正文和请求标头以便使用 MockMvc 测试相应的 Controller 类。

控制器逻辑

@RestController
public class Comparison 

    @PostMapping(path = "/test")
    public boolean compareHash(@RequestBody String json, 
                               @RequestHeader(value = "code") String oldHashValue) 

        Hash hashObj = new Hash();
        String newHashValue = hashObj.sha512(json);
        return oldHashValue.equals(newHashValue);
    

测试逻辑

public class ComparisionTest 

    @Autowired
    private WebApplicationContext wac;

    private MockMvc mockMvc;

    @Before
    public void setup () 
        DefaultMockMvcBuilder builder = MockMvcBuilders.webAppContextSetup(this.wac);
        this.mockMvc = builder.build();
    

    @Test
    public void contextLoads() throws Exception 
         RecordedRequest recordedRequest = server.takeRequest();
    

请帮助我在上面的代码中从请求中检索正文和标头值并将散列(正文)等同于标头值

【问题讨论】:

【参考方案1】:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ApplicationTest 

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void test() 

        mockMvc.perform(post("<<url>>").content("<<jsonStrig>>").header("key","value"));
    


在你的情况下:

   @Autowired
    private MockMvc mockMvc;

    @Test
public void test() throws  Exception 

    String jsonString="\"country\": \"India\", \"currency\": \"INR\", \"president\": \"Ram Nath Kovind\"  ";
    mockMvc.perform(MockMvcRequestBuilders.post("/test").content(jsonString).header("code","12400f74dc4d8d69b713b1fe53f371c25a28a8c5fac2a91eea1f742ab4567c9c"));

输出:

JSON STRING "country": "India", "currency": "INR", "president": "Ram Nath Kovind"   header value 12400f74dc4d8d69b713b1fe53f371c25a28a8c5fac2a91eea1f742ab4567c9c

【讨论】:

这会将json字符串发送到req哈希函数以获取哈希值n然后将其与标头值进行比较 它将到达那里的控制器表单,您的函数应该处理它 我怀疑它是如何从 content() 中获取 json 字符串的,我是否需要在“key”中提及标题名称......请简要解释一下,因为我我对这件事很陌生 检查更新的答案。这将起作用 mockMvc.perform(MockMvcRequestBuilders.post("/test").content("hello").header("code","hello")); 请求正文中包含 JSON 字符串 "country": "India", "currency": "INR", "president": "Ram Nath Kovind" ,请求标头为 12400f74dc4d8d69b713b1fe53f371c25a28a8c5fac2a91eea1f742ab4567c9c 和关键是 pkg_hashcode ....这是作为邮递员的 POST 请求发送的 ....你能告诉我我需要用什么代替“代码”

以上是关于在spring mvc测试中访问请求体和请求头的主要内容,如果未能解决你的问题,请参考以下文章

springmvc 请求头和请求体 有啥用

如何在Spring MVC中基于http请求头启用json的动态漂亮打印?

HTTP请求行、请求头、请求体详解

如何在spring-mvc中根据域过滤请求

Http请求中Accept、Content-Type讲解以及在Spring MVC中的应用

如何使用 Spring MVC Test 对多部分 POST 请求进行单元测试?