• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

WebAPI实现POST报文的构造与推送ASP.NETWebAPI实现POST报文的构造与推送 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 

毕设和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随笔

毕设和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学习的一个记录。

敬请指正!


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Asp.netMvc(2)Routing路由发布时间:2022-07-10
下一篇:
Asp.net中Web.config连接字符串及配置数据库sqlserver发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap