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

笔者撰写此文的目的一是为以后毕设的继续进行而研究,二也是对MVC和Web API学习的一个记录。

敬请指正!

 
 
分类: .NET随笔

Web API实现POST报文的构造与推送的更多相关文章

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

    毕设和OAuth协议相关,而要理解OAuth协议就必须理解HTTP GET/POST方法.因此研究了一下如何使用Web API或MVC构造POST报文并实现客户端与服务器端的交互. 我使用的工具是Vi ...

  2. JPush API client library for C Sharp(极光推送API)

    概述 这是 JPush REST API 的 C# 版本封装开发包,是由极光推送官方提供的,一般支持最新的 API 功能. 对应的 REST API 文档:http://docs.jpush.io/s ...

  3. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了.在正式开 ...

  4. atitit.web 推送实现方案集合(2)---百度云,jpush 极光推送 ,个推的选型比较.o99

    atitit.web 推送实现方案集合(2)---百度云,jpush 极光推送 ,个推的选型比较.o99 1.1. 云推送有推送次数或频率的限制吗? 1 1.2. 推送的消息长度 1 1.3. 离线消 ...

  5. JPush极光推送 Java调用服务器端API开发

       极光推送是:使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户保持互动,从而有效地提高留存率,提升用户体验.简单的说就是通过JPush后台管理网站进行app消息的推送.可以让用户及时 ...

  6. 关于ASP.NET Web API 客户端的请求报文中添加 Authorization

    当你使用客户端发送请求 Web API 的时候,因为API 有验证,所以你的请求报文中必须有”Authorization“,那么就需要手动添加了! HttpClient client = new Ht ...

  7. Web Api单元测试写法

    例如我们在Web Api项目中有个Controller public class SomeController : ApiController { public HttpResponseMessage ...

  8. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  9. Web API 入门指南 - 闲话安全

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

随机推荐

  1. UVa 11790 - Murcia&#39;s Skyline

    称号:给你一个行长度的建设和高度,我们祈求最长的和下降的高度. 分析:dp,最大上升子. 说明:具有长度,不能直接优化队列单调. #include <iostream> #include ...

  2. TCP在三次握手协议和四波(图)

    设定TCP需要建立一个三次握手的能力,断开需要握手.整步骤,如看到下面的附图: 先来看看怎样建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  3. L轻松学习inux教程5 知识与学习bash

    本系列文章由@超人爱因斯坦出品,转载请注明出处.          文章链接:          http://hpw123.net/a/Linux/Linuxjichu/2014/1031/101. ...

  4. UBUNTU如何改变mysql默认文件夹数据文件夹

    停止mysql维修 * sudo /etc/init.d/mysql stop 原始文件夹的副本 * cp -r /var/lib/mysql /home/yourname/somewhere 改动权 ...

  5. hdu 1098 Ignatius's puzz

    有关数论方面的题要仔细阅读,分析公式. Problem Description Ignatius is poor at math,he falls across a puzzle problem,so ...

  6. POJ 2081 Recaman&#39;s Sequence(水的问题)

    [简要题意]:这个主题是很短的叙述性说明.挺easy. 不重复. [分析]:只需要加一个判断这个数是否可以是一个数组,这个数组的范围. // 3388K 0Ms #include<iostrea ...

  7. oracle_删除同一列的重复数据

    <!--删除同一列的重复数据 rowid 在orcle中 数据的物理地址---> delete from tbl_over_picture_alarm a where rowid not ...

  8. Win8.1 Update如何禁用OneDrive同步服务

    原文 Win8.1 Update如何禁用OneDrive同步服务 上周,IT之家为爱好者分享Win8.1 Update如何提高OneDrive上传速度教程.但是,由于国内特殊网络环境,导致微软OneD ...

  9. IOS程序创建view

    在IOS程序中创建view有六种方式 首先创建一个GLViewController类,继承UIViewController. 然后进入GLAppDelegate.m,在- (BOOL)applicat ...

  10. POJ 1182(食物链-另类做法【拆点】)[Template:并查集]

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 46039   Accepted: 13400 Description ...