WebApi系列~實際項目中如何使用HttpClient向web api發異步Get和Post請求並且參數於具體實體類型


回到目錄

本講比較實際,在WEB端有一個Index和Create方法,用來從web api顯示實體列表數據和向api插入實體對象,這就是以往的網站,只不過是把數據持久化過程放到了web pai上面,它的優勢不用說,就是跨平台,跨語言,這其實是restFul的功功,一切通訊都變得那個簡易,清晰!你再也不用引用程序集了...

先看一下實體的具體效果

我們看到如圖,它們在取數據和插數據的時間,走的都是restful標准,都是通過web api實現的,當然,對於通訊來說,要求你的實體必須是可序列化的,這是正常的,而且對於EF來說,很容易辦這事,只要修改T4模版就可以搞定。

看一下具體web api代碼,采用unity實現的注入,后台BLL層使用了cache機制,可以實現EntLib和redis兩種方式進行持久化,可以通過配置文件實現切換,對於數據持久化方式,實現了ef和redis的動態切換

Api代碼

    /// <summary>
    /// 用戶業務接口
    /// </summary>
    public class UserController : ApiController
    {
        IUserService userService;

        public UserController()
        {
            userService = ServiceLocator.Instance.GetService<IUserService>();
        }
        // GET api/user
        public IEnumerable<WebManageUsers> Get()
        {
            return userService.GetWebManageUsers(new PageParameters(1, 10));
        }

        // GET api/user/5
        public WebManageUsers Get(int id)
        {
            return userService.GetWebManageUser(i => i.ManageUserID == id);
        }

        // POST api/user
        public void Post([FromBody]WebManageUsers value)
        {
            userService.InsertManageUsers(value);
        }

        // PUT api/user/5
        public void Put(int id, [FromBody]WebManageUsers value)
        {
            var entity = userService.GetWebManageUser(i => i.ManageUserID == id);
            if (entity != null)
            {
                entity = value.MapTo<WebManageUsers>();
                userService.ModifyManageUsers(entity);
            }
        }

        // DELETE api/user/5
        public void Delete(int id)
        {
            userService.DeleteManageUsers(new WebManageUsers { ManageUserID = id });
        }
    }

Client端代碼,使用HttpClient實現異步通訊

    public class HomeController : Controller
    {
        private HttpClient client = new HttpClient();
        private string url = "http://localhost:52824/api/user";
        private JsonMediaTypeFormatter formatter = System.Web.Http.GlobalConfiguration.Configuration.Formatters.Where(f =>
        {
            return f.SupportedMediaTypes.Any(v => v.MediaType.Equals("application/json", StringComparison.CurrentCultureIgnoreCase));
        }).FirstOrDefault() as JsonMediaTypeFormatter;

        public async Task<ActionResult> Index()
        {
            var data = await client.GetAsync(url);
            return View(data.Content.ReadAsAsync<IEnumerable<WebManageUsers>>());
        }

        public ActionResult Create()
        {
            return View();
        }
        [HttpPost]
        public async Task<ActionResult> Create(WebManageUsers entity)
        {
            entity.Password = string.Empty;
            entity.Status = 1;
            entity.CreateDate = DateTime.Now;
            entity.UpdateDate = DateTime.Now;
            entity.Description = string.Empty;
            entity.Operator = string.Empty;
            entity.RealName = string.Empty;
            entity.WebSystemID = 1;
            entity.DepartmentID = 1;
            var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
            using (var http = new HttpClient(handler))
            {
                var response = await http.PostAsync<WebManageUsers>(url, entity, formatter);
                return RedirectToAction("Index");
            }
        }
    }

我們通過上面的例子可以看到,在client端與api進行通訊時,使用了實體類型,並沒有進行JSON拼串,這是友好的,事實上,這個過程是.net為我們實現了,當然你要首先指定它的JSON持久化功能代碼,如圖

好了,對於基於實體的Web api通訊就說到這里了,感謝閱讀!

回到目錄


免責聲明!

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



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