首页 > 解决方案 > 发送不正确的 json 文档的错误

问题描述

我正在测试 example-crud 以在我的项目中应用您的框架。但我注意到了一些错误。我尝试通过这种方式从发送的 json 中获取值到 std::string 中: std::string test = userDto->userName->c_str();

ENDPOINT("POST", "users", createUser,  BODY_DTO(Object<UserDto>, userDto))
{
       std::string test = userDto->userName->c_str();

       return createDtoResponse(Status::CODE_200, m_userService.createUser(userDto));
}

UserDto 定义如下:

class UserDto : public oatpp::DTO {
    DTO_INIT(UserDto, DTO)
    DTO_FIELD(Int32, id);
    DTO_FIELD(String, userName, "username");
};

如果我通过后查询发送正确的 json,我会正确地获得“测试”变量的值。

{
  "id": 0,
  "username": "test_user"
}

但是,如果我将 json 的字段“用户名”更改为,例如,“用户名”并将此 json 发送到端点,服务器将失败并出现错误“分段错误”。

在这种情况下,服务器一定不能失败。它必须给发件人错误信息,并继续运行。

如果我只想获得一个简单的变量值,我该如何避免失败?

标签: c++jsonsegmentation-faultstdoat++

解决方案


由于 DTO 字段名称和 JSON-key 不匹配,userName因此接收到的 DTO 为null. 所以解决方案是添加一个nullptr检查:

ENDPOINT("POST", "users", createUser,  
         BODY_DTO(Object<UserDto>, userDto)) 
{
  OATPP_ASSERT_HTTP(userDto->userName, Status::CODE_400, "username is required!"); // check field for nullptr
  std::string test = userDto->userName->std_str();
  ...
  return createDtoResponse(Status::CODE_200, m_userService.createUser(userDto));
}

来源: https ://github.com/oatpp/oatpp/issues/340#issuecomment-727563144


推荐阅读