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 ...
随机推荐
- 高性能图片服务器–ZIMG
2011年李彦宏在百度联盟峰会上就提到过互联网的读图时代已经到来1,图片服务早已成为一个互联网应用中占比很大的部分,对图片的处理能力也相应地变成企业和开发者的一项基本技能.需要处理海量图片的典型应用有 ...
- NOI2005 聪聪和可可
Sol 记忆化搜索. \(f[u][v]\) 表示聪聪在 \(u\) ,可可在 \(v\) ,聪聪抓到可可的期望. 预处理出 \(u\) 到 \(v\) 最短路径编号最小的点,记为 \(g[u][v] ...
- 17.3---阶乘尾多少个0(CC150)
思路,其实这题easy,就是看多少个5. 答案: public static int getFactorSuffixZero(int n) { // write code here int res = ...
- ubuntu添加sudo权限
ubuntu有时候没有开通sudo功能,有些操作只能切换到root进行,很不方便. 1.切换到root su root 2.打开suduers文件 gedit /etc/sudoers 3.找到下面这 ...
- ubuntu14.04 server 安装vmware worktation 12
0) Do the basic system installation of Ubuntu 14.04 LTS (Server or Desktop) 1) wget the installer wg ...
- Python模块常用的几种安装方式
Python模块安装方法 一.方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行:pytho ...
- MySQL进程常见的State【转】
为了查阅方便,做个笔记. 通过show processlist查看MySQL的进程状态,在State列上面的状态有如下这些: Analyzing线程对MyISAM 表的统计信息做分析(例如, ANAL ...
- 数据库SQL语句
增删改查 --增加 create INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) --删除 delete DELETE FROM 表名 ...
- zookeeper windows 入门安装和测试
一.序言 以下是我对zookeeper 的一些理解: zookeeper 作为一个服务注册信息存储的管理工具,好吧,这样说得很抽象,我们举个“栗子”. 栗子1号: 假设我是一家 ...
- 在SpringMVC中获取request对象
1.注解法 @Autowired private HttpServletRequest request; 2. 在web.xml中配置一个监听 <listener> <listen ...