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 ...
随机推荐
- Linux system 函数的一些注意事项
在日常的代码编程中 , 我们可以利用system 函数去调用一些我们自己想调用的命令 , 并获取他的返回值. 函数的原型如下: int system(const char *command); 上一 ...
- ndk学习6: 使用gdb调试ndk程序一
生成debug版程序 方法一: 使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件 方法二: 修改A ...
- phpcms导航中添加内部链接
phpcms中栏目有3中类型 1.普通栏目 2.单网页 3.外部链接 其中如果想添加本站的内部链接,可以使用3,然后在添加链接的地方填入剩下的地址即可(需要以/开头) 如: /index.php?m= ...
- SQL Server 中几种常见的约束关系
1.创建唯一约束 当表中已创建主键,但又要保证其他数据列的值唯一时,可以使用唯一约束,并且唯一约束允许NULL值(只有一个) (1)展开指定的数据库: (2)右击要创建唯一约束的表,在弹出的快捷菜单中 ...
- python 3.5.2安装mysql驱动报错
python 3.5.2安装mysql驱动报错 python 3.5.2安装mysql驱动时出现如下异常: [root@localhost www]# pip install mysql-connec ...
- Unity3D研究院之拓展系统自带组件的Inspector视图
转自 http://www.xuanyusong.com/archives/3455 using UnityEngine; using System.Collections; using UnityE ...
- Divide and conquer:Garland(POJ 1759)
挂彩灯 题目大意:就是要布场的时候需要挂彩灯,彩灯挂的高度满足: H1 = A Hi = (Hi-1 + Hi+1)/2 - 1, for all 1 < i < N HN = B Hi ...
- mysql格式化整数类型时间生成年月日时分秒格式(long或string接收)
数据库格式: 数据库mysql语句: FROM_UNIXTIME( s.timemodified, '%Y-%m-%d %h:%i:%s' ) 生成结果: 测试sql为: SELECT *, FROM ...
- eclipse修改jdk后版本冲突问题
将安装的jdk1.8改为1.7之后出现了很淡疼的问题 修改工程下.setting/ org.eclipse.jdt.core.prefs eclipse.preferences.version=1or ...
- JS调用自定义弹窗【bootstrap】
function commonConfirm(msg,call){ showConfirmBox("消息提示",msg,call); } $(document).on('click ...