在java代码中创建的 application/json 类型的请求 和 postman中的 application/json类型的请求有什么区别?

问题描述

问题是这样的,有一个controller接口,我使用java代码可以调通这个接口
但是用postman调用就不可以。可是我设置的参数都是一样的。下面是详细代码。

代码

  • controller里的接口:
    public String query(@RequestParam String name, HttpServletRequest request){
        System.out.println(name);
        return "hello";
    }
  • 使用java代码调用接口:
@Test
    public void query() throws Exception {
        String result = mockMvc.perform(
                get("/user")
                        .param("name", "sen")
                        .contentType("application/json"))
                        .andExpect(status().isOk())
                        .andReturn().getResponse().getContentAsString();

        System.out.println(result);
    }

根据我的开发经验,如果请求头里的contentType为**"application/json"**的话,后台controller参数要加**@RequestBody**注解,接口才能调通。但是,上面的java代码,controller里面没有@RequestBody这个注解,同样调通了接口。而我用postman调用的时候却失败了。

  • postman调用接口 图片说明

请求报文是这样的:

图片说明

但postman的这种方式调用后台接口直接失败了。然后我再postman中,使用form-data方式是可以调通接口的。

  • 问题重申

因此我就想问下,为啥java代码里面创建的 application/json 类型的请求为啥可以而postman中的 application/json类型请求为啥不行。。

  • 答案

卧槽,刚把问题写完我自己就想通原因了。但是打了这么多字,就写完吧。java代码里面的参数是拼接到url路径里的。所以可以调用。因此postman里面可以这样调用:

图片说明

这样也就通了。困扰我很久的问题,想通了。因此java代码里面,无论接口参数是键值对还是json数据,content-type设置成application/json就没错了。

https://blog.csdn.net/seapeak007/article/details/70320199

@RequestParam 注解实际上是从Request.getParameter()中读取值的,不会读取body里面的内容,@RequestBody 注解会读取body里面的内容.