SlideShare a Scribd company logo
1 of 44
Platinum
Gold
Silver
SharePint
Community
Thanks to our sponsors!
Hi! I’m Seb!
@sebastienlevert | http://sebastienlevert.com | Product Evangelist & Partner Manager at
Agenda
Agenda
SharePoint REST APIs
Our Scenario
• Building a SharePoint Framework webpart that connects to a
SharePoint list to play with its data
• Using a single Interface to define our Data Access services to enable
easy on-the-fly switch of data sources
• Mocking Service for swapping and localWorkbench development
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { IHelpDeskItem } from "./../models/IHelpDeskItem";
import { WebPartContext } from "@microsoft/sp-webpart-base";
export default interface IDataService {
getTitle(): string;
isConfigured(): boolean;
getItems(context: WebPartContext): Promise<IHelpDeskItem[]>;
addItem(context: WebPartContext, item: IHelpDeskItem): Promise<void>;
updateItem(context: WebPartContext, item: IHelpDeskItem): Promise<void>;
deleteItem(context: WebPartContext, item: IHelpDeskItem): Promise<void>;
}
export default class SharePointDataService implements IDataService {
//…
}
Data Service Architecture
Using the SharePoint REST APIs?
• Enable almost all your CRUD scenarios in the solutions you are
building on SharePoint Online and SharePoint On-Premises
• When called from a SharePoint context, no authentication required
as it’s all cookie based
• It follows the OData standards, making it easy to query your content
OData URI at a glance
OData URI at a glance
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Creating a new SPFx Project
yo @Microsoft/sharepoint --skip-install
# Installing all dependencies
npm install
# Opening the newly created project
code .
Creating a new SPFx Project
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Getting all the sessions of the specified list using SharePoint REST APIs
public getItems(context: WebPartContext): Promise<IHelpDeskItem[]> {
return new Promise<IHelpDeskItem[]>((resolve, reject) => {
context.spHttpClient.get(
`${absoluteUrl}/_api/web/lists/GetById('${this._listId}')/items` +
`?$select=*,HelpDeskAssignedTo/Title&$expand=HelpDeskAssignedTo`,
SPHttpClient.configurations.v1)
.then(res => res.json())
.then(res => {
let helpDeskItems:IHelpDeskItem[] = [];
for(let helpDeskListItem of res.value) {
helpDeskItems.push(this.buildHelpDeskItem(helpDeskListItem));
}
resolve(helpDeskItems);
}).catch(err => console.log(err));
});
}
Retrieving Data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Creating a new session in the specified list
public addItem(item: IHelpDeskItem): Promise<void> {
return new Promise<void>((resolve, reject) => {
//…
return this._webPartContext.spHttpClient.post(
`${currentWebUrl}/_api/web/lists/GetById('${this._listId}')/items`,
SPHttpClient.configurations.v1, {
headers: { "Accept": "application/json;odata=nometadata",
"Content-type": "application/json;odata=verbose",
"odata-version": "" },
body: body
});
}).then((response: SPHttpClientResponse): Promise<any> => {
return response.json();
}).then((item: any): void => {
resolve();
});
});
}
Creating Data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Deleting a specific item from the specified list
public deleteItem(id: number): Promise<void> {
return new Promise<void>((resolve, reject) => {
if (!window.confirm(`Are you sure?`)) { return; }
return this._webPartContext.spHttpClient.post(
`${currentWebUrl}/_api/web/lists/GetById('${this._listId}')/items(${id})`,
SPHttpClient.configurations.v1, {
headers: { "Accept": "application/json;odata=nometadata",
"Content-type": "application/json;odata=verbose",
"odata-version": "",
"IF-MATCH": "*",
"X-HTTP-Method": "DELETE" }
}).then((response: SPHttpClientResponse): void => {
resolve();
});
});
}
Deleting Data
Using SharePoint Search
• Using search allows you to query content in multiple lists or multiple
sites or site collections
• Uses a totally other query language (KQL or Keyword Query
Language)
• Very performant and optimized for fetching a lot of data, but has a 15
minutes-ish delay in terms of data freshness
• Does not support any data modification
KQL Crash Course
• See Mickael Svenson blog series “SharePoint Search Queries
Explained”
• https://www.techmikael.com/2014/03/sharepoint-search-queries-
explained.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Getting all the sessions of the specified list using SharePoint Search
public getItems(context: IWebPartContext): Promise<IHelpDeskItem[]> {
return new Promise<IHelpDeskItem[]>((resolve, reject) => {
context.spHttpClient.get(`${absoluteUrl}/_api/search/query?` +
`querytext='ContentTypeId:0x0100…* AND ListID:${this._listId}'` +
`&selectproperties='…'` +
`&orderby='ListItemID asc'`, SPHttpClient.configurations.v1, {
headers: { "odata-version": "3.0" }
}).then(res => res.json()).then(res => {
let helpDeskItems:IHelpDeskItem[] = [];
if(res.PrimaryQueryResult) {
for(var row of res.PrimaryQueryResult.RelevantResults.Table.Rows) {
helpDeskItems.push(this.buildHelpDeskItem(row));
}
}
resolve(helpDeskItems);
});
}
Retrieving Data
Notes on legacy APIs support
• SharePoint APIs cover a wide-range of options, but not everything
• You “might” have to revert to JSOM for some scenarios (Managed
Metadata, etc.)
• Or even to the ASMXWeb Services for more specific scenarios
(Recurring Events in Calendars, etc.)
• The SharePoint Framework supports those scenarios, but will require
some extra work
Microsoft Graph and Custom APIs
What is the Microsoft Graph?
Groups
People
Conversations
Insights
Microsoft Graph is all about you
If you or your customers are part of the millions of users that are using Microsoft
cloud services, then Microsoft Graph is the fabric of all your data
It all starts with /me
Gateway to your data in the Microsoft
cloud
Your app
Gateway
Your or your
customer’s
data
Office 365 Windows 10 Enterprise Mobility + Security
1Microsoft Graph
Microsoft Graph
ALL
Microsoft 365
Office 365
Windows 10
EMS
ALL ONE
https://graph.microsoft.com
Microsoft 365 Platform
web, device,
and service apps
Extend Microsoft 365 experiences
1
iOS/Android/Windows/Web
Build your experience
Microsoft Graph
Options for the Microsoft Graph
• Using the built-in MsGraphClient class that takes care of the entire
authentication flow and token management for you
• Using a custom implementation using ADAL or MSAL
Are there any limitations?
• Every scope will have to be defined beforehand and could open some
security challenges
• Authentication challenges could bring a broken experience to your
users depending on the platform and browser used
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// In your package-solution.json
{
// …
"webApiPermissionRequests": [
{
"resource": "Microsoft Graph",
"scope": "Sites.ReadWrite.All"
},
// …
]
// …
}
Enabling Graph in your solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Getting all the sessions of the specified list using the Microsoft Graph
public getItems(context: WebPartContext): Promise<IHelpDeskItem[]> {
let graphUrl: string = `https://graph.microsoft.com/v1.0` +
`/sites/${this.getCurrentSiteCollectionGraphId()}` +
`/lists/${this._listId}` +
`/items?expand=fields(${this.getFieldsToExpand()})`;
return new Promise<IHelpDeskItem[]>((resolve, reject) => {
this._client.api(graphUrl).get((error, response: any) => {
let helpDeskItems:IHelpDeskItem[] = [];
for(let helpDeskListItem of response.value) {
helpDeskItems.push(this.buildHelpDeskItem(helpDeskListItem));
}
resolve(helpDeskItems);
});
});
}
Retrieving Data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Creating a new item in the specified list
public addItem(item: IHelpDeskItem): Promise<void> {
let graphUrl: string = `https://graph.microsoft.com/v1.0` +
`/sites/${this.getCurrentSiteCollectionGraphId()}` +
`/lists/${this._listId}` +
`/items`;
return new Promise<void>((resolve, reject) => {
const body: any = { "fields" : {
"Title": item.title,
"HelpDeskDescription": item.description,
"HelpDeskLevel": item.level
}};
this._client.api(graphUrl).post(body, (error, response: any) => {
resolve();
});
});
}
Creating Data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Deleting the specified item form the specified list
public deleteItem(id: number): Promise<void> {
let graphUrl: string = `https://graph.microsoft.com/v1.0` +
`/sites/${this.getCurrentSiteCollectionGraphId()}` +
`/lists/${this._listId}` +
`/items/${id}`;
return new Promise<void>((resolve, reject) => {
this._client.api(graphUrl).delete((error, response: any) => {
resolve();
});
});
}
Deleting Data
Custom APIs
• Using the built-in AadGraphClient class that takes care of the entire
authentication flow and token management for you
• Using a custom implementation using ADAL or MSAL
• You can use user impersonation (or not) to query SharePoint content
based on user permissions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Getting all the sessions of the specified list using the AAD Client
public getItems(context: WebPartContext): Promise<IHelpDeskItem[]> {
return new Promise<IHelpDeskItem[]>((resolve, reject) => {
let apiUrl: string = "<url>/api/GetHelpDeskItems";
this._client
.get(apiUrl, AadHttpClient.configurations.v1)
.then((res: HttpClientResponse): Promise<any> => {
return res.json();
}).then((res: any): void => {
let helpDeskItems:IHelpDeskItem[] = [];
for(let helpDeskListItem of res) {
helpDeskItems.push(this.buildHelpDeskItem(helpDeskListItem));
}
resolve(helpDeskItems);
});
});
}
}
Retrieving Data
Patterns & Practices JS Core
What is PnP JS Core?
PnPJS is a fluent JavaScript API for consuming SharePoint and Office 365
REST APIs in a type-safe way.You can use it with SharePoint Framework,
Nodejs, or JavaScript projects.This an open source initiative that
complements existing SDKs provided by Microsoft offering developers
another way to consume information from SharePoint and Office 365.
https://github.com/pnp/pnpjs
Benefits of PnP JS Core
• Type safe so you get your errors while you code and not when you
execute and test
• Works on all versions of SharePoint (On-Premises, Online, etc.)
• Offers built-in caching mechanisms
• Heavily used in the SharePoint Development Community
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { sp } from "@pnp/sp";
// ...
public onInit(): Promise<void> {
return super.onInit().then(_ => {
// other init code may be present
sp.setup({
spfxContext: this.context
});
});
}
// ...
Sample – Setup PnP JS for SharePoint
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Getting all the sessions of the specified list using PnP JS Core
public getItems(context: WebPartContext): Promise<IHelpDeskItem[]> {
return new Promise<IHelpDeskItem[]>((resolve, reject) => {
sp.web.lists.getById(this._listId).items
.select("*", "HelpDeskAssignedTo/Title")
.expand("HelpDeskAssignedTo").getAll().then((sessionItems: any[]) => {
let helpDeskItems:IHelpDeskItem[] = [];
for(let helpDeskListItem of sessionItems) {
helpDeskItems.push(this.buildHelpDeskItem(helpDeskListItem));
}
resolve(helpDeskItems);
});
});
}
Retrieving Data
Next Steps
Resources
• https://docs.microsoft.com/en-us/sharepoint/dev/spfx/web-
parts/guidance/connect-to-sharepoint-using-jsom
• https://www.techmikael.com/2014/03/sharepoint-search-queries-
explained.html
• https://github.com/pnp/pnpjs
• https://github.com/sebastienlevert/apis-apis-everywhere
Share your experience
• Use hashtags to share your experience
• #Office365Dev
• #MicrosoftGraph
• #SPFx
• Log issues & questions to the GitHub Repositories
Thanks!
@sebastienlevert | http://sebastienlevert.com | Product Evangelist & Partner Manager at
SharePoint Data Access with REST APIs and Graph
SharePoint Data Access with REST APIs and Graph

More Related Content

What's hot

O365Con18 - Azure AD Connect Inside and Out - Sander Berkouwer
O365Con18 - Azure AD Connect Inside and Out - Sander BerkouwerO365Con18 - Azure AD Connect Inside and Out - Sander Berkouwer
O365Con18 - Azure AD Connect Inside and Out - Sander BerkouwerNCCOMMS
 
Connect SharePoint Framework solutions to APIs secured with Azure AD
Connect SharePoint Framework solutions to APIs secured with Azure ADConnect SharePoint Framework solutions to APIs secured with Azure AD
Connect SharePoint Framework solutions to APIs secured with Azure ADBIWUG
 
[White/Himmelstein] Bridge the Cloud Divide with Hybrid Business Intelligence
[White/Himmelstein] Bridge the Cloud Divide with Hybrid Business Intelligence[White/Himmelstein] Bridge the Cloud Divide with Hybrid Business Intelligence
[White/Himmelstein] Bridge the Cloud Divide with Hybrid Business IntelligenceEuropean Collaboration Summit
 
SPUnite17 Building Great Client Side Web Parts with SPFx
SPUnite17 Building Great Client Side Web Parts with SPFxSPUnite17 Building Great Client Side Web Parts with SPFx
SPUnite17 Building Great Client Side Web Parts with SPFxNCCOMMS
 
O365Con18 - Hybrid SharePoint Deep Dive - Thomas Vochten
O365Con18 - Hybrid SharePoint Deep Dive - Thomas VochtenO365Con18 - Hybrid SharePoint Deep Dive - Thomas Vochten
O365Con18 - Hybrid SharePoint Deep Dive - Thomas VochtenNCCOMMS
 
O365Con18 - Create an Immersive Experience with Office365 Data and Mixed Real...
O365Con18 - Create an Immersive Experience with Office365 Data and Mixed Real...O365Con18 - Create an Immersive Experience with Office365 Data and Mixed Real...
O365Con18 - Create an Immersive Experience with Office365 Data and Mixed Real...NCCOMMS
 
O365Con18 - New Era of Customizing - Olli Jaaskelainen
O365Con18 - New Era of Customizing - Olli JaaskelainenO365Con18 - New Era of Customizing - Olli Jaaskelainen
O365Con18 - New Era of Customizing - Olli JaaskelainenNCCOMMS
 
Integrating SaaS application using Microsoft’s Azure App Service Platform
Integrating SaaS application using Microsoft’s Azure App Service PlatformIntegrating SaaS application using Microsoft’s Azure App Service Platform
Integrating SaaS application using Microsoft’s Azure App Service PlatformBizTalk360
 
O365Con18 - Customizing SharePoint and Microsoft Teams with SharePoint Framew...
O365Con18 - Customizing SharePoint and Microsoft Teams with SharePoint Framew...O365Con18 - Customizing SharePoint and Microsoft Teams with SharePoint Framew...
O365Con18 - Customizing SharePoint and Microsoft Teams with SharePoint Framew...NCCOMMS
 
ECS19 - Patrick Curran - Expanding User Profiles with Line of Business Data (...
ECS19 - Patrick Curran - Expanding User Profiles with Line of Business Data (...ECS19 - Patrick Curran - Expanding User Profiles with Line of Business Data (...
ECS19 - Patrick Curran - Expanding User Profiles with Line of Business Data (...European Collaboration Summit
 
SPO Migration - New API
SPO Migration - New APISPO Migration - New API
SPO Migration - New APIAshish Trivedi
 
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio StruyfO365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio StruyfNCCOMMS
 
O365Con19 - Developing Timerjob and Eventhandler Equivalents - Adis Jugo
O365Con19 - Developing Timerjob and Eventhandler Equivalents - Adis JugoO365Con19 - Developing Timerjob and Eventhandler Equivalents - Adis Jugo
O365Con19 - Developing Timerjob and Eventhandler Equivalents - Adis JugoNCCOMMS
 
SPUnite17 Timer Jobs Event Handlers
SPUnite17 Timer Jobs Event HandlersSPUnite17 Timer Jobs Event Handlers
SPUnite17 Timer Jobs Event HandlersNCCOMMS
 
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...BizTalk360
 
ECS19 - Tomislav Lulic - What is changed in product/service licensing with Cl...
ECS19 - Tomislav Lulic - What is changed in product/service licensing with Cl...ECS19 - Tomislav Lulic - What is changed in product/service licensing with Cl...
ECS19 - Tomislav Lulic - What is changed in product/service licensing with Cl...European Collaboration Summit
 
[McDermott] Configuring SharePoint Hybrid Search and Taxonomy
[McDermott] Configuring SharePoint Hybrid Search and Taxonomy[McDermott] Configuring SharePoint Hybrid Search and Taxonomy
[McDermott] Configuring SharePoint Hybrid Search and TaxonomyEuropean Collaboration Summit
 

What's hot (20)

O365Con18 - Azure AD Connect Inside and Out - Sander Berkouwer
O365Con18 - Azure AD Connect Inside and Out - Sander BerkouwerO365Con18 - Azure AD Connect Inside and Out - Sander Berkouwer
O365Con18 - Azure AD Connect Inside and Out - Sander Berkouwer
 
Connect SharePoint Framework solutions to APIs secured with Azure AD
Connect SharePoint Framework solutions to APIs secured with Azure ADConnect SharePoint Framework solutions to APIs secured with Azure AD
Connect SharePoint Framework solutions to APIs secured with Azure AD
 
[White/Himmelstein] Bridge the Cloud Divide with Hybrid Business Intelligence
[White/Himmelstein] Bridge the Cloud Divide with Hybrid Business Intelligence[White/Himmelstein] Bridge the Cloud Divide with Hybrid Business Intelligence
[White/Himmelstein] Bridge the Cloud Divide with Hybrid Business Intelligence
 
[Roine] Serverless: Don't Take It Literally
[Roine] Serverless: Don't Take It Literally[Roine] Serverless: Don't Take It Literally
[Roine] Serverless: Don't Take It Literally
 
SPUnite17 Building Great Client Side Web Parts with SPFx
SPUnite17 Building Great Client Side Web Parts with SPFxSPUnite17 Building Great Client Side Web Parts with SPFx
SPUnite17 Building Great Client Side Web Parts with SPFx
 
Sitecore hosted on azure
Sitecore hosted on azureSitecore hosted on azure
Sitecore hosted on azure
 
O365Con18 - Hybrid SharePoint Deep Dive - Thomas Vochten
O365Con18 - Hybrid SharePoint Deep Dive - Thomas VochtenO365Con18 - Hybrid SharePoint Deep Dive - Thomas Vochten
O365Con18 - Hybrid SharePoint Deep Dive - Thomas Vochten
 
O365Con18 - Create an Immersive Experience with Office365 Data and Mixed Real...
O365Con18 - Create an Immersive Experience with Office365 Data and Mixed Real...O365Con18 - Create an Immersive Experience with Office365 Data and Mixed Real...
O365Con18 - Create an Immersive Experience with Office365 Data and Mixed Real...
 
O365Con18 - New Era of Customizing - Olli Jaaskelainen
O365Con18 - New Era of Customizing - Olli JaaskelainenO365Con18 - New Era of Customizing - Olli Jaaskelainen
O365Con18 - New Era of Customizing - Olli Jaaskelainen
 
Integrating SaaS application using Microsoft’s Azure App Service Platform
Integrating SaaS application using Microsoft’s Azure App Service PlatformIntegrating SaaS application using Microsoft’s Azure App Service Platform
Integrating SaaS application using Microsoft’s Azure App Service Platform
 
O365Con18 - Customizing SharePoint and Microsoft Teams with SharePoint Framew...
O365Con18 - Customizing SharePoint and Microsoft Teams with SharePoint Framew...O365Con18 - Customizing SharePoint and Microsoft Teams with SharePoint Framew...
O365Con18 - Customizing SharePoint and Microsoft Teams with SharePoint Framew...
 
ECS19 - Patrick Curran - Expanding User Profiles with Line of Business Data (...
ECS19 - Patrick Curran - Expanding User Profiles with Line of Business Data (...ECS19 - Patrick Curran - Expanding User Profiles with Line of Business Data (...
ECS19 - Patrick Curran - Expanding User Profiles with Line of Business Data (...
 
SPO Migration - New API
SPO Migration - New APISPO Migration - New API
SPO Migration - New API
 
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio StruyfO365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
 
O365Con19 - Developing Timerjob and Eventhandler Equivalents - Adis Jugo
O365Con19 - Developing Timerjob and Eventhandler Equivalents - Adis JugoO365Con19 - Developing Timerjob and Eventhandler Equivalents - Adis Jugo
O365Con19 - Developing Timerjob and Eventhandler Equivalents - Adis Jugo
 
SPUnite17 Timer Jobs Event Handlers
SPUnite17 Timer Jobs Event HandlersSPUnite17 Timer Jobs Event Handlers
SPUnite17 Timer Jobs Event Handlers
 
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
 
Custom dev o365
Custom dev   o365Custom dev   o365
Custom dev o365
 
ECS19 - Tomislav Lulic - What is changed in product/service licensing with Cl...
ECS19 - Tomislav Lulic - What is changed in product/service licensing with Cl...ECS19 - Tomislav Lulic - What is changed in product/service licensing with Cl...
ECS19 - Tomislav Lulic - What is changed in product/service licensing with Cl...
 
[McDermott] Configuring SharePoint Hybrid Search and Taxonomy
[McDermott] Configuring SharePoint Hybrid Search and Taxonomy[McDermott] Configuring SharePoint Hybrid Search and Taxonomy
[McDermott] Configuring SharePoint Hybrid Search and Taxonomy
 

Similar to SharePoint Data Access with REST APIs and Graph

SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!Sébastien Levert
 
SharePoint Conference 2018 - Build an intelligent application by connecting i...
SharePoint Conference 2018 - Build an intelligent application by connecting i...SharePoint Conference 2018 - Build an intelligent application by connecting i...
SharePoint Conference 2018 - Build an intelligent application by connecting i...Sébastien Levert
 
European SharePoint Conference 2018 - Build an intelligent application by con...
European SharePoint Conference 2018 - Build an intelligent application by con...European SharePoint Conference 2018 - Build an intelligent application by con...
European SharePoint Conference 2018 - Build an intelligent application by con...Sébastien Levert
 
SharePoint Saturday Chicago - Everything your need to know about the Microsof...
SharePoint Saturday Chicago - Everything your need to know about the Microsof...SharePoint Saturday Chicago - Everything your need to know about the Microsof...
SharePoint Saturday Chicago - Everything your need to know about the Microsof...Sébastien Levert
 
Office 365 Groups and Tasks API - Getting Started
Office 365 Groups and Tasks API - Getting StartedOffice 365 Groups and Tasks API - Getting Started
Office 365 Groups and Tasks API - Getting StartedDragan Panjkov
 
Vaadin 7 CN
Vaadin 7 CNVaadin 7 CN
Vaadin 7 CNjojule
 
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013Kiril Iliev
 
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobileJavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobileLoiane Groner
 
20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발영욱 김
 
AI: Mobile Apps That Understands Your Intention When You Typed
AI: Mobile Apps That Understands Your Intention When You TypedAI: Mobile Apps That Understands Your Intention When You Typed
AI: Mobile Apps That Understands Your Intention When You TypedMarvin Heng
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Eliran Eliassy
 
Micro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMicro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMichael Dawson
 
Cloud Endpoints _Polymer_ Material design by Martin Görner
Cloud Endpoints_Polymer_Material design by Martin GörnerCloud Endpoints_Polymer_Material design by Martin Görner
Cloud Endpoints _Polymer_ Material design by Martin GörnerEuropean Innovation Academy
 
Sebastian Schmidt, Rachel Myers - How To Go Serverless And Not Violate The GD...
Sebastian Schmidt, Rachel Myers - How To Go Serverless And Not Violate The GD...Sebastian Schmidt, Rachel Myers - How To Go Serverless And Not Violate The GD...
Sebastian Schmidt, Rachel Myers - How To Go Serverless And Not Violate The GD...Codemotion
 
Introduction To Google Android (Ft Rohan Bomle)
Introduction To Google Android (Ft Rohan Bomle)Introduction To Google Android (Ft Rohan Bomle)
Introduction To Google Android (Ft Rohan Bomle)Fafadia Tech
 
NoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices -  Michael HacksteinNoSQL meets Microservices -  Michael Hackstein
NoSQL meets Microservices - Michael Hacksteindistributed matters
 
Leveraging APIs from SharePoint Framework solutions
Leveraging APIs from SharePoint Framework solutionsLeveraging APIs from SharePoint Framework solutions
Leveraging APIs from SharePoint Framework solutionsDragan Panjkov
 

Similar to SharePoint Data Access with REST APIs and Graph (20)

SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!
 
SharePoint Conference 2018 - Build an intelligent application by connecting i...
SharePoint Conference 2018 - Build an intelligent application by connecting i...SharePoint Conference 2018 - Build an intelligent application by connecting i...
SharePoint Conference 2018 - Build an intelligent application by connecting i...
 
European SharePoint Conference 2018 - Build an intelligent application by con...
European SharePoint Conference 2018 - Build an intelligent application by con...European SharePoint Conference 2018 - Build an intelligent application by con...
European SharePoint Conference 2018 - Build an intelligent application by con...
 
SharePoint Saturday Chicago - Everything your need to know about the Microsof...
SharePoint Saturday Chicago - Everything your need to know about the Microsof...SharePoint Saturday Chicago - Everything your need to know about the Microsof...
SharePoint Saturday Chicago - Everything your need to know about the Microsof...
 
Office 365 Groups and Tasks API - Getting Started
Office 365 Groups and Tasks API - Getting StartedOffice 365 Groups and Tasks API - Getting Started
Office 365 Groups and Tasks API - Getting Started
 
Vaadin 7 CN
Vaadin 7 CNVaadin 7 CN
Vaadin 7 CN
 
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
jsSaturday - PhoneGap and jQuery Mobile for SharePoint 2013
 
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobileJavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
JavaOne Brasil 2016: JavaEE e HTML5: da web/desktop ao mobile
 
20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발20150728 100분만에 배우는 windows 10 앱 개발
20150728 100분만에 배우는 windows 10 앱 개발
 
AI: Mobile Apps That Understands Your Intention When You Typed
AI: Mobile Apps That Understands Your Intention When You TypedAI: Mobile Apps That Understands Your Intention When You Typed
AI: Mobile Apps That Understands Your Intention When You Typed
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
 
Micro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMicro app-framework - NodeLive Boston
Micro app-framework - NodeLive Boston
 
Micro app-framework
Micro app-frameworkMicro app-framework
Micro app-framework
 
Vaadin7
Vaadin7Vaadin7
Vaadin7
 
Cloud Endpoints _Polymer_ Material design by Martin Görner
Cloud Endpoints_Polymer_Material design by Martin GörnerCloud Endpoints_Polymer_Material design by Martin Görner
Cloud Endpoints _Polymer_ Material design by Martin Görner
 
Sebastian Schmidt, Rachel Myers - How To Go Serverless And Not Violate The GD...
Sebastian Schmidt, Rachel Myers - How To Go Serverless And Not Violate The GD...Sebastian Schmidt, Rachel Myers - How To Go Serverless And Not Violate The GD...
Sebastian Schmidt, Rachel Myers - How To Go Serverless And Not Violate The GD...
 
Introduction To Google Android (Ft Rohan Bomle)
Introduction To Google Android (Ft Rohan Bomle)Introduction To Google Android (Ft Rohan Bomle)
Introduction To Google Android (Ft Rohan Bomle)
 
NoSQL meets Microservices - Michael Hackstein
NoSQL meets Microservices -  Michael HacksteinNoSQL meets Microservices -  Michael Hackstein
NoSQL meets Microservices - Michael Hackstein
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
 
Leveraging APIs from SharePoint Framework solutions
Leveraging APIs from SharePoint Framework solutionsLeveraging APIs from SharePoint Framework solutions
Leveraging APIs from SharePoint Framework solutions
 

More from BIWUG

Biwug20190425
Biwug20190425Biwug20190425
Biwug20190425BIWUG
 
Working with PowerShell, Visual Studio Code and Github for the reluctant IT Pro
Working with PowerShell, Visual Studio Code and Github for the reluctant IT ProWorking with PowerShell, Visual Studio Code and Github for the reluctant IT Pro
Working with PowerShell, Visual Studio Code and Github for the reluctant IT ProBIWUG
 
Global Office 365 Developer Bootcamp
Global Office 365 Developer BootcampGlobal Office 365 Developer Bootcamp
Global Office 365 Developer BootcampBIWUG
 
Deep dive into advanced teams development
Deep dive into advanced teams developmentDeep dive into advanced teams development
Deep dive into advanced teams developmentBIWUG
 
SharePoint wizards - no magic needed, just use Microsoft Flow
SharePoint wizards - no magic needed, just use Microsoft FlowSharePoint wizards - no magic needed, just use Microsoft Flow
SharePoint wizards - no magic needed, just use Microsoft FlowBIWUG
 
Modern collaboration in teams and projects with Microsoft 365
Modern collaboration in teams and projects with Microsoft 365Modern collaboration in teams and projects with Microsoft 365
Modern collaboration in teams and projects with Microsoft 365BIWUG
 
Mining SharePoint data with PowerBI
Mining SharePoint data with PowerBIMining SharePoint data with PowerBI
Mining SharePoint data with PowerBIBIWUG
 
Don't simply deploy, transform! Build your digital workplace in Office 365
Don't simply deploy, transform! Build your digital workplace in Office 365Don't simply deploy, transform! Build your digital workplace in Office 365
Don't simply deploy, transform! Build your digital workplace in Office 365BIWUG
 
Cloud First. Be Prepared
Cloud First. Be PreparedCloud First. Be Prepared
Cloud First. Be PreparedBIWUG
 
Advanced PowerShell for Office 365
Advanced PowerShell for Office 365Advanced PowerShell for Office 365
Advanced PowerShell for Office 365BIWUG
 
New era of customizing site provisioning
New era of customizing site provisioningNew era of customizing site provisioning
New era of customizing site provisioningBIWUG
 
Microsoft Flow in Real World Projects: 2 Years later & What's next
Microsoft Flow in Real World Projects: 2 Years later & What's nextMicrosoft Flow in Real World Projects: 2 Years later & What's next
Microsoft Flow in Real World Projects: 2 Years later & What's nextBIWUG
 
Microsoft Stream - Your enterprise video portal unleashed
Microsoft Stream - Your enterprise video portal unleashedMicrosoft Stream - Your enterprise video portal unleashed
Microsoft Stream - Your enterprise video portal unleashedBIWUG
 
What's new in SharePoint Server 2019
What's new in SharePoint Server 2019What's new in SharePoint Server 2019
What's new in SharePoint Server 2019BIWUG
 
Why you shouldn't probably care about Machine Learning
Why you shouldn't probably care about Machine LearningWhy you shouldn't probably care about Machine Learning
Why you shouldn't probably care about Machine LearningBIWUG
 
Transforming your classic team sites in group connected team sites
Transforming your classic team sites in group connected team sitesTransforming your classic team sites in group connected team sites
Transforming your classic team sites in group connected team sitesBIWUG
 
Teams - There's no place like home
Teams - There's no place like homeTeams - There's no place like home
Teams - There's no place like homeBIWUG
 
The Future State of Document Management, Taxonomies and Metadata in the Cloud
The Future State of Document Management, Taxonomies and Metadata in the CloudThe Future State of Document Management, Taxonomies and Metadata in the Cloud
The Future State of Document Management, Taxonomies and Metadata in the CloudBIWUG
 
Model Driven PowerApps
Model Driven PowerAppsModel Driven PowerApps
Model Driven PowerAppsBIWUG
 
Microsoft Flow advanced: tips, pitfalls, problems and warnings to be known be...
Microsoft Flow advanced: tips, pitfalls, problems and warnings to be known be...Microsoft Flow advanced: tips, pitfalls, problems and warnings to be known be...
Microsoft Flow advanced: tips, pitfalls, problems and warnings to be known be...BIWUG
 

More from BIWUG (20)

Biwug20190425
Biwug20190425Biwug20190425
Biwug20190425
 
Working with PowerShell, Visual Studio Code and Github for the reluctant IT Pro
Working with PowerShell, Visual Studio Code and Github for the reluctant IT ProWorking with PowerShell, Visual Studio Code and Github for the reluctant IT Pro
Working with PowerShell, Visual Studio Code and Github for the reluctant IT Pro
 
Global Office 365 Developer Bootcamp
Global Office 365 Developer BootcampGlobal Office 365 Developer Bootcamp
Global Office 365 Developer Bootcamp
 
Deep dive into advanced teams development
Deep dive into advanced teams developmentDeep dive into advanced teams development
Deep dive into advanced teams development
 
SharePoint wizards - no magic needed, just use Microsoft Flow
SharePoint wizards - no magic needed, just use Microsoft FlowSharePoint wizards - no magic needed, just use Microsoft Flow
SharePoint wizards - no magic needed, just use Microsoft Flow
 
Modern collaboration in teams and projects with Microsoft 365
Modern collaboration in teams and projects with Microsoft 365Modern collaboration in teams and projects with Microsoft 365
Modern collaboration in teams and projects with Microsoft 365
 
Mining SharePoint data with PowerBI
Mining SharePoint data with PowerBIMining SharePoint data with PowerBI
Mining SharePoint data with PowerBI
 
Don't simply deploy, transform! Build your digital workplace in Office 365
Don't simply deploy, transform! Build your digital workplace in Office 365Don't simply deploy, transform! Build your digital workplace in Office 365
Don't simply deploy, transform! Build your digital workplace in Office 365
 
Cloud First. Be Prepared
Cloud First. Be PreparedCloud First. Be Prepared
Cloud First. Be Prepared
 
Advanced PowerShell for Office 365
Advanced PowerShell for Office 365Advanced PowerShell for Office 365
Advanced PowerShell for Office 365
 
New era of customizing site provisioning
New era of customizing site provisioningNew era of customizing site provisioning
New era of customizing site provisioning
 
Microsoft Flow in Real World Projects: 2 Years later & What's next
Microsoft Flow in Real World Projects: 2 Years later & What's nextMicrosoft Flow in Real World Projects: 2 Years later & What's next
Microsoft Flow in Real World Projects: 2 Years later & What's next
 
Microsoft Stream - Your enterprise video portal unleashed
Microsoft Stream - Your enterprise video portal unleashedMicrosoft Stream - Your enterprise video portal unleashed
Microsoft Stream - Your enterprise video portal unleashed
 
What's new in SharePoint Server 2019
What's new in SharePoint Server 2019What's new in SharePoint Server 2019
What's new in SharePoint Server 2019
 
Why you shouldn't probably care about Machine Learning
Why you shouldn't probably care about Machine LearningWhy you shouldn't probably care about Machine Learning
Why you shouldn't probably care about Machine Learning
 
Transforming your classic team sites in group connected team sites
Transforming your classic team sites in group connected team sitesTransforming your classic team sites in group connected team sites
Transforming your classic team sites in group connected team sites
 
Teams - There's no place like home
Teams - There's no place like homeTeams - There's no place like home
Teams - There's no place like home
 
The Future State of Document Management, Taxonomies and Metadata in the Cloud
The Future State of Document Management, Taxonomies and Metadata in the CloudThe Future State of Document Management, Taxonomies and Metadata in the Cloud
The Future State of Document Management, Taxonomies and Metadata in the Cloud
 
Model Driven PowerApps
Model Driven PowerAppsModel Driven PowerApps
Model Driven PowerApps
 
Microsoft Flow advanced: tips, pitfalls, problems and warnings to be known be...
Microsoft Flow advanced: tips, pitfalls, problems and warnings to be known be...Microsoft Flow advanced: tips, pitfalls, problems and warnings to be known be...
Microsoft Flow advanced: tips, pitfalls, problems and warnings to be known be...
 

Recently uploaded

Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Excelmac1
 
Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Sonam Pathan
 
Chennai Call Girls Alwarpet Phone 🍆 8250192130 👅 celebrity escorts service
Chennai Call Girls Alwarpet Phone 🍆 8250192130 👅 celebrity escorts serviceChennai Call Girls Alwarpet Phone 🍆 8250192130 👅 celebrity escorts service
Chennai Call Girls Alwarpet Phone 🍆 8250192130 👅 celebrity escorts servicevipmodelshub1
 
Contact Rya Baby for Call Girls New Delhi
Contact Rya Baby for Call Girls New DelhiContact Rya Baby for Call Girls New Delhi
Contact Rya Baby for Call Girls New Delhimiss dipika
 
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja VipCall Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja VipCall Girls Lucknow
 
Call Girls South Delhi Delhi reach out to us at ☎ 9711199012
Call Girls South Delhi Delhi reach out to us at ☎ 9711199012Call Girls South Delhi Delhi reach out to us at ☎ 9711199012
Call Girls South Delhi Delhi reach out to us at ☎ 9711199012rehmti665
 
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Sonam Pathan
 
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一Fs
 
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作ys8omjxb
 
Git and Github workshop GDSC MLRITM
Git and Github  workshop GDSC MLRITMGit and Github  workshop GDSC MLRITM
Git and Github workshop GDSC MLRITMgdsc13
 
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls KolkataVIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkataanamikaraghav4
 
Magic exist by Marta Loveguard - presentation.pptx
Magic exist by Marta Loveguard - presentation.pptxMagic exist by Marta Loveguard - presentation.pptx
Magic exist by Marta Loveguard - presentation.pptxMartaLoveguard
 
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一Fs
 
VIP Kolkata Call Girl Kestopur 👉 8250192130 Available With Room
VIP Kolkata Call Girl Kestopur 👉 8250192130  Available With RoomVIP Kolkata Call Girl Kestopur 👉 8250192130  Available With Room
VIP Kolkata Call Girl Kestopur 👉 8250192130 Available With Roomdivyansh0kumar0
 
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)Christopher H Felton
 
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一Fs
 
Complet Documnetation for Smart Assistant Application for Disabled Person
Complet Documnetation   for Smart Assistant Application for Disabled PersonComplet Documnetation   for Smart Assistant Application for Disabled Person
Complet Documnetation for Smart Assistant Application for Disabled Personfurqan222004
 
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一Fs
 

Recently uploaded (20)

Hot Sexy call girls in Rk Puram 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in  Rk Puram 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in  Rk Puram 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Rk Puram 🔝 9953056974 🔝 Delhi escort Service
 
Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...Blepharitis inflammation of eyelid symptoms cause everything included along w...
Blepharitis inflammation of eyelid symptoms cause everything included along w...
 
Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170Call Girls Near The Suryaa Hotel New Delhi 9873777170
Call Girls Near The Suryaa Hotel New Delhi 9873777170
 
Model Call Girl in Jamuna Vihar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in  Jamuna Vihar Delhi reach out to us at 🔝9953056974🔝Model Call Girl in  Jamuna Vihar Delhi reach out to us at 🔝9953056974🔝
Model Call Girl in Jamuna Vihar Delhi reach out to us at 🔝9953056974🔝
 
Chennai Call Girls Alwarpet Phone 🍆 8250192130 👅 celebrity escorts service
Chennai Call Girls Alwarpet Phone 🍆 8250192130 👅 celebrity escorts serviceChennai Call Girls Alwarpet Phone 🍆 8250192130 👅 celebrity escorts service
Chennai Call Girls Alwarpet Phone 🍆 8250192130 👅 celebrity escorts service
 
Contact Rya Baby for Call Girls New Delhi
Contact Rya Baby for Call Girls New DelhiContact Rya Baby for Call Girls New Delhi
Contact Rya Baby for Call Girls New Delhi
 
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja VipCall Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
Call Girls Service Adil Nagar 7001305949 Need escorts Service Pooja Vip
 
Call Girls South Delhi Delhi reach out to us at ☎ 9711199012
Call Girls South Delhi Delhi reach out to us at ☎ 9711199012Call Girls South Delhi Delhi reach out to us at ☎ 9711199012
Call Girls South Delhi Delhi reach out to us at ☎ 9711199012
 
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
Call Girls In The Ocean Pearl Retreat Hotel New Delhi 9873777170
 
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
定制(AUT毕业证书)新西兰奥克兰理工大学毕业证成绩单原版一比一
 
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
Potsdam FH学位证,波茨坦应用技术大学毕业证书1:1制作
 
Git and Github workshop GDSC MLRITM
Git and Github  workshop GDSC MLRITMGit and Github  workshop GDSC MLRITM
Git and Github workshop GDSC MLRITM
 
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls KolkataVIP Call Girls Kolkata Ananya 🤌  8250192130 🚀 Vip Call Girls Kolkata
VIP Call Girls Kolkata Ananya 🤌 8250192130 🚀 Vip Call Girls Kolkata
 
Magic exist by Marta Loveguard - presentation.pptx
Magic exist by Marta Loveguard - presentation.pptxMagic exist by Marta Loveguard - presentation.pptx
Magic exist by Marta Loveguard - presentation.pptx
 
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
定制(Lincoln毕业证书)新西兰林肯大学毕业证成绩单原版一比一
 
VIP Kolkata Call Girl Kestopur 👉 8250192130 Available With Room
VIP Kolkata Call Girl Kestopur 👉 8250192130  Available With RoomVIP Kolkata Call Girl Kestopur 👉 8250192130  Available With Room
VIP Kolkata Call Girl Kestopur 👉 8250192130 Available With Room
 
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
A Good Girl's Guide to Murder (A Good Girl's Guide to Murder, #1)
 
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
定制(UAL学位证)英国伦敦艺术大学毕业证成绩单原版一比一
 
Complet Documnetation for Smart Assistant Application for Disabled Person
Complet Documnetation   for Smart Assistant Application for Disabled PersonComplet Documnetation   for Smart Assistant Application for Disabled Person
Complet Documnetation for Smart Assistant Application for Disabled Person
 
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
定制(Management毕业证书)新加坡管理大学毕业证成绩单原版一比一
 

SharePoint Data Access with REST APIs and Graph

  • 1.
  • 3. Hi! I’m Seb! @sebastienlevert | http://sebastienlevert.com | Product Evangelist & Partner Manager at
  • 7. Our Scenario • Building a SharePoint Framework webpart that connects to a SharePoint list to play with its data • Using a single Interface to define our Data Access services to enable easy on-the-fly switch of data sources • Mocking Service for swapping and localWorkbench development
  • 8. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import { IHelpDeskItem } from "./../models/IHelpDeskItem"; import { WebPartContext } from "@microsoft/sp-webpart-base"; export default interface IDataService { getTitle(): string; isConfigured(): boolean; getItems(context: WebPartContext): Promise<IHelpDeskItem[]>; addItem(context: WebPartContext, item: IHelpDeskItem): Promise<void>; updateItem(context: WebPartContext, item: IHelpDeskItem): Promise<void>; deleteItem(context: WebPartContext, item: IHelpDeskItem): Promise<void>; } export default class SharePointDataService implements IDataService { //… } Data Service Architecture
  • 9. Using the SharePoint REST APIs? • Enable almost all your CRUD scenarios in the solutions you are building on SharePoint Online and SharePoint On-Premises • When called from a SharePoint context, no authentication required as it’s all cookie based • It follows the OData standards, making it easy to query your content
  • 10. OData URI at a glance
  • 11. OData URI at a glance
  • 12. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # Creating a new SPFx Project yo @Microsoft/sharepoint --skip-install # Installing all dependencies npm install # Opening the newly created project code . Creating a new SPFx Project
  • 13. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Getting all the sessions of the specified list using SharePoint REST APIs public getItems(context: WebPartContext): Promise<IHelpDeskItem[]> { return new Promise<IHelpDeskItem[]>((resolve, reject) => { context.spHttpClient.get( `${absoluteUrl}/_api/web/lists/GetById('${this._listId}')/items` + `?$select=*,HelpDeskAssignedTo/Title&$expand=HelpDeskAssignedTo`, SPHttpClient.configurations.v1) .then(res => res.json()) .then(res => { let helpDeskItems:IHelpDeskItem[] = []; for(let helpDeskListItem of res.value) { helpDeskItems.push(this.buildHelpDeskItem(helpDeskListItem)); } resolve(helpDeskItems); }).catch(err => console.log(err)); }); } Retrieving Data
  • 14. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Creating a new session in the specified list public addItem(item: IHelpDeskItem): Promise<void> { return new Promise<void>((resolve, reject) => { //… return this._webPartContext.spHttpClient.post( `${currentWebUrl}/_api/web/lists/GetById('${this._listId}')/items`, SPHttpClient.configurations.v1, { headers: { "Accept": "application/json;odata=nometadata", "Content-type": "application/json;odata=verbose", "odata-version": "" }, body: body }); }).then((response: SPHttpClientResponse): Promise<any> => { return response.json(); }).then((item: any): void => { resolve(); }); }); } Creating Data
  • 15. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Deleting a specific item from the specified list public deleteItem(id: number): Promise<void> { return new Promise<void>((resolve, reject) => { if (!window.confirm(`Are you sure?`)) { return; } return this._webPartContext.spHttpClient.post( `${currentWebUrl}/_api/web/lists/GetById('${this._listId}')/items(${id})`, SPHttpClient.configurations.v1, { headers: { "Accept": "application/json;odata=nometadata", "Content-type": "application/json;odata=verbose", "odata-version": "", "IF-MATCH": "*", "X-HTTP-Method": "DELETE" } }).then((response: SPHttpClientResponse): void => { resolve(); }); }); } Deleting Data
  • 16. Using SharePoint Search • Using search allows you to query content in multiple lists or multiple sites or site collections • Uses a totally other query language (KQL or Keyword Query Language) • Very performant and optimized for fetching a lot of data, but has a 15 minutes-ish delay in terms of data freshness • Does not support any data modification
  • 17. KQL Crash Course • See Mickael Svenson blog series “SharePoint Search Queries Explained” • https://www.techmikael.com/2014/03/sharepoint-search-queries- explained.html
  • 18. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Getting all the sessions of the specified list using SharePoint Search public getItems(context: IWebPartContext): Promise<IHelpDeskItem[]> { return new Promise<IHelpDeskItem[]>((resolve, reject) => { context.spHttpClient.get(`${absoluteUrl}/_api/search/query?` + `querytext='ContentTypeId:0x0100…* AND ListID:${this._listId}'` + `&selectproperties='…'` + `&orderby='ListItemID asc'`, SPHttpClient.configurations.v1, { headers: { "odata-version": "3.0" } }).then(res => res.json()).then(res => { let helpDeskItems:IHelpDeskItem[] = []; if(res.PrimaryQueryResult) { for(var row of res.PrimaryQueryResult.RelevantResults.Table.Rows) { helpDeskItems.push(this.buildHelpDeskItem(row)); } } resolve(helpDeskItems); }); } Retrieving Data
  • 19. Notes on legacy APIs support • SharePoint APIs cover a wide-range of options, but not everything • You “might” have to revert to JSOM for some scenarios (Managed Metadata, etc.) • Or even to the ASMXWeb Services for more specific scenarios (Recurring Events in Calendars, etc.) • The SharePoint Framework supports those scenarios, but will require some extra work
  • 20. Microsoft Graph and Custom APIs
  • 21. What is the Microsoft Graph? Groups People Conversations Insights
  • 22. Microsoft Graph is all about you If you or your customers are part of the millions of users that are using Microsoft cloud services, then Microsoft Graph is the fabric of all your data It all starts with /me
  • 23. Gateway to your data in the Microsoft cloud Your app Gateway Your or your customer’s data Office 365 Windows 10 Enterprise Mobility + Security 1Microsoft Graph
  • 24. Microsoft Graph ALL Microsoft 365 Office 365 Windows 10 EMS ALL ONE https://graph.microsoft.com
  • 25. Microsoft 365 Platform web, device, and service apps Extend Microsoft 365 experiences 1 iOS/Android/Windows/Web Build your experience Microsoft Graph
  • 26. Options for the Microsoft Graph • Using the built-in MsGraphClient class that takes care of the entire authentication flow and token management for you • Using a custom implementation using ADAL or MSAL
  • 27. Are there any limitations? • Every scope will have to be defined beforehand and could open some security challenges • Authentication challenges could bring a broken experience to your users depending on the platform and browser used
  • 28. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // In your package-solution.json { // … "webApiPermissionRequests": [ { "resource": "Microsoft Graph", "scope": "Sites.ReadWrite.All" }, // … ] // … } Enabling Graph in your solution
  • 29. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Getting all the sessions of the specified list using the Microsoft Graph public getItems(context: WebPartContext): Promise<IHelpDeskItem[]> { let graphUrl: string = `https://graph.microsoft.com/v1.0` + `/sites/${this.getCurrentSiteCollectionGraphId()}` + `/lists/${this._listId}` + `/items?expand=fields(${this.getFieldsToExpand()})`; return new Promise<IHelpDeskItem[]>((resolve, reject) => { this._client.api(graphUrl).get((error, response: any) => { let helpDeskItems:IHelpDeskItem[] = []; for(let helpDeskListItem of response.value) { helpDeskItems.push(this.buildHelpDeskItem(helpDeskListItem)); } resolve(helpDeskItems); }); }); } Retrieving Data
  • 30. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Creating a new item in the specified list public addItem(item: IHelpDeskItem): Promise<void> { let graphUrl: string = `https://graph.microsoft.com/v1.0` + `/sites/${this.getCurrentSiteCollectionGraphId()}` + `/lists/${this._listId}` + `/items`; return new Promise<void>((resolve, reject) => { const body: any = { "fields" : { "Title": item.title, "HelpDeskDescription": item.description, "HelpDeskLevel": item.level }}; this._client.api(graphUrl).post(body, (error, response: any) => { resolve(); }); }); } Creating Data
  • 31. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Deleting the specified item form the specified list public deleteItem(id: number): Promise<void> { let graphUrl: string = `https://graph.microsoft.com/v1.0` + `/sites/${this.getCurrentSiteCollectionGraphId()}` + `/lists/${this._listId}` + `/items/${id}`; return new Promise<void>((resolve, reject) => { this._client.api(graphUrl).delete((error, response: any) => { resolve(); }); }); } Deleting Data
  • 32. Custom APIs • Using the built-in AadGraphClient class that takes care of the entire authentication flow and token management for you • Using a custom implementation using ADAL or MSAL • You can use user impersonation (or not) to query SharePoint content based on user permissions
  • 33. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Getting all the sessions of the specified list using the AAD Client public getItems(context: WebPartContext): Promise<IHelpDeskItem[]> { return new Promise<IHelpDeskItem[]>((resolve, reject) => { let apiUrl: string = "<url>/api/GetHelpDeskItems"; this._client .get(apiUrl, AadHttpClient.configurations.v1) .then((res: HttpClientResponse): Promise<any> => { return res.json(); }).then((res: any): void => { let helpDeskItems:IHelpDeskItem[] = []; for(let helpDeskListItem of res) { helpDeskItems.push(this.buildHelpDeskItem(helpDeskListItem)); } resolve(helpDeskItems); }); }); } } Retrieving Data
  • 35. What is PnP JS Core? PnPJS is a fluent JavaScript API for consuming SharePoint and Office 365 REST APIs in a type-safe way.You can use it with SharePoint Framework, Nodejs, or JavaScript projects.This an open source initiative that complements existing SDKs provided by Microsoft offering developers another way to consume information from SharePoint and Office 365. https://github.com/pnp/pnpjs
  • 36. Benefits of PnP JS Core • Type safe so you get your errors while you code and not when you execute and test • Works on all versions of SharePoint (On-Premises, Online, etc.) • Offers built-in caching mechanisms • Heavily used in the SharePoint Development Community
  • 37. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import { sp } from "@pnp/sp"; // ... public onInit(): Promise<void> { return super.onInit().then(_ => { // other init code may be present sp.setup({ spfxContext: this.context }); }); } // ... Sample – Setup PnP JS for SharePoint
  • 38. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // Getting all the sessions of the specified list using PnP JS Core public getItems(context: WebPartContext): Promise<IHelpDeskItem[]> { return new Promise<IHelpDeskItem[]>((resolve, reject) => { sp.web.lists.getById(this._listId).items .select("*", "HelpDeskAssignedTo/Title") .expand("HelpDeskAssignedTo").getAll().then((sessionItems: any[]) => { let helpDeskItems:IHelpDeskItem[] = []; for(let helpDeskListItem of sessionItems) { helpDeskItems.push(this.buildHelpDeskItem(helpDeskListItem)); } resolve(helpDeskItems); }); }); } Retrieving Data
  • 41. Share your experience • Use hashtags to share your experience • #Office365Dev • #MicrosoftGraph • #SPFx • Log issues & questions to the GitHub Repositories
  • 42. Thanks! @sebastienlevert | http://sebastienlevert.com | Product Evangelist & Partner Manager at