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 = , 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 实例的更多相关文章
- ASP.NET Web API自身对CORS的支持:从实例开始
在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...
- 关于操作 ASP.NET Web API的实例
WCF的野心造成了它的庞大复杂,HTTP的单纯造就了它的简单优美.为了实现分布式Web应用,我们不得不将两者凑合在一起 —— WCF服务以HTTP绑定宿主于IIS. 于是有了让人晕头转向的配置.让人郁 ...
- ASP.NET Web API 框架研究 Controller实例的销毁
我们知道项目中创建的Controller,如ProductController都继承自ApiController抽象类,其又实现了接口IDisposable,所以,框架中自动调用Dispose方法来释 ...
- ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等
本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- ASP.NET Web API Model-ActionBinding
ASP.NET Web API Model-ActionBinding 前言 前面的几个篇幅把Model部分的知识点划分成一个个的模块来讲解,而在控制器执行过程中分为好多个过程,对于控制器执行过程(一 ...
- ASP.NET Web API Model-ParameterBinding
ASP.NET Web API Model-ParameterBinding 前言 通过上个篇幅的学习了解Model绑定的基础知识,然而在ASP.NET Web API中Model绑定功能模块并不是被 ...
- ASP.NET Web API Model-ModelBinder
ASP.NET Web API Model-ModelBinder 前言 本篇中会为大家介绍在ASP.NET Web API中ModelBinder的绑定原理以及涉及到的一些对象模型,还有简单的Mod ...
- ASP.NET Web API Model-ValueProvider
ASP.NET Web API Model-ValueProvider 前言 前面一篇讲解了Model元数据,Model元数据是在Model绑定中很重要的一部分,只是Model绑定中涉及的知识点比较多 ...
随机推荐
- Python搭建简易HTTP服务(3.x版本和2.x版本的)
废话不多说,我们工作时经常会用到需要HTTP服务,如果不想搞那些复杂的Apache.IIS服务器等,这时我们就可以用python帮我们搭建一个简单的服务器.操作如下: 1.下载并安装一个python: ...
- 014安装Linux系统到开发板
SD卡----->开发板 1.安装准备: 硬件连接 USB下载线,一端连到开发板,另一端连到PC机: 串口线连好: 电源线连好: 设置开发板从SD卡启动: 2.打开开发板进入选单界面: 进入选单 ...
- iOS键盘类型
一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault, // 默认键盘:支持所有字符 UIKeyboa ...
- jquery 读取xml
<script type="text/javascript" src="jquery/jquery-1.11.3.min.js"></scri ...
- SequoiaDB的数据分区操作
在SequoiaDB集群环境中,用户往往将数据存放在不同的逻辑节点与物理节点中,以达到并行计算的目的. 分区:把包含相同数据的一组数据节点叫一个分区,如上图绿色方块组成三个分区. 分区键:切分时,所依 ...
- 解决 MVC 用户上线下线状态问题
以前工作项目中就有一个微博类功能,其中也出现了用户在线和离线的问题. 但是因为初入程序猿 使用的是 Session _end 上个事件. Session _end 这个事件不需要怎么解释吧 就是在se ...
- 解决ubuntu15 下没有声音
个人经验,个人适用. 今天想在网上在线听一首歌,结果没有声音.好气啊,于是百度,google,发现好像这个问题很常见.于是按着来,什么alsamixer还有更改什么audio权限的,但在我这都没用. ...
- openerp 经典收藏 记录规则 – 销售只能看到自己的客户,经理可以看到全部(转载)
记录规则 – 销售只能看到自己的客户,经理可以看到全部 原文地址:http://cn.openerp.cn/record_rule/ OpenERP中的权限管理有四个层次: 菜单级别: 即,不属于指定 ...
- PIL不能关闭文件的解决方案
今天写了一个能指定图片尺寸,以及比例 来搜索分类图片的Python脚本.为了读取多个格式的文件的头,采用了Python PIL库. im = PIL.Image.open(imPath) if im的 ...
- Python核心编程--学习笔记--7--字典和集合
本章介绍Python语言中的映射类型(字典)和集合类型,包括操作符.工厂函数.内建函数与方法. 1 字典 字典是Python中唯一的映射类型——键key直接映射到值value.字典是容器类型,其对象是 ...