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通讯就说到这里了,感谢阅读!

回到目录

你可能感兴趣的:(httpclient)