描述REST API的动态响应类型



i用于所有REST API的标准apiresponse对象接口。

public interface IAPIResponse
{
    IAPIError Error { get; set; }        
    IEnumerable<dynamic> Results { get; set; }
    void AddResult(string groupName, object data);
}

这是我如何使用标准apiresponse对象。

public async Task<IActionResult> Get()
{
        try
        {
           var response = new UsersGetResponse {
                   Users = await _someService.GetAll()};
            _apiResponse.AddResult("UsersGetResponse", response );
            return new ObjectResult(_apiResponse);
        }
        catch (Exception ex)
        {
            _apiResponse.Error = new APIError(ex.Message, 500);
            return new ObjectResult(_apiResponse);
        }            
}  

调用_someserice.getall((返回以下用户对象的列表。

public interface IUser
{
    string Id { get; set; }
    bool IsAdmin { get; }
    string Name { get; set; }
    string Email { get; set; }
}

这是父级usergetResponse

的属性
public class UsersGetResponse
{
     public IList<User> Users { get; set;}
}

这将产生以下JSON。

{
"error": null,    
"results": [
{
  "UsersGetResponse": {
    "Users": [
      {
        "id": 171161,
        "isAdmin" : true,
        "name": "Dave Smith",
        "email": "Dave.Smith@gmail.com"
      },
      {
        "id": 171162,
        "isAdmin" : false,
        "name": "Jane Doe",
        "email": "Jane.Doe@gmail.com"            
      }
    ]
  }
}
]
}

如果我使用类型的producedSeponSeType注释。

[ProducesResponseType(typeof(IAPIResponse), StatusCodes.Status200OK)]

我只在Swagger中获得以下示例JSON。

{
  "error": {
    "message": "string",
    "number": 0
  },    
  "results": [
  {}
  ]
}

我正在尝试查看是否有一种方法可以与API的消费者正确通信,我有一个具有动态结果的标准apiresponse对象,该对象具有特定的对象。

在不完全了解您要做的事情的范围的情况下,我将无法为您提供完整的解决方案。但是,有了您提供的信息,这就是您应该做的:

public sealed class APIResponse<T>
{
    IAPIError Error { get; set; }        
    T Results { get; set; }
}
public async Task<IActionResult> Get()
{
    var response = new ApiResponse<<IEnumerable<User>>>();
    try
    {
        var data = await _someService.GetAll();
        response.Result = data;
        return Ok(response);//returns 200 status code
    }
    catch (Exception ex)
    {
        response.Error = new APIError(ex.Message, 500);
        return BadRequrest(response);
    }            
}  

您可以这样注释:

[ProducesResponseType(typeof(APIResponse<IEnumerable<User>>), StatusCodes.Status200OK)]

希望这会有所帮助。

这是因为您使用的是动态类型。Swagger在该类型上没有识别任何"属性"。如果您使用混凝土类型或接口,Swagger将向您显示该对象上的属性。

最新更新