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将向您显示该对象上的属性。