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,0,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

  {

  ///

 

  /// 对于POST请求,必须对请求体的所有参数建立一个模型类。

  ///

 

  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”和参数信息),说明我们的请求成功了。

时间: 2024-09-20 05:37:43

ASP.NET Web API实现POST报文的构造与推送的相关文章

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【七】——实现资源的分页

原文:使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[七]--实现资源的分页 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 这篇文章我们将使用不同的方式实现手动分页(关于高端大气上档次的OData本文暂不涉及,但有可能会在系列的后期介绍,还没确定...),对于分页的结果,我们将采用2种不同的方式响应给客户端(1.将分页元数据封装在响应Body中2.在http响应报文头部添加分页信息). 众所周知,在服务器端一

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

原文:使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[五]--在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现--Post(新增),Put(修改),Delete(删除),Get(查询).查询在前几章我们已经实现了,本章就在我们的案列(CourseController)

在ASP.NET Web API中使用OData

一.什么是ODataOData是一个开放的数据协议(Open Data Protocol) 在ASP.NET Web API中, 对于CRUD(create, read, update, and delete)应用比传统WebAPI增加了很大的灵活性 只要正确使用相关的协议,可以在同等情况下 对一个CRUD应用可以节约很多开发时间,从而提高开发效率 二.怎么搭建 做一个简单的订单查询示例 我们使用Code First模式创建两个实体对象Product(产品),Supplier(供应商) 1.新建

8 种提升 ASP.NET Web API 性能的方法

ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web API 性能的技术. 1) 使用最快的 JSON 序列化工具 JSON 的序列化对整个 ASP.NET Web API 的性能有着关键性的影响. 在我的一个项目里,我从 JSON.NET 序列化工具转到了 ServiceStack.Text 有一年半了. 我测量过,Web API 的性能提升了20

ASP.NET Web API Selfhost宿主环境中管道、路由

前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这个框架由于宿主环境的不同在不同的宿主环境中管道中的实现机制和路由的处理方式有着很大的不同,所以我会将对应不同的宿主环境来分别的做出简单的讲解.  ASP.NET Web API路由.管道     ASP.NET Web API 开篇介绍示例     ASP.NET Web API 路由对象介绍     ASP.NET Web API 管道模型     ASP.NET

ASP.NET Web API:如何Host定义在独立程序集中的Controller

通过<ASP.NET Web API的Controller是如何被创建的?>的介绍我们知道默认ASP.NET Web API在Self Host寄宿模式下用于解析程序集的AssembliesResolver是一个DefaultAssembliesResolver对象,它只会提供当前应用程序域已经加载的程序集.如果我们将HttpController定义在非寄宿程序所在的程序集中(实际上在采用Self Host寄宿模式下,我们基本上都会选择在独立的项目定义HttpController类型),即使我

启用和自定义 ASP.NET Web API 服务的安全性

对于最常见的场景 - Web 页面中的 JavaScript 访问同一站点上的 Web API 服务,讨论 ASP.NET Web API 的安全性几乎是多余的.如果对用户执行身份验证和授权对 Web 窗体/视图(包含使用服务的 JavaScript)的访问均已设置,则服务可能已具备其所需的所有安全性了.这要归因于 ASP.NET,它会将其用 于验证页面请求的 Cookie 和身份验证信息作为对服务方法的任意客户端 JavaScript 请求的一部分进行发送 .但有一个非常重要的例外: ASP.

ASP.NET Web API 2 对 CORS 的支持

跨域资源共享 (CORS) 是一种万维网联合会 (W3C) 规范(通常被认为是 HTML5 的一部分),它可让 JavaScript 克服由浏览器施加的同域策略安全限制.所谓同域策略,就是 JavaScript 只能对包含网页的同 一个域进行 AJAX 回调(其中,"域"就是主机名.协议和端口号的组合).例如, http://foo.com 中某个网页上的 JavaScript 无法对 http://bar.com(或 http://www.foo.com. https://foo.c

ASP.NET Web API(二) 安全验证之使用HTTP基本认证

在前一篇文章ASP.NET Web API(一):使用初探,GET和POST数据中,我们初步接触了微软的REST API: Web API. 我们在接触了Web API的后就立马发现了有安全验证的需求,所以这篇文章我们先来讨论下 安全验证一个最简单的方法:使用HTTP基本认证. HTTP基本认证原理 在HTTP协议进行通信的过 程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份认证的方法,当一个客户端 向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP