ODATA WEB API(一)---扩展使用
一、概述
时间也算充足,抽点时间总结下OData的常用的使用方式,开放数据协议(OData)是一个查询和更新数据的Web协议。OData应用了web技术如HTTP、Atom发布协议(AtomPub)和JSON等来提供对不同应用程序,服务和存储的信息访问。除了提供一些基本的操作(像增删改查),也提供了一些高级的操作类似过滤数据和实体的导航。OData扩展了上述的协议但是不是取代他们。他可以被XML(ATOM)或者JSON取代但是OData的重要在于它符合REST原则。在某种意义上,它建立在'简单'的REST HTTP 服务上,并且有着清晰的目标——简化和标准化我们操作和查询数据的方式。如果你过去在给你的REST服务创建搜索、过滤、或者分页API的时候感觉很麻烦,那么OData将是一个不错的选择。
二、WEB API使用:
1、通过NuGet获取 Microsoft.AspNet.WebApi.OData 第三方插件DLL,Microsoft.AspNet.WebApi.OData提供可一系列的类扩展了Web API。
2、WebApiConfig进行下面代码添加,开启OData支持;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Net.Http.Formatting;
using System.Web.Http.OData.Extensions; namespace MyMVCOData
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{ // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
); //启用Odata查询
config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml"); //config.EnableQuerySupport();
config.AddODataQueryFilter(); //config.SetTimeZoneInfo(TimeZoneInfo.Local);
}
}
}
备注:
添加命名空间:using System.Net.Http.Formatting;
config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");
功能说明:这段代码支持WebAPI数据接口显示可以以XML显示也可以以json格式显示,调用的时候如下:
http://localhost:port/api/ProjectManagent?$format=json 此处以json格式显示结果
http://localhost:port/api/ProjectManagent?$format=xml 此处以xml格式显示结果
3、编写接口 API Control
添加Control 代码如下:
using MyMVCOData.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.OData;
using System.Web.Http.OData.Query; namespace MyMVCOData.Controllers
{
public class MeetingsController : ApiController
{
private readonly IList<Meeting> _scheduledMeetings; public MeetingsController()
{
_scheduledMeetings = new List<Meeting>
{
new Meeting { Id = "", Leader = "Mark Nichols", MeetingDate = new DateTime(, , ), Title = "Project X Planning" },
new Meeting { Id = "", Leader = "Jim Phelps", MeetingDate = new DateTime(, , ), Title = "Mission Discussion" },
new Meeting { Id = "", Leader = "Barney Collier", MeetingDate = new DateTime(, , ), Title = "Advanced Device Technology" },
new Meeting { Id = "", Leader = "Willie Armitage", MeetingDate = new DateTime(, , ), Title = "Maintaining a Strong Presence" },
new Meeting { Id = "", Leader = "Cinnamon Carter", MeetingDate = new DateTime(, , ), Title = "Company Fashion" },
new Meeting { Id = "", Leader = "Rollin Hand", MeetingDate = new DateTime(, , ), Title = "Magic Selling" }
};
} // GET api/Meeting
//[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
//[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
//[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.Top | AllowedQueryOptions.Skip)]
//[EnableQuery(MaxTop = 100)] 配置调用限制项目
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All,MaxTop =, MaxSkip = ,PageSize =,AllowedFunctions = AllowedFunctions.All)]
public IQueryable<Meeting> Get()
{
return _scheduledMeetings.AsQueryable();
}
}
}
4、接口调用说明:
下表列举了一些常用的Odata操作:
|
操作 |
URL |
说明 |
| $filter | http://localhost:8090/api/Meetings?$filter=ProductName eq 'Tofu' | 根据表达式的状态返回结果(返回ProductName 等于Tofu的Products) |
| $orderby | http://localhost:8090/api/Meetings?$orderby=ProductName | 根据结果排序(根据ProductName列排序) |
| $skip | http://localhost:8090/api/Meetings?$skip=10 | 越过结果中的n条数据,常用于分页 |
| $top | http://localhost:8090/api/Meetings?$top=10 | 返回结果中的前n条记录,常用于分页 |
| $select | http://localhost:8090/api/Meetings?$filter=ProductName eq 'Tofu'&$select=ProductName,UnitPrice | 选择需要返回的属性 |
| $expand | http://localhost:8090/api/Meetings?$expand=Supplier | 返回Products中包含的导航属性(关联属性)Supplier |
| $inlinecount | http://localhost:8090/api/Meetings?$inlinecount=allpages | 向服务器获取符合条件的资源总数(分页的total值) |
通过上面表格的内容,我们还可以通过组合查询条件来实现复杂的查询。
常用查询举例:
示例1:列出所有Product
URL:http://localhost:8914/Products
示例2,查询Products,只列出Name,Price例
URL:http://localhost:8914/Products?$select=Name,Price
示例3:列出Products(只有列Name,Price),包括Supplier
URL:http://localhost:8914/Products?$select=Name,Price&$expand=Supplier
示例4:过滤Products,只显示分类为Test的数据
URL:http://localhost:8914/Products?$filter=Category eq ’Test‘
示例5:过滤Products,只显示分类为Test的数据,并排序
URL:http://localhost:8914/Products?$filter=Category eq ’Test‘&$orderby=Price desc
$filter的其它的使用方式:
1. http://localhost/Products?$filter=Category eq 'Test'
过滤Category=Test
2.http://localhost/Products?$filter=Price lt 10
过滤Price小于10
3.http://localhost/Products?$filter=Price ge 5 and Price le 15
过滤5<=Price>=15
4.还可以使用数据库函数如:
$filter=substringof('zz',Name)
$filter=year(ReleaseDate) gt 2005
5.关于排序:
$orderby=Price
$orderby=Price desc
$orderby=Category,Price desc
6.还有一些过滤器如:
$skip,$top,$inlinecount等等
四、参考博客:
http://www.cnblogs.com/liuju150/p/4602715.html
http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html
五、后续问题:
针对查询结果时间的输出,目前输出的格式是:
"MeetingDate": "2016-08-27T08:27:46.2664375+08:00" 如将日期的输出格式是我们自定义的如:2016-08-27 08:27:46
ODATA WEB API(一)---扩展使用的更多相关文章
- ODATA WEB API(二)----ODATA服务与客户端
一.概述 ODATA不经可以作为WebAPI建立相应的WEBAPI控制器,还可以建立ODataControl控制器,能够通过插件建立第三方ODataClinet类库:调用和使用数据变得简单可行. 二. ...
- 通过扩展让ASP.NET Web API支持W3C的CORS规范
让ASP.NET Web API支持JSONP和W3C的CORS规范是解决"跨域资源共享"的两种途径,在<通过扩展让ASP.NET Web API支持JSONP>中我们 ...
- 通过扩展让ASP.NET Web API支持W3C的CORS规范(转载)
转载地址:http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-04.html CORS(Cross-Origin Resource Shari ...
- asp.net web api 版本控制
版本控制 版本控制的方法有很多,这里提供一种将Odata与普通web api版本控制机制统一的方法,但也可以单独控制,整合控制与单独控制主要的不同是:整合控制通过VersionController ...
- ASP.NET Web API编程——版本控制
版本控制 版本控制的方法有很多,这里提供一种将Odata与普通web api版本控制机制统一的方法,但也可以单独控制,整合控制与单独控制主要的不同是:整合控制通过VersionController ...
- ASP.NET Web API 安全筛选器
原文:https://msdn.microsoft.com/zh-cn/magazine/dn781361.aspx 身份验证和授权是应用程序安全的基础.身份验证通过验证提供的凭据来确定用户身份,而授 ...
- Asp.Net Web API(一)
什么是Web API HTTP不仅仅服务于Web Pages.他也是一个创建展示服务和数据的API的强大平台.HTTP是简单的,灵活的,无处不在的.你能够想象到几乎任何的平台都会有HTTP服务库.HT ...
- [转帖]Asp.net MVC 与 Asp.net Web API 区别
Asp.net MVC 与 Asp.net Web API 区别 https://www.cnblogs.com/viktor988/ https://www.cnblogs.com/terry283 ...
- .NET MVC & Web API Cors让AJAX 实现跨域
什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...
随机推荐
- PHP5.4开启zend opcache缓存
PHP5.5整合了zend opcache,但是5.4以下的需要自己安装. 介绍一下开启opcache方法,环境为wamp(php5.4.16) 下载dll文件 把php_opcache.dll放进p ...
- php preg_match($p, $str, $match)方法简介
方法作用:匹配指定的正则表达式并将结果放在$match数组中 代码示例: $p = '/name:([\\ws]+)/'; $str = "name:steven jobs"; p ...
- php上传文件大小限制修改
打开php.ini 1.最大上传文件大小: upload_max_filesize=2M 改成自己需要的大小 2.最大post大小: post_max_size=2M 改成自己需要的大小,第二个一般比 ...
- phpcms--模型管理,推荐位管理,类别管理
phpcms的默认设置不一定能满足需求,这个时候必须启用[模型管理],[推荐位管理],[类别管理]三个高级功能 为什么需要使用这些功能呢,因为后台添加内容的时候需要不同的模型 而模型通过什么来展现呢, ...
- excle导入
public function import_upload(){ set_time_limit(900); if(!empty($_FILES ['xls_path']['name'])){ $tmp ...
- Spring框架学习[IoC容器高级特性]
1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...
- 安装m2crypto报错swig error : Unrecognized option -builtin
M2Crypto 是最完整的为 Python 包装 OpenSSL 的 RSA,DSA,DH,EC,HMACs,消息摘要,对称密码算法(包括AES)的一个库工具.而自从 M2Crypto 升级到版本 ...
- 彻底卸载MySql
刚装了下MySql,装的过程中由于修改了服务名,导致最后配置假死,不得已,重装. 但是重装时总是失败,于是google了一下,找到彻底卸载mysql的方法: 最近安装本地测试用 MySQL 服务器时总 ...
- ffmpeg-20160701-git-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...
- CentOS 6.6 (Desktop)部署Apache、MySQL以及Eclipse Luna等记录
内容较多,持续更新(2015-03-12 16:37:05) *如果没有特别说明,以下操作都是在root账号下完成,图形界面为GNOME. 一.防火墙 先从防火墙入手,为了后续的环境搭建,需要打开80 ...