SlideShare a Scribd company logo
1 of 42
APIs, APIs Everywhere!
Sébastien Levert
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

More Related Content

What's hot

Android DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureAndroid DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureiMasters
 
Converting Your Mobile App to the Mobile Cloud
Converting Your Mobile App to the Mobile CloudConverting Your Mobile App to the Mobile Cloud
Converting Your Mobile App to the Mobile CloudRoger Brinkley
 
Mobile for SharePoint with Windows Phone
Mobile for SharePoint with Windows PhoneMobile for SharePoint with Windows Phone
Mobile for SharePoint with Windows PhoneEdgewater
 
Building AOL's High Performance, Enterprise Wide Mail Application With Silver...
Building AOL's High Performance, Enterprise Wide Mail Application With Silver...Building AOL's High Performance, Enterprise Wide Mail Application With Silver...
Building AOL's High Performance, Enterprise Wide Mail Application With Silver...goodfriday
 
Creating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-htmlCreating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-htmlIlia Idakiev
 
Data Access Options in SharePoint 2010
Data Access Options in SharePoint 2010Data Access Options in SharePoint 2010
Data Access Options in SharePoint 2010Rob Windsor
 
Universal JS Web Applications with React - Web Summer Camp 2017, Rovinj (Work...
Universal JS Web Applications with React - Web Summer Camp 2017, Rovinj (Work...Universal JS Web Applications with React - Web Summer Camp 2017, Rovinj (Work...
Universal JS Web Applications with React - Web Summer Camp 2017, Rovinj (Work...Luciano Mammino
 
Engage 2013 - Why Upgrade to v10 Tag
Engage 2013 - Why Upgrade to v10 TagEngage 2013 - Why Upgrade to v10 Tag
Engage 2013 - Why Upgrade to v10 TagWebtrends
 
Server side data sync for mobile apps with silex
Server side data sync for mobile apps with silexServer side data sync for mobile apps with silex
Server side data sync for mobile apps with silexMichele Orselli
 
Implementing data sync apis for mibile apps @cloudconf
Implementing data sync apis for mibile apps @cloudconfImplementing data sync apis for mibile apps @cloudconf
Implementing data sync apis for mibile apps @cloudconfMichele Orselli
 
Reactive programming every day
Reactive programming every dayReactive programming every day
Reactive programming every dayVadym Khondar
 
2005 - .NET Chaostage: 1st class data driven applications with ASP.NET 2.0
2005 - .NET Chaostage: 1st class data driven applications with ASP.NET 2.02005 - .NET Chaostage: 1st class data driven applications with ASP.NET 2.0
2005 - .NET Chaostage: 1st class data driven applications with ASP.NET 2.0Daniel Fisher
 
AtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using nowAtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using nowAtlassian
 

What's hot (20)

Android DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureAndroid DevConference - Android Clean Architecture
Android DevConference - Android Clean Architecture
 
Converting Your Mobile App to the Mobile Cloud
Converting Your Mobile App to the Mobile CloudConverting Your Mobile App to the Mobile Cloud
Converting Your Mobile App to the Mobile Cloud
 
Mobile for SharePoint with Windows Phone
Mobile for SharePoint with Windows PhoneMobile for SharePoint with Windows Phone
Mobile for SharePoint with Windows Phone
 
Building AOL's High Performance, Enterprise Wide Mail Application With Silver...
Building AOL's High Performance, Enterprise Wide Mail Application With Silver...Building AOL's High Performance, Enterprise Wide Mail Application With Silver...
Building AOL's High Performance, Enterprise Wide Mail Application With Silver...
 
Creating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-htmlCreating lightweight JS Apps w/ Web Components and lit-html
Creating lightweight JS Apps w/ Web Components and lit-html
 
React lecture
React lectureReact lecture
React lecture
 
Vaadin7
Vaadin7Vaadin7
Vaadin7
 
Data Access Options in SharePoint 2010
Data Access Options in SharePoint 2010Data Access Options in SharePoint 2010
Data Access Options in SharePoint 2010
 
Firebase ng2 zurich
Firebase ng2 zurichFirebase ng2 zurich
Firebase ng2 zurich
 
Active x
Active xActive x
Active x
 
Angular mix chrisnoring
Angular mix chrisnoringAngular mix chrisnoring
Angular mix chrisnoring
 
Universal JS Web Applications with React - Web Summer Camp 2017, Rovinj (Work...
Universal JS Web Applications with React - Web Summer Camp 2017, Rovinj (Work...Universal JS Web Applications with React - Web Summer Camp 2017, Rovinj (Work...
Universal JS Web Applications with React - Web Summer Camp 2017, Rovinj (Work...
 
Engage 2013 - Why Upgrade to v10 Tag
Engage 2013 - Why Upgrade to v10 TagEngage 2013 - Why Upgrade to v10 Tag
Engage 2013 - Why Upgrade to v10 Tag
 
Server side data sync for mobile apps with silex
Server side data sync for mobile apps with silexServer side data sync for mobile apps with silex
Server side data sync for mobile apps with silex
 
Implementing data sync apis for mibile apps @cloudconf
Implementing data sync apis for mibile apps @cloudconfImplementing data sync apis for mibile apps @cloudconf
Implementing data sync apis for mibile apps @cloudconf
 
Practical
PracticalPractical
Practical
 
Reactive programming every day
Reactive programming every dayReactive programming every day
Reactive programming every day
 
Grails Advanced
Grails Advanced Grails Advanced
Grails Advanced
 
2005 - .NET Chaostage: 1st class data driven applications with ASP.NET 2.0
2005 - .NET Chaostage: 1st class data driven applications with ASP.NET 2.02005 - .NET Chaostage: 1st class data driven applications with ASP.NET 2.0
2005 - .NET Chaostage: 1st class data driven applications with ASP.NET 2.0
 
AtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using nowAtlasCamp 2015: Web technologies you should be using now
AtlasCamp 2015: Web technologies you should be using now
 

Similar to APIs for SharePoint Data Access

SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
SharePoint Saturday Belgium 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
 
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
 
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
 
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
 
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
 
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09Daniel Bryant
 
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
 
Quick and Easy Development with Node.js and Couchbase Server
Quick and Easy Development with Node.js and Couchbase ServerQuick and Easy Development with Node.js and Couchbase Server
Quick and Easy Development with Node.js and Couchbase ServerNic Raboy
 
Micro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMicro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMichael Dawson
 
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
 
bbyopenApp_Code.DS_StorebbyopenApp_CodeVBCodeGoogleMaps.docx
bbyopenApp_Code.DS_StorebbyopenApp_CodeVBCodeGoogleMaps.docxbbyopenApp_Code.DS_StorebbyopenApp_CodeVBCodeGoogleMaps.docx
bbyopenApp_Code.DS_StorebbyopenApp_CodeVBCodeGoogleMaps.docxikirkton
 
Android app development basics
Android app development basicsAndroid app development basics
Android app development basicsAnton Narusberg
 
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
 
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
 

Similar to APIs for SharePoint Data Access (20)

SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!SharePoint Saturday Belgium 2018 - APIs, APIs everywhere!
SharePoint Saturday Belgium 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...
 
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
 
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...
 
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
 
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
 
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09L2 Web App Development Guest Lecture At University of Surrey 20/11/09
L2 Web App Development Guest Lecture At University of Surrey 20/11/09
 
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)
 
Quick and Easy Development with Node.js and Couchbase Server
Quick and Easy Development with Node.js and Couchbase ServerQuick and Easy Development with Node.js and Couchbase Server
Quick and Easy Development with Node.js and Couchbase Server
 
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
 
Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics Angular server side rendering - Strategies & Technics
Angular server side rendering - Strategies & Technics
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
 
bbyopenApp_Code.DS_StorebbyopenApp_CodeVBCodeGoogleMaps.docx
bbyopenApp_Code.DS_StorebbyopenApp_CodeVBCodeGoogleMaps.docxbbyopenApp_Code.DS_StorebbyopenApp_CodeVBCodeGoogleMaps.docx
bbyopenApp_Code.DS_StorebbyopenApp_CodeVBCodeGoogleMaps.docx
 
Android app development basics
Android app development basicsAndroid app development basics
Android app development basics
 
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...
 
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
 

More from Sébastien Levert

SharePoint Fest Chicago 2019 - Build a Full Intranet in 70 minutes
SharePoint Fest Chicago 2019 - Build a Full Intranet in 70 minutesSharePoint Fest Chicago 2019 - Build a Full Intranet in 70 minutes
SharePoint Fest Chicago 2019 - Build a Full Intranet in 70 minutesSébastien Levert
 
SharePoint Fest Chicago 2019 - Building tailored search experiences in Modern...
SharePoint Fest Chicago 2019 - Building tailored search experiences in Modern...SharePoint Fest Chicago 2019 - Building tailored search experiences in Modern...
SharePoint Fest Chicago 2019 - Building tailored search experiences in Modern...Sébastien Levert
 
SharePoint Fest Chicago 2019 - From SharePoint to Office 365 Development
SharePoint Fest Chicago 2019 - From SharePoint to Office 365 DevelopmentSharePoint Fest Chicago 2019 - From SharePoint to Office 365 Development
SharePoint Fest Chicago 2019 - From SharePoint to Office 365 DevelopmentSébastien Levert
 
ESPC19 - Supercharge Your Teams Experience with Advanced Development Techniques
ESPC19 - Supercharge Your Teams Experience with Advanced Development TechniquesESPC19 - Supercharge Your Teams Experience with Advanced Development Techniques
ESPC19 - Supercharge Your Teams Experience with Advanced Development TechniquesSébastien Levert
 
ESPC19 - Build Your First Microsoft Teams App Using SPFx
ESPC19 - Build Your First Microsoft Teams App Using SPFxESPC19 - Build Your First Microsoft Teams App Using SPFx
ESPC19 - Build Your First Microsoft Teams App Using SPFxSébastien Levert
 
SharePoint Fest Seattle 2019 - From SharePoint to Office 365 Development
SharePoint Fest Seattle 2019 - From SharePoint to Office 365 DevelopmentSharePoint Fest Seattle 2019 - From SharePoint to Office 365 Development
SharePoint Fest Seattle 2019 - From SharePoint to Office 365 DevelopmentSébastien Levert
 
SharePoint Fest Seattle 2019 - Building tailored search experiences in Modern...
SharePoint Fest Seattle 2019 - Building tailored search experiences in Modern...SharePoint Fest Seattle 2019 - Building tailored search experiences in Modern...
SharePoint Fest Seattle 2019 - Building tailored search experiences in Modern...Sébastien Levert
 
SPC19 - Building tailored search experiences in Modern SharePoint
SPC19 - Building tailored search experiences in Modern SharePointSPC19 - Building tailored search experiences in Modern SharePoint
SPC19 - Building tailored search experiences in Modern SharePointSébastien Levert
 
SharePoint Fest 2019 - Build an intelligent application by connecting it to t...
SharePoint Fest 2019 - Build an intelligent application by connecting it to t...SharePoint Fest 2019 - Build an intelligent application by connecting it to t...
SharePoint Fest 2019 - Build an intelligent application by connecting it to t...Sébastien Levert
 
SharePoint Fest DC 2019 - Bot Framework and Microsoft Graph - Join The Revolu...
SharePoint Fest DC 2019 - Bot Framework and Microsoft Graph - Join The Revolu...SharePoint Fest DC 2019 - Bot Framework and Microsoft Graph - Join The Revolu...
SharePoint Fest DC 2019 - Bot Framework and Microsoft Graph - Join The Revolu...Sébastien Levert
 
SharePoint Fest DC 2019 - From SharePoint to Office 365 Development
SharePoint Fest DC 2019 - From SharePoint to Office 365 DevelopmentSharePoint Fest DC 2019 - From SharePoint to Office 365 Development
SharePoint Fest DC 2019 - From SharePoint to Office 365 DevelopmentSébastien Levert
 
Webinar - 2020-03-24 - Build your first Microsoft Teams app using SPFx
Webinar - 2020-03-24 - Build your first Microsoft Teams app using SPFxWebinar - 2020-03-24 - Build your first Microsoft Teams app using SPFx
Webinar - 2020-03-24 - Build your first Microsoft Teams app using SPFxSébastien Levert
 
SPTechCon Austin 2019 - Top 10 feature trends to make you fall in love with y...
SPTechCon Austin 2019 - Top 10 feature trends to make you fall in love with y...SPTechCon Austin 2019 - Top 10 feature trends to make you fall in love with y...
SPTechCon Austin 2019 - Top 10 feature trends to make you fall in love with y...Sébastien Levert
 
SPTechCon Austin 2019 - From SharePoint to Office 365 development
SPTechCon Austin 2019 - From SharePoint to Office 365 developmentSPTechCon Austin 2019 - From SharePoint to Office 365 development
SPTechCon Austin 2019 - From SharePoint to Office 365 developmentSébastien Levert
 
SharePoint Fest Chicago 2018 - From SharePoint to Office 365 development
SharePoint Fest Chicago 2018 - From SharePoint to Office 365 developmentSharePoint Fest Chicago 2018 - From SharePoint to Office 365 development
SharePoint Fest Chicago 2018 - From SharePoint to Office 365 developmentSébastien Levert
 
SharePoint Saturday Vienna 2018 - Top 10 feature trends to make you fall in l...
SharePoint Saturday Vienna 2018 - Top 10 feature trends to make you fall in l...SharePoint Saturday Vienna 2018 - Top 10 feature trends to make you fall in l...
SharePoint Saturday Vienna 2018 - Top 10 feature trends to make you fall in l...Sébastien Levert
 
SharePoint Saturday Vienna 2018 - Building a modern intranet in 60 minutes
SharePoint Saturday Vienna 2018 - Building a modern intranet in 60 minutesSharePoint Saturday Vienna 2018 - Building a modern intranet in 60 minutes
SharePoint Saturday Vienna 2018 - Building a modern intranet in 60 minutesSébastien Levert
 
Nashville SharePoint User Group 2018 - Building a modern intranet in 60 minutes
Nashville SharePoint User Group 2018 - Building a modern intranet in 60 minutesNashville SharePoint User Group 2018 - Building a modern intranet in 60 minutes
Nashville SharePoint User Group 2018 - Building a modern intranet in 60 minutesSébastien Levert
 
SharePoint Fest Seattle 2018 - Build an intelligent application by connecting...
SharePoint Fest Seattle 2018 - Build an intelligent application by connecting...SharePoint Fest Seattle 2018 - Build an intelligent application by connecting...
SharePoint Fest Seattle 2018 - Build an intelligent application by connecting...Sébastien Levert
 
SharePoint Fest Seattle 2018 - From SharePoint to Office 365 Development
SharePoint Fest Seattle 2018 - From SharePoint to Office 365 DevelopmentSharePoint Fest Seattle 2018 - From SharePoint to Office 365 Development
SharePoint Fest Seattle 2018 - From SharePoint to Office 365 DevelopmentSébastien Levert
 

More from Sébastien Levert (20)

SharePoint Fest Chicago 2019 - Build a Full Intranet in 70 minutes
SharePoint Fest Chicago 2019 - Build a Full Intranet in 70 minutesSharePoint Fest Chicago 2019 - Build a Full Intranet in 70 minutes
SharePoint Fest Chicago 2019 - Build a Full Intranet in 70 minutes
 
SharePoint Fest Chicago 2019 - Building tailored search experiences in Modern...
SharePoint Fest Chicago 2019 - Building tailored search experiences in Modern...SharePoint Fest Chicago 2019 - Building tailored search experiences in Modern...
SharePoint Fest Chicago 2019 - Building tailored search experiences in Modern...
 
SharePoint Fest Chicago 2019 - From SharePoint to Office 365 Development
SharePoint Fest Chicago 2019 - From SharePoint to Office 365 DevelopmentSharePoint Fest Chicago 2019 - From SharePoint to Office 365 Development
SharePoint Fest Chicago 2019 - From SharePoint to Office 365 Development
 
ESPC19 - Supercharge Your Teams Experience with Advanced Development Techniques
ESPC19 - Supercharge Your Teams Experience with Advanced Development TechniquesESPC19 - Supercharge Your Teams Experience with Advanced Development Techniques
ESPC19 - Supercharge Your Teams Experience with Advanced Development Techniques
 
ESPC19 - Build Your First Microsoft Teams App Using SPFx
ESPC19 - Build Your First Microsoft Teams App Using SPFxESPC19 - Build Your First Microsoft Teams App Using SPFx
ESPC19 - Build Your First Microsoft Teams App Using SPFx
 
SharePoint Fest Seattle 2019 - From SharePoint to Office 365 Development
SharePoint Fest Seattle 2019 - From SharePoint to Office 365 DevelopmentSharePoint Fest Seattle 2019 - From SharePoint to Office 365 Development
SharePoint Fest Seattle 2019 - From SharePoint to Office 365 Development
 
SharePoint Fest Seattle 2019 - Building tailored search experiences in Modern...
SharePoint Fest Seattle 2019 - Building tailored search experiences in Modern...SharePoint Fest Seattle 2019 - Building tailored search experiences in Modern...
SharePoint Fest Seattle 2019 - Building tailored search experiences in Modern...
 
SPC19 - Building tailored search experiences in Modern SharePoint
SPC19 - Building tailored search experiences in Modern SharePointSPC19 - Building tailored search experiences in Modern SharePoint
SPC19 - Building tailored search experiences in Modern SharePoint
 
SharePoint Fest 2019 - Build an intelligent application by connecting it to t...
SharePoint Fest 2019 - Build an intelligent application by connecting it to t...SharePoint Fest 2019 - Build an intelligent application by connecting it to t...
SharePoint Fest 2019 - Build an intelligent application by connecting it to t...
 
SharePoint Fest DC 2019 - Bot Framework and Microsoft Graph - Join The Revolu...
SharePoint Fest DC 2019 - Bot Framework and Microsoft Graph - Join The Revolu...SharePoint Fest DC 2019 - Bot Framework and Microsoft Graph - Join The Revolu...
SharePoint Fest DC 2019 - Bot Framework and Microsoft Graph - Join The Revolu...
 
SharePoint Fest DC 2019 - From SharePoint to Office 365 Development
SharePoint Fest DC 2019 - From SharePoint to Office 365 DevelopmentSharePoint Fest DC 2019 - From SharePoint to Office 365 Development
SharePoint Fest DC 2019 - From SharePoint to Office 365 Development
 
Webinar - 2020-03-24 - Build your first Microsoft Teams app using SPFx
Webinar - 2020-03-24 - Build your first Microsoft Teams app using SPFxWebinar - 2020-03-24 - Build your first Microsoft Teams app using SPFx
Webinar - 2020-03-24 - Build your first Microsoft Teams app using SPFx
 
SPTechCon Austin 2019 - Top 10 feature trends to make you fall in love with y...
SPTechCon Austin 2019 - Top 10 feature trends to make you fall in love with y...SPTechCon Austin 2019 - Top 10 feature trends to make you fall in love with y...
SPTechCon Austin 2019 - Top 10 feature trends to make you fall in love with y...
 
SPTechCon Austin 2019 - From SharePoint to Office 365 development
SPTechCon Austin 2019 - From SharePoint to Office 365 developmentSPTechCon Austin 2019 - From SharePoint to Office 365 development
SPTechCon Austin 2019 - From SharePoint to Office 365 development
 
SharePoint Fest Chicago 2018 - From SharePoint to Office 365 development
SharePoint Fest Chicago 2018 - From SharePoint to Office 365 developmentSharePoint Fest Chicago 2018 - From SharePoint to Office 365 development
SharePoint Fest Chicago 2018 - From SharePoint to Office 365 development
 
SharePoint Saturday Vienna 2018 - Top 10 feature trends to make you fall in l...
SharePoint Saturday Vienna 2018 - Top 10 feature trends to make you fall in l...SharePoint Saturday Vienna 2018 - Top 10 feature trends to make you fall in l...
SharePoint Saturday Vienna 2018 - Top 10 feature trends to make you fall in l...
 
SharePoint Saturday Vienna 2018 - Building a modern intranet in 60 minutes
SharePoint Saturday Vienna 2018 - Building a modern intranet in 60 minutesSharePoint Saturday Vienna 2018 - Building a modern intranet in 60 minutes
SharePoint Saturday Vienna 2018 - Building a modern intranet in 60 minutes
 
Nashville SharePoint User Group 2018 - Building a modern intranet in 60 minutes
Nashville SharePoint User Group 2018 - Building a modern intranet in 60 minutesNashville SharePoint User Group 2018 - Building a modern intranet in 60 minutes
Nashville SharePoint User Group 2018 - Building a modern intranet in 60 minutes
 
SharePoint Fest Seattle 2018 - Build an intelligent application by connecting...
SharePoint Fest Seattle 2018 - Build an intelligent application by connecting...SharePoint Fest Seattle 2018 - Build an intelligent application by connecting...
SharePoint Fest Seattle 2018 - Build an intelligent application by connecting...
 
SharePoint Fest Seattle 2018 - From SharePoint to Office 365 Development
SharePoint Fest Seattle 2018 - From SharePoint to Office 365 DevelopmentSharePoint Fest Seattle 2018 - From SharePoint to Office 365 Development
SharePoint Fest Seattle 2018 - From SharePoint to Office 365 Development
 

Recently uploaded

WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 

Recently uploaded (20)

WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptxVulnerability_Management_GRC_by Sohang Sengupta.pptx
Vulnerability_Management_GRC_by Sohang Sengupta.pptx
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 

APIs for SharePoint Data Access

  • 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