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)

大家都在看

  • jmeter 性能测试 报错信息“address already in use:connect”解决方法

    jmeter性能测试报”address already in use:connect” 报错信息 原因分析: 这个问题的原因是windows端口被耗尽了(默…

    Linux 2023年6月8日
    0104
  • python小技巧

    关于 ipython 1 Tab补全 从外观上,IPython shell和标准的Python解释器只是看起来不同。IPython shell的 进步之一是具备其它IDE和交互计算…

    Linux 2023年6月8日
    0108
  • Python:给定一个不超过5位的正整数,判断有几位

    方法一:作比较 方法二:使用整除实现,除完后如果是个0或不是个0,这种方法引入了计算,效率会降低,所以能加就不要减,能乘就不要除,能不计算就不计算 方法三: 方法四:字符串处理实现…

    Linux 2023年6月7日
    097
  • gcc/g++与动静库以及gdb

    gcc/g++ 程序转换为二进制 总共需要经过4个大步骤:1.预处理,2.编译,3.汇编,4.链接。 想要更深刻的了解它,可以通过Linux去深刻的了解他们。 先创建.C文件 并且…

    Linux 2023年6月13日
    092
  • 简单的kubernetes搭建

    一、基本环境: Centos7.X Docker Version: 1.13.1 二、kubernetes各组件介绍: etcd保存了整个集群的状态 kube-proxy负责为Se…

    Linux 2023年6月13日
    080
  • Nginx 平滑升级(不需要关闭Nginx升级)

    Nginx 平滑升级 对Nginx的版本进行更新,或者要增添新的模块,最简单的方法就是停止当前的Nginx服务,重新编译安装nginx,然后开启新的Nginx服务。但是这样会导致在…

    Linux 2023年6月13日
    089
  • bat-Windows的文件夹备份

    REM program:用于HTS的Windows机器&#x5…

    Linux 2023年6月7日
    0102
  • 【原创】Linux虚拟化KVM-Qemu分析(九)之virtio设备

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    073
  • 函数调用栈

    博客网址:www.shicoder.top微信:18223081347欢迎加群聊天 :452380935 这个分栏我们开始学习PWN,当然PWN也是自己的兴趣爱好,所以可能博客更新…

    Linux 2023年6月13日
    0127
  • @JsonFormat和@DateTimeFormat的作用

    @DatetimeFormat是将String转换成Date,一般前台给后台传值时用 import org.springframework.format.annotation.Da…

    Linux 2023年6月7日
    098
  • cpp-变量

    1.枚举类型 枚举类型是用户自定义的类型,在定义时要列举出该枚举类型所有的数值。 定义格式如下: [enum] enumName {val1, val2, val3} 其中的通常为…

    Linux 2023年6月7日
    0100
  • JavaScript 设计模式

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo…

    Linux 2023年6月13日
    0120
  • LVM 逻辑卷管理 Logical Volume Management

    管理磁盘、使用磁盘的一种方式的称呼 优势: 1、在不影响数据的情况下, 扩容、缩容 2、支持快照功能, 方便数据备份 LVM工作流程: 磁盘/分区 —> pv(物…

    Linux 2023年6月7日
    0124
  • jenkins自动触发构建

    bash;gutter:true; 1. 安装jenkins cat /etc/yum.repos.d/jenkins.repo [jenkins] name=Jenkins ba…

    Linux 2023年6月7日
    077
  • nginx禁止直接ip、未配置域名访问配置

    问题背景 最近偶然对线上域名配置的nginx IP进行直接访问后,发现http居然是可以通的,而https直接IP访问浏览器会报证书不安全的提示,点击详细查看发现是固定返回了ngi…

    Linux 2023年6月6日
    0213
  • 国产化之Arm64 CPU+银河麒麟系统安装.NetCore

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,银河麒麟就是一个Linux发行版,数据库使用达梦V8,这个数据库很多概念和Oracle相似,CPU平台的范围:龙…

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