简体   繁体   English

在 WEB Api 验证时重复代码

[英]Duplication of code when on WEB Api validation

I have some check for each method in WEB API on token from the header to match the record in database.我对来自标头的令牌上的 WEB API 中的每个方法进行了一些检查,以匹配数据库中的记录。 I need to use this validation for each WEB API method.我需要对每个 WEB API 方法使用此验证。 In that case for each method I need copy/paste the same piece of code.在那种情况下,对于每种方法,我都需要复制/粘贴同一段代码。 How to redesign the methods in order to avoid code duplication?如何重新设计方法以避免代码重复?

Below is an example of two methods that at the begging has the same piece of code.下面是两个方法的示例,它们在乞讨时具有相同的代码段。

[HttpPost]
[Route("QRCConnect")]
public async Task<IHttpActionResult> QRCConnect([Required]string userId, [Required]int eventId, [Required]int supplierId)
{
    try
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        var token = GetTokenFromHeader(Request.Headers);
        var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
        if (api == null)
        {
            return Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
        }

        if (api.IsExpired)
        {
            return Ok(GenerateErrorsModel(400, TokenExpiredMessage));
        }
        ...

[HttpGet]
[Route("GetBuyerInfo")]
public async Task<IHttpActionResult> GetBuyerInfo(string userId)
{
    try
    {
        var token = GetTokenFromHeader(Request.Headers);
        var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
        if (api == null)
        {
            return Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
        }

        if (api.IsExpired)
        {
            return Ok(GenerateErrorsModel(400, TokenExpiredMessage));
        }
        ...

You could create a Base Class for all your controllers and move the common code to it.您可以为所有控制器创建一个基类,并将通用代码移到其中。 For example,例如,

public class BaseController
{
     protected bool ValidateApiResult(ApiResult api,out IHttpActionResult result)
     {
         if(api == null)
         {
              result  = Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
              return false;
         }

         if (api.IsExpired)
         {
              result  = Ok(GenerateErrorsModel(400, TokenExpiredMessage));
              return false;
         }
         result = default;
         return true;
     } 
}

Now, in rest of the controllers, you could use现在,在其余的控制器中,您可以使用

var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
if(!base.ValidateApiResult(api,var out result))
{
   return result;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM