WebApi(二)-重新封裝返回結果


如果不想寫代碼直接使用nuget安裝筆者已經封裝好的就可以馬上實現(nuget搜索ZetaWebApi)選擇>=1.0.1版本-----不懂使用nuget的請查看筆者的nuget系列文章

 

如果習慣自己寫代碼請繼續往下看

先創建要返回的結果類型:

/// <summary>
    /// 返回類型
    /// </summary>
    public class ApiResultModel
    {
        private HttpStatusCode statusCode;

        private object data;

        private string errorMessage;

        private bool isSuccess;

        /// <summary>
        /// 狀態代碼
        /// </summary>
        public HttpStatusCode StatusCode
        {
            get { return statusCode; }
            set { statusCode = value; }
        }

        /// <summary>
        /// 返回的數據
        /// </summary>
        public object Data
        {
            get { return data; }
            set { data = value; }
        }

        /// <summary>
        /// 錯誤消息
        /// </summary>
        public string ErrorMessage
        {
            get { return errorMessage; }
            set { errorMessage = value; }
        }

        /// <summary>
        /// 是否成功
        /// </summary>
        public bool IsSuccess
        {
            get { return isSuccess; }
            set { isSuccess = value; }
        }
    }

然后創建重寫ActionFilterAttribute下的OnActionExecuted(執行action之后):

先建一個類名字隨意如:ApiResultAttribute繼承於System.Web.Http.Filters.ActionFilterAttribute詳細代碼如下:

以下代碼需注意要引用using System.Net.Http否則ReadAsAsync不能使用

 public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
    {
        public  override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {

            base.OnActionExecuted(actionExecutedContext);

            ApiResultModel result = new ApiResultModel();


            // 取得由 API 返回的狀態代碼
            result.StatusCode = actionExecutedContext.ActionContext.Response.StatusCode;

            // 取得由 API 返回的資料
            result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;

            //請求是否成功
            result.IsSuccess = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;

            //結果轉為自定義消息格式
            HttpResponseMessage httpResponseMessage = JsonHelper.toJson(result);

            // 重新封裝回傳格式
            actionExecutedContext.Response = httpResponseMessage;

            
        }
    }

上面的JsonHelper.toJson()是事先寫好的代碼如下:創建類JsonHelper

public static HttpResponseMessage toJson(Object obj)
        {
            String str;
            if (obj is String || obj is Char)//如果是字符串或字符直接返回
            {
                str = obj.ToString();
            }
            else//否則序列為json字串
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                str = serializer.Serialize(obj);
            }
            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
            return result;
        }

 

建完之后在WebApiConfig下注冊:

config.Filters.Add(new ApiResultAttribute());//重新包裝結果

完成以上步驟即可使用。

補充:

特殊情況不需要封裝返回結果,解決方法:

1創建一個自定義屬性

假設自定義類名為NoPackageResult繼承Attribute

public class NoPackageResult : Attribute
    {
       
    }

2,修改上面的ApiResultAttribute類里的OnActionExecuted方法

在方法里加一個判斷是否有屬性有的情況下就不做封裝的步驟

var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
            if (!noPackage.Any())
            {
                 //執行封裝
            }         

3在不需要封裝的接口上添加屬性NoPackageResult如下:

ApiResultAttribute類完整代碼:

public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnActionExecuted(actionExecutedContext);
            
            // 不包裹返回值
            var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
            if (!noPackage.Any())
            {
                //初始化返回結果
                ApiResultModel result = new ApiResultModel();
                if (actionExecutedContext.Exception != null)
                {
                    result.Code = "sys_error";
                    result.Success = false;
                    result.Message = actionExecutedContext.Exception.Message;
                }
                else
                {
                    // 取得由 API 返回的狀態代碼
                    result.Code = actionExecutedContext.ActionContext.Response.StatusCode.ToString();

                    var a = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>();
                    if (!a.IsFaulted)
                    {
                        // 取得由 API 返回的資料
                        result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
                    }

                    //請求是否成功
                    result.Success = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;
                }
                

                //結果轉為自定義消息格式
                HttpResponseMessage httpResponseMessage = CustomerHttpResponseMessage.toJson(result);

                // 重新封裝回傳格式
                actionExecutedContext.Response = httpResponseMessage;
            }

        }
    }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM