2017-04-20 27 views
0

我對所有REST API使用標準APIResponse對象接口。描述REST API的動態響應類型

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; } 
} 

這是父類UsersGetResponse

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

這將產生以下JSON的屬性。

{ 
"error": null,  
"results": [ 
{ 
    "UsersGetResponse": { 

    "Users": [ 
     { 
     "id": 171161, 
     "isAdmin" : true, 
     "name": "Dave Smith", 
     "email": "[email protected]" 
     }, 
     { 
     "id": 171162, 
     "isAdmin" : false, 
     "name": "Jane Doe", 
     "email": "[email protected]"    
     } 
    ] 
    } 
} 
] 
} 

如果我像這樣使用ProducedResponseType註釋。

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

我只在swagger中得到以下示例JSON。

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

我想看看是否有正確傳達給我的API的消費者,我有一個包含了像UsersGetResponse具體的對象的動態結果的標準APIResponse對象的方式。

回答

0

這是因爲您正在使用動態類型。 Swagger不會識別該類型的任何「屬性」。如果您使用具體類型或界面,Swagger會向您顯示該對象的屬性。

+0

感謝您花時間提供反饋。我意識到這是事業。我正在尋找解決方案。我甚至試圖讓APIResponse成爲一個通用的,但我得到了相同的結果。 – aaronR

0

如果您完全不瞭解您正在嘗試做什麼的範圍,我將無法爲您提供完整的解決方案。然而,您所提供的信息,這是你應該做的:

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)] 

希望這有助於。