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

 

 

转载于:https://www.cnblogs.com/AlvinLiang/p/3808354.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、源码特点       1、先进的 HTTP 编程模型: 使用新的强类型的 HTTP 对象模型直接操作 HTTP 请求和响应, 在 HTTP客户端使用相同的编程模型和 HTTP 管道;       2、支持路由: Web API 完整支持 ASP.NET 路由, 包括路由参数和约束。 此外, 到动作的映射支持约定, 从此将不再需要向类或者方法添加类似于 [HttpPost] 之类的属性;       3、内容协商: 客户端与服务端可以一起决定 API 返回数据的格式。 默认支持 XML, JSON 以及 Form URL-Encoded 格式, 可以扩展添加自定义格式, 甚至可以替换掉默认的内容协商策略;       4、模型绑定与验证: 模型绑定器可以轻易地从 HTTP 请求中提取数据并转换成在动作方法中使用的 .Net 对象;       5、过滤: Web API 支持过滤, 包括总所周知的 [Authorize] 过滤标记, 可以为 Action 添加并插入自定义过滤, 实现认证、异常处理等;       6、查询聚合: 只要简单的返回 Iqueryable , Web API 将会支持通过 OData 地址约定进行查询;       7、改进的 Http 细节可测试性: Web API 不是将 HTTP 细节设置到一个静态的 Context 对象上, 而是使用 HttpRequestMessage 和 HttpResponseMessage 实例, 可以使用这些对象的泛型版本为这些 Http 类型添加自定义类型;       8、改进的依赖反转 (IoC) 支持: Web API 使用 MVC Dependency Resolver 实现的服务定位器模式在不同的场景下来获取实例;       9、基于代码的配置: Web API 单独使用代码完成配置, 从而保证了配置文件的整洁;       10、自托管 (Self-Host) : Web API 除了可以托管在 IIS 中, 还可以托管在进程中,依旧可以使用路由以及其它的特性。 二、注意事项       1、开发环境为Visual Studio 2012,数据库为SqlServer2008,使用.net 4.0开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值