• ASP.NET Web API 实例


    ASP.NET Web API 入门大杂烩

    创建Web API解决方案,命名为VCoinWebApi,并且创建了同名的Project,然后,创建一个Empty Project:Models,创建一个WPF Application Project:VCoinWebTester

    在Models项目下,添加User类。User类的代码如下:

    namespace Models
    {
        public class User
        {
            public long ID { get; set; }
            public string UserName { get; set; }
            public Platform Platform { get; set; }
            public string Status { get; set; }
        }
    
        public enum Platform
        {
            Facebook,
            Youtube
        }
    }

    在VCoinWebApi项目下的Controllers文件夹上右键添加Web API 2 Controller - Empty。新建的UsersController代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    
    using Models;
    using Newtonsoft.Json.Linq;
    
    namespace VCoinWebApi.Controllers
    {
        public class UsersController : ApiController
        {
            List<User> users = new List<User>
            { 
                new User { ID = 1, UserName = "Soup1", Platform = Platform.Facebook, Status = "User" },
                new User { ID = 2, UserName = "Soup2", Platform = Platform.Facebook, Status = "User" },
                new User { ID = 3, UserName = "Soup3", Platform = Platform.Facebook, Status = "User" }, 
                new User { ID = 4, UserName = "Soup4", Platform = Platform.Facebook, Status = "User" }, 
            };
    
            public IEnumerable<User> GetAllUsers()
            {
                return users;
            }
    
            public User GetUserById(short id)
            {
                var user = users.FirstOrDefault((p) => p.ID == id);
                if (user == null)
                {
                    throw new HttpResponseException(HttpStatusCode.NotFound);
                }
                else
                {
                    return user;
                }
            }
    
            [HttpGet]
            [ActionName("GetUser")]
            public IEnumerable<User> GetUsersByName(string userName)
            {
                return users.Where(
                    (p) => string.Equals(p.UserName, userName,
                        StringComparison.OrdinalIgnoreCase));
            }
    
            [HttpPost]
            [ActionName("AddUser")]
            public User Add([FromBody]long id, string userName,int platform,string status)
            {
                User user = new User { ID = id, UserName = userName, Platform = (Platform)platform, Status = status };
                if (user == null)
                {
                    throw new HttpRequestException();
                }
                users.Add(user);
                return user;
            }
    
            [HttpPost]
            [ActionName("AddUser")]
            public User AddUser([FromBody]User user)
            {
                if (user == null)
                {
                    throw new HttpRequestException();
                }
                users.Add(user);
                return user;
            }
    
            [HttpPost]
            public User Delete([FromBody]int id)
            {
                var user = users.FirstOrDefault((p) => p.ID == id);
                if (user == null)
                {
                    throw new HttpResponseException(HttpStatusCode.NotFound);
                }
                else
                {
                    users.Remove(user);
                    return user;
                }
            }
    
            [HttpPost]
            [ActionName("Update")]
            public HttpResponseMessage UpdateUser([FromUri]int id,[FromBody]User user)//{"ID":1,"UserName":"Hello","Platform":1,"Status":"User"}
            {
                return Request.CreateResponse(HttpStatusCode.OK, user);
            }
    
            //[HttpPost]
            //[ActionName("Update")]
            //public HttpResponseMessage UpdateUser(JObject jo)//{"ID":1,"UserName":"Hello","Platform":1,"Status":"User"}
            //{
            //    User user = new User();
            //    user.ID = 1;
            //    user.Platform = Platform.Youtube;
            //    user.Status = "User";
            //    user.UserName = "Hello";
    
            //    return Request.CreateResponse(HttpStatusCode.OK, user);
            //}
    
            //[HttpPost]
            //[ActionName("Update")]
            //public void UpdateUser(JObject jo)//不返回值
            //{
               
            //}
    
            //[HttpPost]
            //[ActionName("Update")]
            //public bool UpdateUser(JObject jo)//返回:true
            //{
            //    return true;
            //}
        }
    }

    修改App_Start文件夹下的WebApiConfig.cs文件的默认的路由规则,如下:

    public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{action}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
    
                config.EnableSystemDiagnosticsTracing();
            }
        }

    在VCoinWebTester项目下添加WebApiRequest.cs类,类的主要的两个方法如下:

         /// <summary>
            /// Post data to server
            /// </summary>
            /// <param name="postData"></param>
            /// <param name="builderPath"></param>
            /// <param name="timeout">in millionseconds</param>
            /// <returns></returns>
            public static string PostRequest(string postData, string builderPath, int timeout)
            {
                System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
                byte[] data = encoding.GetBytes(postData);
    
                UriBuilder builder = CreateUriBuilder();
                builder.Path = builderPath;
                Uri requestUri = builder.Uri;
    
                // Prepare web request...
                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(requestUri);
                ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
                myRequest.Method = "POST";
                //myRequest.ContentType = "application/x-www-form-urlencoded";
                myRequest.ContentType = "application/json; charset=utf-8";
                myRequest.ContentLength = data.Length;
                myRequest.CookieContainer = Cookie;
                myRequest.Timeout = timeout;
    
                string content = string.Empty;
    
                try
                {
                    using (Stream newStream = myRequest.GetRequestStream())
                    {
                        newStream.Write(data, 0, data.Length);// Send the data.
                    }
                    using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse())
                    {
                        StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                        content = reader.ReadToEnd();// Get response
                    }
                }
                catch (WebException webEx)
                {
                    System.Diagnostics.Debug.WriteLine(webEx.ToString());
                    //throw;
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.ToString());
                    //throw;
                }
                return content;
            }
    
    
         public static string GetRequest(string path, string query)
            {
                UriBuilder builder = CreateUriBuilder();
                builder.Path = path;
                builder.Query = query;
    
                Uri requestUri = builder.Uri;
    
                HttpWebRequest request = null;
                HttpWebResponse response = null;
    
                string ret = string.Empty;
                try
                {
                    request = (HttpWebRequest)WebRequest.Create(requestUri);
                    ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
    
                    request.CookieContainer = Cookie;
    
                    response = request.GetResponse() as HttpWebResponse;
    
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(stream))
                        {
                            ret = reader.ReadToEnd();
                        }
                    }
                }
                catch (WebException webEx)
                {
                    ret = webEx.Message;
                    //throw;
                }
                catch (Exception ex)
                {
                    ret = ex.Message;
                    //throw;
                }
                finally
                {
                    if (response != null)
                    {
                        response.Close();
                    }
                }
                return ret;
            }

    做完这些。就可以在MainWindow里面愉快地调用WebAPI了。

            private void Button_AddUser_Click(object sender, RoutedEventArgs e)
            {
                User user = new User();
                user.ID = 4;
                user.Platform = Platform.Youtube;
                user.Status = "User";
                user.UserName = "Hello";
    
                //      myRequest.ContentType = @"application/json; charset=utf-8";//可以发送json字符串作为参数
                //      在Web API端,对应的方法是 AddUser([FromBody]User user)
                //      客户端发送一个对象的Json序列化字符串,在API端可以自动反序列化为具体对象
                string userJsonString = JsonConvert.SerializeObject(user);
    
                //      myRequest.ContentType = "application/x-www-form-urlencoded";//只能发送&&&&&
                //      在Web API端,对应的方法是Add([FromBody]long id, string userName,int platform,string status)
                StringBuilder sb = new StringBuilder();
                sb.Append(string.Format("id={0}", user.ID));
                sb.Append(string.Format("&platform={0}", 0));
                sb.Append(string.Format("&status={0}", user.Status));
                sb.Append(string.Format("&userName={0}", user.UserName));
    
    
                //      在API端的Add方法里面已经用ActionName注解属性强制指明了动作名称为AddUser
                string path = "api/users/AddUser";
    
                //      myRequest.ContentType = @"application/json; charset=utf-8";//可以发送json字符串作为参数
                //      myRequest.ContentType = "application/x-www-form-urlencoded";//只能发送&&&&&
                //      在WebApiRequest里面因为以及设置了前者,所以这里就发送Json字符串
                string responseString = WebApiRequest.PostRequest(userJsonString, path);
    
                WriteResult("添加User", responseString);
            }    

             private void Button_UpdateUser_Click(object sender, RoutedEventArgs e)
            {
                //对应的方法是:UpdateUser([FromUri]int id,[FromBody]User user)
                //1,是方法里面从Uri读取的参数
                //user是序列化的Json字符串,需要从body读取
                string path = "api/users/Update/1";
    
                User user = new User();
                user.ID = 1;
                user.Platform = Platform.Youtube;
                user.Status = "User";
                user.UserName = "Hello";
    
                string userJsonString = JsonConvert.SerializeObject(user);
    
                string responseString = WebApiRequest.PostRequest(userJsonString, path);
    
                WriteResult("更新User", responseString);
            }        
    
    
    
            private void Button_GetAllUser_Click(object sender, RoutedEventArgs e)
            {
                string path = "api/users/GetAllUsers";
                string responseString = WebApiRequest.GetRequest(path);
    
                WriteResult("所有的User", responseString);
            }
    
            private void Button_GetProductByID_Click(object sender, RoutedEventArgs e)
            {
                int id = 0;
                int.TryParse(TB_UserID.Text, out id);
                string path = string.Format("api/users/GetUserById/{0}", id);
                string responseString = WebApiRequest.GetRequest(path);
    
                WriteResult("对应ID的User", responseString);
            }    
            private void Button_GetUserByName_Click(object sender, RoutedEventArgs e)
            {
                string path = "api/users/GetUser";
                string query = string.Format("userName={0}", TB_UserName.Text);
                string responseString = WebApiRequest.GetRequest(path,query);
    
                WriteResult("对应名字的User", responseString);
            }    
     
  • 相关阅读:
    命保住了!五年时间,我们也搞了一个技术中台(转)
    为什么要前后端分离?有什么优缺点?(转)
    Java WebService _CXF、Xfire、AXIS2、AXIS1_四种发布方式(优缺点对比)
    Java WebService _CXF、Xfire、AXIS2、AXIS1_四种发布方式(使用整理)
    Java WebService(实战) 简单实例
    Intellij IDEA svn的使用记录
    IDEA SonarLint安装及使用
    Java开发中的23种设计模式详解(收藏-转)
    Java中的static关键字解析
    触发器_实现ORACEL自动增长字段
  • 原文地址:https://www.cnblogs.com/AlvinLiang/p/3808354.html
Copyright © 2020-2023  润新知