Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)-阿里云开发者社区

开发者社区> 晚来风急> 正文

Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)

简介:
+关注继续查看

背景:

1:有用户反馈了关于跨域请求的问题。

2:有用户反馈了参数获取的问题。

3:JsonHelper的增强。

在综合上面的条件下,有了2.2版本的更新,也因此写了此文。

开源地址:

https://github.com/cyq1162/taurus.mvc

下面对增强的功能进行介绍:

1:跨域请求

除了常规的的JsonP跨域,Html5开始支持增强跨域,则变得更为方便,只需要服务端请求头输出:

复制代码
1  if (context.Request.UrlReferrer != null && context.Request.Url.Host != context.Request.UrlReferrer.Host)
2  {
3     //跨域访问
4     context.Response.AppendHeader("Access-Control-Allow-Origin", "*");
5     context.Response.AppendHeader("Access-Control-Allow-Credentials", "true");
6  }
复制代码

如上代码:

1
2
3
4
5
1:可以通过检测来源的主机和请求的主机不一致判断是否跨域,如果是,则返回允许跨域标识。
 
2:第一个*表示允许任意请求,当然你也可以指定多个“http://a.com,http://b.com”.
 
3:第二个true表示允许跨域操作cookie,反之,则一行都不要出现,而不是设置为false。

另外,网上有文章介绍说,跨域时,浏览器会发出一个OPTIONS的预请求,于是框架也做出了处理:

复制代码
1 if (context.Request.HttpMethod == "OPTIONS")
2 {
3   context.Response.StatusCode = 204;
4   context.Response.AppendHeader("Access-Control-Allow-Method", "GET,POST,PUT,DELETE");
5   context.Response.AppendHeader("Access-Control-Allow-Origin", "*");
6   context.Response.AppendHeader("Access-Control-Allow-Headers", context.Request.Headers["Access-Control-Allow-Headers"]);
7   context.Response.End();
8 }
复制代码

状态码204,比起200的好处,是不需要返回Conent内容,只返回请求头。

在Demo的时候,测试了一下Get请求,没发现浏览器发出预请求,可能场景或环境不同。

下面是一个简单的测试:

在控制台(aries.cyqdata.com)发起一个跨域请求(http://localhost:13508/home/index):

如果把跨域关闭:

<add key="IsAllowCORS" value="false"/>

结果是:

于是:框架默认是支持跨域请求的,如果不想支持,可以关闭!

2:常规请求参数的获取

发现有用户在使用Taurus.MVC时,思维还在停留ASP.NET WebAPI。

比如请求:

1
http://localhost:13508/api/default?id=1

对方法定义的方法是:

1
2
3
4
public  void Default(int id)
{
           
}

结果当然抛异常,找不到方法了,框架默认收集的都是无参数的方法名。

于是用户就懵了,不知道怎么拿参数,我也懵了,怎么能不知道的,至少也应该知道Request吧。

下面介绍框架封装的获取参数的方法:

1:Query<T>("字段") (封装自Request)

针对:a=1&b=2这种Get或Post的参数,用Query<T>("字段")拿。

1
2
3
4
public override void Default()
{
   int id = Query<int>("id");
}

2:Para参数

针对:/api/user/3这种参数,可以直接拿Action参数(user)、Para参数就是3了(按:Controller/Action/Para这么个分隔方式)

1
2
3
4
public override void Default()
{
   string para3 = Para;

3:增强型的参数获取:GetJson方法

1:有些场景,对方Post的数据,并不是key=value这种格式,而是:

直接就是一串Json:({a:"1","b":"2"})过来,这时候,常规的方法是拿不到数据。

原生的可以通过HttpInputStream流拿到,但框架进行了人性化的封装:

通过GetJson()方法,可以获取:

 public override void Default()
 {
    Write(GetJson());
 }

执行输出的结果:

2:变态的GetJson():支持Get与Post的参数转Json

该方法不仅可以拿到直接Post的Json,还可以将a=1&b=2这种方式直接转Json返回,如:

发起请求:

请求结果:

对于Post请求处理结果一致,就不重复截图了!

4:增强型的GetEntity<T>()方法

1:对于Post或Get的常规参数:a=1&b=2这种类型的,除转json,也可以转实体:

发起请求:

请求结果:

演示为Get、Post的结果一致,不另截图!

2:GetEntity支持无限级复杂嵌套

你可以Post复杂的Json:{a:{b:2,c:3},f:['1','2']}之类的,只要实体对应上,即可转换,不另外截图。

3:GetList<T>方法

暂未提供:对于Post的[{},{}]的Json数组转换,可以用:

1
List<AB> list = JsonHelper.ToList<AB>(GetJson());

以上为获取参数转Json的相关方法,非常实用!!!

对于输出Json,用Write方法,可将复杂对象转换成Json。

上节:http://www.cnblogs.com/cyq1162/p/6069020.html  已介绍,不重复了。

总结:

Taurus.MVC,在处理为WebAPI方面,仍遵行着简单实用高效的原则。

欢迎加入金牛的行列!


本文原创发表于博客园,作者为路过秋天,原文链接:http://www.cnblogs.com/cyq1162/p/6144736.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android官方开发文档Training系列课程中文版:连接无线设备之网络服务搜索功能
原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/index.html 引言 Android设备除了可以与服务器建立连接之外,Android无线API还允许处于同一网段下的两台设备建立连接,或者是物理距离相近的两台设备建立连接。
804 0
如何判断自己使用的是appid请求还是pid(partner)请求
appid请求(如下图):   网关是openapi([url]https://openapi.alipaydev.com/gateway.do[/url]) ,appid (年份开头)  pid请求:(如下图):   网关是:mapi ([url]https://mapi.
421 0
Android开发18——获取网络资源之json数据
一、项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。 本文获取web项目返回的JSON数据。Android应用解析JSON比XML性能要好,但有许多项目仍然采用的是XML。     二、实例代码 Web项目 /** * 新闻业务类 * * @author 徐越 * */ public cl
1051 0
TensorFlow新功能:TensorFlow Probability概率编程工具箱介绍
2018年,tensorflow开发者峰会上,tensorflow管理人员发布了:TensorFlow Probability——一种概率编程工具箱,用于机器学习研究人员和从业人员快速可靠地构建利用最先进硬件的复杂模型。快来学习一下吧~
3290 0
+关注
9380
文章
243
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载