当前位置: 首页 > 知识库问答 >
问题:

Spring boot : RestTemplate POST调用不返回创建的状态代码

齐磊
2023-03-14

我是新的Spring靴Rest模板。我正在尝试为rest模板post调用编写单元测试用例。我创建了一个用户控制器来发送虚拟数据。为POST调用编写的Usercontroller对于单元测试是否正确?如果不是,正确的写法是什么?我从usercontroller返回的响应是否正确?我应该返回状态码200还是201?有人能帮我吗?

下面是用户控制器

@PostMapping("/users")
    public User createUser(@RequestBody User user){
        List<String> messages = new ArrayList<>();
        messages.add("Hi");

        User createUser = new User();
        createUser.setId(1);
        createUser.setName("John");
        createUser.setAge(22);
        createUser.setMessages(messages);
        return user;
    }

下面 id 用于后期调用的单元测试用例:

@Test
    public void testSuccessPostUser() throws Exception{
        String baseUrl = "http://localhost:8080/users";
        List<String> messages = new ArrayList<>();
        messages.add("Hi");

        User user = new User();
        user.setId(1);
        user.setName("John");
        user.setAge(22);
        user.setMessages(messages);

        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

        HttpEntity<User> httpEntity = new HttpEntity<>(user, httpHeaders);

        HttpHandler httpHandler = new HttpHandler();
        ResponseEntity<User>  actual = httpHandler.sendPost(baseUrl, httpHeaders, user, User.class);

        //verify request succeed
        assertEquals(HttpStatus.CREATED, actual.getStatusCode());
        assertEquals(201, actual.getStatusCodeValue());
        assertTrue(responseBody.contains(id);
    }

共有3个答案

方茂
2023-03-14

首先,对于测试HTTP控制器,您可以使用MockMvc

示例测试:

mockMvc.perform(post("/users")
       .contentType(MediaType.APPLICATION_JSON)
       .content("{ "id": 1, "Name": "John", "Age": 22 }") 
       .accept(MediaType.APPLICATION_JSON))
       .andExpect(status().isCreated())
       .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
       .andExpect(jsonPath("$.id").value($id)) 
       .andExpect(jsonPath("$.value").value("some-value"));

文档中的更多详细信息

要返回201代码,您需要在您的控制器中添加@响应状态(HttpStatus.CREATED)

澹台承
2023-03-14

如果要返回自定义状态代码,则应返回repponseEntity

@PostMapping("/users")
public ResposneEntity<User> createUser(@RequestBody User user){
    ...
    return new ResponseEntity(user, HttpStatus.CREATED);
}

如果您想知道POST方法的正确https状态,我建议您阅读以下内容:如果POST成功但没有创建任何新内容,我们应该返回什么状态代码?

皮弘博
2023-03-14

POST默认返回200。

如果您想让它返回201,请添加以下内容:

@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/users")
public User createUser(@RequestBody User user){
 类似资料:
  • 我正在尝试使用BitBucket GIT存储库设置Jenkins,但Jenkins控制台总是给我以下错误代码: 我尝试过很多不同的方法,但总是失败。我的服务器上允许9418端口上的通信量。服务器处于1 Gbps连接上。

  • 问题内容: 在服务器端,我只是将json-as-dictionary打印到控制台 现在,每当我通过ajax发出发布请求时,控制台都会打印出包含我所需内容的字典。 在客户端,我一直在尝试使用各种方法来基于成功的ajax调用执行一些jquery。我只是意识到这可能是服务器端的错误,即我没有发送任何请求标头来告诉jquery其ajax调用成功。 那么,如何将OK状态发送回给客户以告诉一切一切正常? 为了

  • 在我的应用程序中,用户可以将电影标题添加到他们的观看列表中。在我的组件中,我有以下功能: 这目前有一些虚拟信息。 在我的服务中,我有: 所以我将电影对象和令牌传递给后端。 在我的电影ontroller.java我有: 以及movieService中的createMovie功能: 这一切都很好,但我想在电影成功添加到列表(数据库)时向angular应用程序返回一条消息。我想我应该使用@Respons

  • 我在TYPO3 v10中为我的robots.txt使用静态文本路由(默认为. htaccess文件)。文本按预期传递,但标头中的StatusCode为404。我不知道如何解决这个问题,因为静态文本路由中没有设置状态代码的选项。 这是我的路线代码(如文档中所述:https://docs.typo3.org/m/typo3/reference-coreapi/10.4/en-us/ApiOvervie

  • 问题内容: 我们正在使用Flask作为我们的API之一,我只是想知道是否有人知道如何返回HTTP响应201? 对于诸如404之类的错误,我们可以致电: 但是对于201我得到 LookupError:201都不例外 我是否需要创建自己的例外,像这样的文档? 问题答案: 你可以在这里阅读。

  • 我使用curl获取http头以查找http状态代码并返回响应。我使用以下命令获取http头