ASP.NET Web API 实例

ASP.NET Web API 入门大杂烩

 

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

ASP.NET Web API 实例

 

在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);

        }    

 

 

你可能感兴趣的:(asp.net)