作者:陈希章 发表于 2018年1月2日

前言

Microsoft Graph是一张拥有巨大价值的网络,它定义了包括Office 365在内的资源的实体及其关系,它的价值体现在,随着用户积累的数据越来越多,经过授权的应用程序可以在这些数据的基础上得到很多有价值的信息,并且帮助用户更好地完成工作。

Microsoft Graph也是Office 365从单纯的SaaS平台向PaaS平台(Office 365 as a Platform)发展的一个非常重要的基石。既然是一个平台,那么就自然会带来另外一个问题,如果我们有大量的应用是基于Microsoft Graph构建的,而这些应用或多或少是希望保存一些自定义数据的(例如用户的个性化信息),那么这些信息是保存在哪里比较合适?进一步来说,有没有可能在不同的应用之间共享数据呢?

Microsoft Graph通过两种方式来实现这个需求:应用程序可以将自定义数据存放在Graph里面(当然你无需知道具体怎么存),这些数据会一直跟随着目标的对象(例如用户,组等)。这从一方面降低了应用开发的复杂性,也无需承担自行维护这些数据的风险和成本,同时又为在Graph中为不同应用实现数据共享提供了支持。

这两种方式是“开放扩展”和“架构扩展”,前者更加简单,后者则更加强大。下面我分别来展开说明。

开放扩展

关于开放扩展的官方文档,请参考 https://developer.microsoft.com/zh-cn/graph/docs/api-reference/v1.0/resources/opentypeextension,本文带领大家入门,如果想要详细了解各种对象如何自定义扩展,则请参考官方文档。目前下面的对象支持开放扩展。

如果需要调用这个接口,则需要确保授予如下的权限:

下面我用实例介绍一下,如何为“用户对象”定义一个开放扩展,以便保存用户的“社交网络账号信息”。

首先,我们可以通过Post方法,为当前用户创建一个开放扩展(socialaccount),并且添加微信和微博的账号,如下图所示

然后就可以通过Get方法来读取这些属性了,如下图所示

如果要对属性进行修改,则试用PATCH方法,值得注意的是此时可以针对单个属性修改,例如

或者

最后,如果要删除这个开放式扩展,则试用DELETE方法即可。

看起来很方便吧,但需要注意的是,开放扩展是针对单个对象的,就好比上面的例子,我虽然给自己这个用户对象,扩展了一个socialaccount的属性集(里面有两个属性),但是其他用户并不会自动拥有这个扩展。

而且有意思的是,你可以给其他用户也定义开放扩展,但不要求数据格式一样。如下图,虽然我也是给 zhang@office365devlabs.onmicrosoft.com 这个用户定义了一个socialaccount的属性集,但我并没有为其提供微信和微博的账号信息,而是提供了twitter信息。

这种架构是允许的,究其根本原因,是因为开放扩展是针对单个对象的。这种设计带来了灵活性,但也会有一些潜在的问题,例如如果我不知道 zhang@office365devlabs.onmicrosoft.com 并没有定义微信的属性,然后去读取的话就可以会报错。

如果我们希望为某一类对象定义一个统一的扩展,就是让所有的对象实例都拥有一套统一的扩展属性集,则需要使用架构扩展。

结语

本文介绍了使用开放扩展的机制,在Microsoft Graph的资源上面进行数据扩展,以实现应用程序自身的数据保存。

我将在下一篇介绍另外一种扩展方式:架构扩展。

扩展Microsoft Graph数据结构(开放扩展)的更多相关文章

  1. 扩展Microsoft Graph数据结构 - 架构扩展

    前言 此前我有一篇 文章 讲解了Microsoft Graph的一种数据扩展技术-- 开发扩展(Open Extensions),它可以实现在支持的对象(例如用户,组等)上面附加任意的数据.但开放扩展 ...

  2. Microsoft Graph 的 .NET 6 之旅

    这是一篇发布在dotnet 团队博客上由微软Graph首席软件工程师 Joao Paiva写的文章,原文地址: https://devblogs.microsoft.com/dotnet/micros ...

  3. 跨平台应用集成(在ASP.NET Core MVC 应用程序中集成 Microsoft Graph)

    作者:陈希章 发表于 2017年6月25日 谈一谈.NET 的跨平台 终于要写到这一篇了.跨平台的支持可以说是 Office 365 平台在设计伊始就考虑的目标.我在前面的文章已经提到过了,Micro ...

  4. 如何使用 Azure Active Directory 认证和 Microsoft Graph 构建 Blazor Web 应用

    如何使用 Azure Active Directory 认证和 Microsoft Graph 构建 Blazor Web 应用 英文原文:https://developer.microsoft.co ...

  5. 【Azure Developer】使用Microsoft Graph API 如何批量创建用户,用户属性中需要包含自定义字段(如:Store_code,Store_name等)

    Microsoft Graph 是 Microsoft 365 中通往数据和智能的网关. 它提供统一的可编程模型,可用于访问 Microsoft 365.Windows 10 和企业移动性 + 安全性 ...

  6. Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  7. C#扫盲之:带你掌握C#的扩展方法、以及探讨扩展方法的本质、注意事项

    1.为什么需要扩展方法 .NET3.5给我们提供了扩展方法的概念,它的功能是在不修改要添加类型的原有结构时,允许你为类或结构添加新方法. 思考:那么究竟为什么需要扩展方法呢,为什么不直接修改原有类型呢 ...

  8. 在无人值守程序(服务)中调用Microsoft Graph

    作者:陈希章 发表于 2017年5月31日 什么是无人值守程序(服务) 我在此前用了几篇文章分别介绍了在桌面应用程序(控制台),Web应用程序(ASP.NET MVC),以及PowerSehll脚本中 ...

  9. Microsoft Graph Web应用程序极致开发体验

    作者:陈希章 重写于 2017年5月24日 前言 这篇文章最早写于2017年5月2日,当时的想法是从最简单的方式来写如何在一个ASP.NET MVC应用程序中集成Microsoft Graph,但实际 ...

随机推荐

  1. 一、Hadoop学习笔记————概述

    hadoop使用java编写,版本较为混乱,初学者可从1.2.1开始学习

  2. (译)学习JavaScript闭包

    原文地址:https://medium.freecodecamp.org/lets-learn-javascript-closures-66feb44f6a44   闭包是JavaScript中一个基 ...

  3. c# winform treelistview的使用(treegridview)

    TreeView控件显示的内容比较单一,如果需要呈现更详细信息TreeListView是一个不错的选择. 先看效果: 首先需要引用文件System.Windows.Forms.TreeListView ...

  4. C语言之猜数游戏

    #include<stdio.h>#include<stdlib.h>#include<time.h>int main(){ srand(time(0)); int ...

  5. null与undefined的比较

    null在JavaScript中是关键字,它属于一个特殊的值,即空值. 而undefined它不是关键字,它表示未定义,属于预定义的全局变量. null == undefined 返回的是 true  ...

  6. VC++下编译 程序“减肥”

    在vc6 和 vs 2008下 编译 以下代码,不更改任何编译设置(vc6  40k , s2008 7k). 一.vc6下,Release 模式 编译处理. 1.去掉不必要的 链接库  工程(Pro ...

  7. fiddler安装及配置+利用fiddler进行简单抓包(wawayaya阅读)

    1.工欲善其事必先利其器,fiddler安装 https://www.telerik.com/fiddler 2.安装exe(无脑下一步) 3.安装成功后配置fiddler(因为启动fiddler时链 ...

  8. VantPy自动化测试框架

    1.必须要谈的一点,就是我们学习自动测试不是用来炫耀的,而是用来提升自身能力的. 2.这个框架不是通用框架,只是在这里灌输这个框架的思想,让每个人写框架都易如反掌 3.如果没有python基础的同学, ...

  9. NDK开发小记录 C++读取java层对象内容

    这是自己NDK开发得小记录,关于C++层读取java层传来的对象内容. 很简单的一个例子, 1.首先在java层定义了一个类NumList: public class NumList { public ...

  10. Python Django CMDB项目实战之-2创建APP、建模(models.py)、数据库同步、高级URL、前端页面展示数据库中数据

    基于之前的项目代码来编写 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页index页文章页面 现在我们修改一个文章列表是从数据库中获取数据, 下面我们就需 ...