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

 

 
posted @ 2014-06-25 16:38  AlvinLiang  阅读(444)  评论(0编辑  收藏  举报