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

补充说明:如果在Request.CreateResponse()方法中传入实体对象的话,默认是转换成JSON传递,当然可以在WebApiConfig.cs中修改返回结果的方式。

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

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

敬请指正!

Original: https://www.cnblogs.com/ryuasuka/p/3594777.html
Author: 飞鸟_Asuka
Title: ASP.NET Web API实现POST报文的构造与推送

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609194/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Android XML: Multiple button layout

    The layout : The xml code : 😃(before using this code, you should create your drawable xml …

    Linux 2023年6月13日
    092
  • 深入理解linux内核-内存寻址

    逻辑地址:由一个段和偏移量组成的地址线性地址(虚拟地址):物理地址:CPU的物理地址线相对应的地址32或36位 多处理器系统中每个CPU对应一个GDT 局部线程存储:用于线程内部的…

    Linux 2023年6月6日
    070
  • redis高可用

    Redis-高可用(主从复制、哨兵模式、集群) 1.主从复制 1.1 主从复制简介 在 Redis 复制的基础上,使用和配置主从复制非常简单,能使得从 Redis 从服务器(下文称…

    Linux 2023年6月13日
    082
  • 回忆我的第一个软件项目

    2009年大学毕业我去了成都,一番面试后,入职武侯区磨子桥附近的一个小型创业公司。公司的主营业务是代理销售用友或者金蝶的ERP软件,创业团队都是川大毕业的。公司的办公条件很差,两间…

    Linux 2023年6月6日
    0103
  • linux 命令 df -h 查不到新添加的硬盘

    云平台:腾讯云系统:ubuntu 20.04 第一部分:缘由 1、我的一台云服务器上挂载了两块硬盘。一块 50G 系统盘、一块 400G 数据盘。然后我查询目前在 Linux 系统…

    Linux 2023年5月27日
    0318
  • 了解CFS完全公平调度器

    CFS模拟理想多任务调度 公平,即对于n个正在运行的任务,当这些任务同时不断地运行时,CPU会尽可能分配给他们1/n的处理时间。 CFS是一种基于加权公平排队思想的调度算法。 精确…

    Linux 2023年6月7日
    091
  • [云原生]Kubernetes-集群搭建(第2章)

    一、前置知识点 二、kubeadm部署方式介绍 三、安装要求 四、最终目标 五、准备环境 六、环境初始化 6.1 设置系统主机名以及Hosts文件的相互解析 6.2 安装依赖文件(…

    Linux 2023年6月13日
    062
  • 总结

    门诊:11张 张张是主表,主表之王是患者信息住院:12张 张张由入院登记开始,外挂处方点评一张电子病历:12张 病历概要打头来,紧接门(急)病历,急诊留观放尾中,住院病历放最后检验…

    Linux 2023年6月13日
    096
  • PIM-DM 组播路由协议仿真

    目的 理解PIM-DM 的应用场景 掌握PIM-DM 的基本配置 理解PIM-DM 中剪枝和嫁接的原理 理解PIM-DM 中的Assert 机制 原理 Source-Specifi…

    Linux 2023年6月8日
    088
  • 非常实用的 Shell 脚本

    检测两台服务器指定目录下的文件一致性 #!/bin/bash<br>#####################################<br>#&a…

    Linux 2023年5月28日
    067
  • 良许跌宕起伏的2021年

    大家好,我是良许,前码农,现创业者。 时间飞逝,转眼就2021年年尾了,向各位「股东」们汇报一下良许的 2021 年。 公众号运营至今,每年我都会写年终总结,前三次总结给大家放在下…

    Linux 2023年6月14日
    0103
  • Ubuntu20.04桌面版 使用root账号登录

    sodu -i 执行命令,输入当前用户密码,临时切换到root身份 执行passwd命令,修改root登录密码 passwd 修改50-ubuntu.conf文件 执行如下命令: …

    Linux 2023年6月13日
    082
  • linux挂载文件系统

    当使用光驱等硬件设备时,必须将其挂载到系统中,只有这样Linux才能识别。 1、给虚拟机中centos7系统添加一块新的硬盘,添加以后必须重启centos7才能生效 2、在root…

    Linux 2023年5月27日
    088
  • Java基础 | Stream流原理与用法总结

    Stream简化元素计算; 一、接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式;依旧先看核心接口的设计: B…

    Linux 2023年6月13日
    097
  • 目录遍历漏洞

    一.目录遍历漏洞原理目录遍历(路径遍历)是由于Web服务器或者Web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器…

    Linux 2023年6月14日
    094
  • POJ1611(The Suspects)–简单并查集

    1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include&lt…

    Linux 2023年6月7日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球