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 = , UserName = "Soup1", Platform = Platform.Facebook, Status = "User" },
new User { ID = , UserName = "Soup2", Platform = Platform.Facebook, Status = "User" },
new User { ID = , UserName = "Soup3", Platform = Platform.Facebook, Status = "User" },
new User { ID = , 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, , 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 = ;
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}", ));
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 = ;
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 = ;
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 Web API 实例的更多相关文章

  1. ASP.NET Web API自身对CORS的支持:从实例开始

    在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...

  2. 关于操作 ASP.NET Web API的实例

    WCF的野心造成了它的庞大复杂,HTTP的单纯造就了它的简单优美.为了实现分布式Web应用,我们不得不将两者凑合在一起 —— WCF服务以HTTP绑定宿主于IIS. 于是有了让人晕头转向的配置.让人郁 ...

  3. ASP.NET Web API 框架研究 Controller实例的销毁

    我们知道项目中创建的Controller,如ProductController都继承自ApiController抽象类,其又实现了接口IDisposable,所以,框架中自动调用Dispose方法来释 ...

  4. ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

    本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...

  5. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  6. ASP.NET Web API Model-ActionBinding

    ASP.NET Web API Model-ActionBinding 前言 前面的几个篇幅把Model部分的知识点划分成一个个的模块来讲解,而在控制器执行过程中分为好多个过程,对于控制器执行过程(一 ...

  7. ASP.NET Web API Model-ParameterBinding

    ASP.NET Web API Model-ParameterBinding 前言 通过上个篇幅的学习了解Model绑定的基础知识,然而在ASP.NET Web API中Model绑定功能模块并不是被 ...

  8. ASP.NET Web API Model-ModelBinder

    ASP.NET Web API Model-ModelBinder 前言 本篇中会为大家介绍在ASP.NET Web API中ModelBinder的绑定原理以及涉及到的一些对象模型,还有简单的Mod ...

  9. ASP.NET Web API Model-ValueProvider

    ASP.NET Web API Model-ValueProvider 前言 前面一篇讲解了Model元数据,Model元数据是在Model绑定中很重要的一部分,只是Model绑定中涉及的知识点比较多 ...

随机推荐

  1. linux 下 jdk tar.gz 包安装方法

    JDK安装 tar.gz为解压后就可使用的版本,这里我们将jdk-7u3-linux-i586.tar.gz解压到/usr/local/下. 1.解压 解压到当前目录:$ tar -zxvf /opt ...

  2. Android IOS WebRTC 音视频开发总结(三八)-- tx help

    本文主要介绍帮一个程序员解决webrtc疑问的过程,文章来自博客园RTC.Blacker,支持原创,转载请说明出处(www.rtc.help) 这篇文章内容主要来自邮件,为什么我会特别整理到随笔里面来 ...

  3. PayPal 开发详解(二):开启【自动返回】和【数据传输】

    1.使用我们的商家测试帐号登录 sandbox :http://www.sandbox.paypal.com Business帐号登录 2.登录以后点击:[我的paypal]->[用户信息]-& ...

  4. Linux命令行 3大技巧归纳

    在软件开发的世界中,作为web端程序猿打交道最多的操作系统相信就是Linux系统了吧.而对于Linux系统的使用,如果能掌握一些小技巧,在程序开发.调试的过程中,相信做事的效率也会有一些提升.下面就和 ...

  5. 一个学生分数表,用sql语句查询出各班级的前三名

    昨天去一家公司面试,被这道题难住了,哎,又失去一次好的机会. 回来 之后就再想这个问题 表结构及数据如下:

  6. JavaScript API 设计原则

    网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>> 好的 API 设计:在自描述的同时,达到抽象的目标. 设计良好的 API ,开发者可以快速上手,没必要经常抱着手册和文档, ...

  7. 解决DataGridView在多线程中无法显示滚动条的问题

    在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的 ...

  8. ASP.NET中实现页面间的参数传递

    ASP.NET中实现页面间的参数传递   编写人:CC阿爸 2013-10-27 l  近来在做泛微OA与公司自行开发的系统集成登录的问题.在研究泛微页面间传递参为参数,综合得了解了一下现行页面间传参 ...

  9. 线程间通信--wait和notify

    使用wait.notify方法实现线程间的通信(注意这两个方法都是object的类的方法,换句话说java为所有的对象都提供了这两个方法) 1.wait和notify必须配合synchronized关 ...

  10. input实时监听(input oninput propertychange onpropertychange)

    本文实例讲述了js与jquery实时监听输入框值的oninput与onpropertychange方法.分享给大家供大家参考.具体如下: 最近做过一个项目,需求是下拉框里自动匹配关键字,具体细节是实时 ...