ASP.NET Web API实现POST报文的构造与推送
毕设和OAuth协议相关,而要理解OAuth协议就必须理解HTTP GET/POST方法。因此研究了一下如何使用Web API或MVC构造POST报文并实现客户端与服务器端的交互。
我使用的工具是Visual Studio 2013 + Web API 2 + MVC 5。
在两个不同的VS2013实例中分别新建两个Web项目,都选择空模板,其中一个命名为Client,采用MVC架构,另一个命名为Server,采用Web API架构。
这里需要两个不同的VS2013实例是为了能使两个IIS Express服务在同一台机器上同时运行。
我们先来看看客户端:
由于只是个Demo,因此我们只在客户端中新建一个空的MVC控制器,将其命名为HomeController。它会自带一个Index()方法。我们在这里面写好构造请求并发送请求的代码:
- namespace Client.Controllers
- {
- public class HomeController : Controller
- {
- //
- // GET: /Home/
- public ActionResult Index()
- {
- string url = ""; // 这里我们还不知道服务器的url,因此留空
- #region 构造POST请求
- HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
- request.Method = "POST";
- request.ContentType = "application/x-www-form-urlencoded";
- request.Host = "localhost:14340";
- string body = "client_id=123&redirect_uri="+url+"&response_type=code";
- byte[] bodyBytes = Encoding.UTF8.GetBytes(body);
- Stream requestStream = request.GetRequestStream();
- requestStream.Write(bodyBytes,,bodyBytes.Length);
- #endregion
- #region 发送请求并取得响应
- // 必须使用HttpWebRequest.GetResponse()方法,请求才能被发送并取得响应
- HttpWebResponse response = request.GetResponse() as HttpWebResponse;
- StreamReader sr = new StreamReader(response.GetResponseStream());
- ViewBag.Response = sr.ReadToEnd();
- #endregion
- return View();
- }
- }
- }
接下来我们构造服务器端:
在Server项目中,新建一个Web API 2控制器。命名随意(我这里命名为ApiTestController),在控制器中写入一个方法Post,返回HttpResponseMessage类型。
本来我一直以为POST的参数可以在Request属性中获取,但是仔细检查了Request属性的所有属性和方法,包括扩展方法,都没有找到可以直接读取POST报文请求体的属性或方法。查阅资料得知,如果要在POST请求中获取请求体的内容,就必须将参数封装在一个类中。于是我们建立一个类RequestArgs如下:
- namespace Server.Models
- {
- /// <summary>
- /// 对于POST请求,必须对请求体的所有参数建立一个模型类。
- /// </summary>
- public class RequestArgs
- {
- public string client_id { get; set; }
- public string redirect_uri { get; set; }
- public string response_type { get; set; }
- }
- }
这里的参数和上文客户端Action方法中的请求报文内容必须保持名称一致(包括大小写)
之后我们再写入控制器的POST方法如下:
- namespace Server.Controllers
- {
- public class ApiTestController : ApiController
- {
- public HttpResponseMessage Post(RequestArgs args)
- {
- string client_id = args.client_id;
- string redirect_uri = args.redirect_uri;
- string response_type = args.response_type;
- return Request.CreateResponse(HttpStatusCode.OK, "I have received your message. Client_id = "+client_id+", RedirectUri = "+redirect_uri+"response_type = "+response_type);
- }
- }
- }
这里我们直接返回了报文的内容,而在实际的项目中,我们可以自己对传入的参数进行处理。
之后我们编译运行服务器端(最好是按F5进入调试模式运行)。可以看到出现的Web页面似乎是一个错误页面,但是不用管它,我们的服务器已经开始运行了。
记下服务器的地址(一般也就是端口号会变化),将这个服务器的地址填入客户端的url变量。
编译运行客户端,如果出现返回的信息(这里是“I have received your message”和参数信息),说明我们的请求成功了。
补充说明:如果在Request.CreateResponse()方法中传入实体对象的话,默认是转换成JSON传递,当然可以在WebApiConfig.cs中修改返回结果的方式。
笔者撰写此文的目的一是为以后毕设的继续进行而研究,二也是对MVC和Web API学习的一个记录。
敬请指正!
ASP.NET Web API实现POST报文的构造与推送的更多相关文章
- Web API实现POST报文的构造与推送
ASP.NET Web API实现POST报文的构造与推送 毕设和OAuth协议相关,而要理解OAuth协议就必须理解HTTP GET/POST方法.因此研究了一下如何使用Web API或MVC构 ...
- 新作《ASP.NET Web API 2框架揭秘》正式出版
我觉得大部分人都是“眼球动物“,他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个“ ...
- ASP.NET Web API 2框架揭秘
ASP.NET Web API 2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著 ISBN 978-7-121-23536-8 2014年7月出版 定价:108.0 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【九】——API变了,客户端怎么办?
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 一旦我们将API发布之后,消费者就会开始使用并和其他的一些数据混在一起.然而,当新的需求出现 ...
- ASP.NET Web Api 服务器端变了,客户端该如何修改请求(转载)
转载地址:http://www.cnblogs.com/fzrain/p/3558765.html 前言 一旦我们将API发布之后,消费者就会开始使用并和其他的一些数据混在一起.然而,当新的需求出现时 ...
- 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD)
一些小的C/S项目(winform.WPF等),因需要访问操作数据库,但又不能把DB连接配置在客户端上,原因有很多,可能是DB连接无法直接访问,或客户端不想安装各种DB访问组件,或DB连接不想暴露在客 ...
- ASP.NET Web API 框架研究 ASP.NET Web API 路由
ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...
- asp.net web api 跨域问题
缘起 以前在asp.net mvc时代,很少出现跨域问题 自从使用了asp.net web api + angular (1/2)之后,开始有跨域问题了. 简单普及下跨域: 我的理解是只要是前台页面与 ...
- [整理]ASP.NET WEB API 2学习
目录 1 快速入门 1.1实例 1.1.1初识WEB API 2 1.1.2 Action Results 的改变 1.1.3 路由的新增特性 1.1.4 消息管道的变化 1.1.4.1 HttpMe ...
随机推荐
- uva133-S.B.S.
The Dole Queue In a serious attempt to downsize (reduce) the dole queue, The New National Green Lab ...
- 写一个ActionFilter检测WebApi接口请求和响应
我们一般用日志记录每次Action的请求和响应,方便接口出错后排查,不过如果每个Action方法内都写操作日志太麻烦,而且客户端传递了错误JSON或XML,没法对应强类型参数,请求没法进入方法内, 把 ...
- Android Sdk 和ADT Eclipse安装配置步骤
由于我们之前下载的jdk版本是1.6的,所以后面的andriod sdk等版本需要相对应.安装文件我都放在云盘里面,需要的可以下载 一:如果单独安装每一个软件,先期需要下载的软件包如下: 1.JDK ...
- 第17章 内存映射文件(3)_稀疏文件(Sparse File)
17.8 稀疏调拨的内存映射文件 17.8.1 稀疏文件简介 (1)稀疏文件(Sparse File):指的是文件中出现大量的0数据,这些数据对我们用处不大,但是却一样的占用空间.NTFS文件系统对此 ...
- AC日记——codevs 1086 栈 (卡特兰数)
题目描述 Description 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). ...
- 从Maya中导入LightMap到unity中
导入步骤 1.在Maya中为每一个模型烘焙好帖图(tif格式),会发现烘焙好的图和UV是一一对应的 2.把模型和烘焙帖图导入到Unity中 3.选中材质,修改Shader为 Legacy Shader ...
- jira与readmine区别
JIRA适合多人的团队(100+),而Readmine适合中小型团队. Redmine是用ruby开发的基于web的项目管理软件,免费.JIRA收费Redmine可以创建子任务,而jira不易创建子任 ...
- java9-9 匿名内部类
1. 匿名内部类 就是内部类的简化写法. 前提:存在一个类或者接口 这里的类可以是具体类也可以是抽象类. 格式: new 类名或者接口名(){ 重写方法; } new Xxx()是创建了一个对象,而抽 ...
- Managing the Lifecycle of a Service
service的生命周期,从它被创建开始,到它被销毁为止,可以有两条不同的路径: A started service 被开启的service通过其他组件调用 startService()被创建. 这种 ...
- CLR执行模式之程序集代码的执行
所知IL是与CPU无关的机器语言,其能访问和操作对象类型,并提供指令来创建和初始化对象,调用对象上的虚方法以及直接操作数组对象等,故可视为一种面向对象的机器语言.每种语言的存在都有其存在的价值和原因, ...