SlideShare a Scribd company logo
1 of 68
Download to read offline
#engageug
Six	Polite	Ways	
to	Design	a	RESTful	API	
for	your	Domino	Applica<on!
Serdar	Basegmez	
Developi	Informa/on	Systems
@serdar_basegmez
#engageug
Serdar	Basegmez
HCL	Master	(2020)	
IBM	Champion	Alumni	(2011	-	2018)	
Developi	InformaGon	Systems,	London	
Notes/Domino/XPages/Java	Developer,	half-blooded	admin!	
Member	Director	at	OpenNTF	Board	
Blog:	LotusNotus.com	/	TwiWer:	@serdar_basegmez	
Also	blogging/speaking/podcasGng	on	scienGfic	skepGcism	/	criGcal	thinking
#engageug
Agenda
• Why	should	you	care?	
• RESTful	APIs	
• PracGcal	ImplicaGons	of	RESTful	Architectures	
• Designing	an	API	
• Ways	to	Provide	REST	Services	for	HCL	Domino	
• Tools	
• Wrap-up
#engageug
Why	Should	You	Care?
• New	Front-ends	and	Enhanced	UX	
• Faceli`ing,	but	keeping	data	and	business	logic	in	NSF.	
• JS	Frameworks	(e.g.	Angular,	React),	Mobile	Apps,	etc.	
• Richer	experiences	with	chatbots,	AI,	etc.	
• IntegraGon	for	third	party	sites/applicaGons	
• IT	becomes	a	huge	jungle,	we	can’t	walk	alone!	
• Financial	Systems,	AI	Systems,	CRM,	S/M	AutomaGon	
• CollaboraGve	Apps,	Office	365	
• AutomaGng	processes	using	APIs	
• Domino	Apps	not	independent	from	Business	Processes	
• AccounGng/Sales/MarkeGng/ERP	Processes
User Experience
Business Processes
Integration
#engageug
RESTful	Web	Services
Source: https://en.wikipedia.org/wiki/Representational_state_transfer
Representa/onal	state	transfer	(REST)	is	an	architectural	style	used	
for	web	development.	Systems	and	sites	designed	using	this	style	
aim	for	fast	performance,	reliability	and	the	ability	to	scale	(to	grow	
and	easily	support	extra	users).	To	achieve	these	goals,	developers	
work	with	reusable	components	that	can	be	managed	and	updated	
without	affec/ng	the	system	as	a	whole	while	it	is	running.
#engageug
History
#engageug Source: https://speakerdeck.com/jeffschenck/rest-easy-api-security-done-right
User Interface Business Logic Datastore
Front-end Back-end
ASP, PHP, CGI, Web Agents, JSP, etc.
← HTML, CSS, JavaScript
Forms →
Old	School	Web	Applica<ons
#engageug
Web	Applica<ons	Evolving
User Interface Business Logic Datastore
Front-end Back-end
Async web apps, Ruby on Rails, Django, JSF, XPages, etc.
← HTML, CSS, JavaScript
Forms, AJAX →
#engageug
Web	Applica<ons	Evolving
User Interface Business Logic Datastore
Front-end Back-end
Modern Web frameworks, Angular.js, React.js, etc.
← HTML, CSS, JavaScript
← REST →
#engageug
[Web]	Applica<ons	Evolving
User Interface Business Logic Datastore
Mobile Applications
Back-end
Modern Web frameworks, Angular.js, React.js, etc.
← HTML, CSS, JavaScript
← REST →
Front-end
#engageug
[Web]	Applica<ons	Evolving
User Interface Business Logic Datastore
Mobile Applications Back-end
Modern Web frameworks, Angular.js, React.js, etc.
← HTML, CSS, JavaScript
← REST →
Front-end Microservice Microservice Microservice
#engageug
[Web]	Applica<ons	Evolving
Back-end
Modern Web frameworks, Angular.js, React.js, etc.
← HTML, CSS, JavaScript
← REST →
User Interface Business Logic Datastore
Mobile Applications
Front-end
External Apps
Microservice Microservice Microservice Integration
#engageug
RESTful,	Everywhere!
Solid Architecture
Well-defined practices
Widespread use
Easily consumable
Scalable
#engageug
The	Conversa<on	Makes	Sense!
Source: http://www.bizcoder.com/a-fresh-coat-of-rest-paint-on-a-soap-stack
#engageug
The	Conversa<on	Makes	Sense!
GET	/twink/contacts/DLEY-ACLH6Y	HTTP/1.1	
Host:	homer.developi.info	
Cache-Control:	no-cache	
{	
		"zip":	"13202",	
		"state":	"NY",	
		"lastName":	"Abbate",	
		"middle":	"J",	
		"country":	"US",	
		"emailAddress":	"Jessica.J.Abbate@trashymail.com",	
		"number":	"DLEY-ACLH6Y",	
		"city":	"Syracuse",	
		"firstName":	"Jessica"	
}
#engageug
The	Conversa<on	Makes	Sense!
hTp://appserver.company.com/apps/contacts.nsf/
GiveMeTheContactWeNeedPleaseAgent?OpenAgent&id=1522	
or…	
hTp://appserver.company.com/api/contacts/1522
#engageug
Conventions on URLs
GET	hTp://appserver.company.com/api/contacts		
GET	hTp://appserver.company.com/api/contacts/UK/London		
POST	hTp://appserver.company.com/api/contacts		
Retrieve Contacts / Create a new Contact…
#engageug
Conventions on URLs
GET	hTp://appserver.company.com/api/contacts/1522		
PUT	hTp://appserver.company.com/api/contacts/1522		
DELETE	hTp://appserver.company.com/api/contacts/1522		
Retrieve/Update/Delete the Contact resource with id=1522…
#engageug
URLs	and	Resources
GET POST PUT / PATCH DELETE
/contacts/
List

Contacts
Create

Contact
N/A N/A
/contacts/id
Retrieve

Contact
N/A
Update / Replace

Contact
Delete

Contact
Source: https://en.wikipedia.org/wiki/Representational_state_transfer
#engageug
Different Conventions
GET	hTps://api.twiTer.com/1.1/statuses/show.json?id=1234567890		
Retrieve the Tweet with id=1234567890…
#engageug
Designing	RESTful	APIs…	
What	does	it	mean?
#engageug
Example:	Collabora<on	Today	API
• CollaboraGon	Today	API	
• AlternaGve	front-end	
• Integrate	to	different	consumers	
• Keep	the	data	in	NSF	
• Reuse	current	implementaGon	
• Three	SecGons:	
• PresentaGon	(Reading	News)	
• CuraGon	(Adding/Publishing	News)	
• RSS	Feeding	(DOTS	FeedMonster)
#engageug
Collabora<onToday	API
Recent	Stories
Stories	By	Author
Story	fields	needed
Tags/Categories
Stories	By	Tag
#engageug
Collabora<onToday	API
#engageug
Collabora<onToday	API
#engageug
Designing	RESTful	API
• Contract	Design	
• URLs	(Resources	+	Verbs)	
• Data	formats	
• Rules,	Success	and	Error	Responses	
• Tip:		
• Start	with	the	end	product.	
• Write	a	documentaGon	first,	before	coding.	
• No	“correct	way”,	only	“best	pracGces”	
• Follow	ConvenGons
* Icons made by Flat Icons from www.flaticon.com
#engageug
Designing	RESTful	API
• Security	Design	
• AuthenGcaGon	/	AuthorizaGon	
• EncrypGon	
• ApplicaGon	Security	
• Tips	
• The	scope	of	the	implementaGon	is	the	key.	
• Managing	security	is	o`en	overlooked.	
• Security	starts	with	the	design	phase.
* Icons made by Flat Icons from www.flaticon.com
#engageug
Designing	RESTful	API
• Versioning	
• EnumeraGon,	Lifecycle	
• DocumentaGon	
• OpenAPI	Specs	
• Generate	Server	stubs,	client	libraries	
• InteracGve	documentaGon	
• TesGng	
• Automated	tesGng
* Icons made by Flat Icons from www.flaticon.com
/v1/api/xyz	
/v2/api/xyz	
/api1/xyz	
/api2/xyz
#engageug
RESTful	Services	
for	
HCL	Domino	Applica<ons
#engageug
6	Polite	Ways	of	RESTful	Domino
1. Domino	Access	Services	
2. Using	Extension	Library	Components	
3. Hardcoding	Services	(Web	Agents,	XAgents,	Servlets)	
4. OSGi	Plugins	to	implement	JAX-RS	
5. Node.js	ApplicaGons	with	App.Dev.Pack		
6. UnconvenGonal	implementaGons	
• SmartNSF,	JAX-RS	inside	NSF,	JAX-RS	outside	Domino	
• Hybrid	Methods
#engageug
Domino	Access	Services
HCL	Supported	Fully	Func<onal	REST	API
Access	to	Data	/	Calendar	/	Mail*	/	Freebusy*	/	Directory**
*	Mail	and	Freebusy	access	is	part	of	the	core	product	since	9.0.1FP10		/		**	Directory	access	is	enabled	with	the	ExtLib	version	of	OpenNTF
Caching	/	Na<ve	Security	(ACL,	Reader/Author	fields,	etc.)
Server-level	/	Database-level	/	Design-level	control
Enable on Server Enable For Database Enable For Views
#engageug
Domino	Access	Services
• OpenAPI	definiGons	(Swagger)	are	hosted	on	OpenNTF!	
• hWps://github.com/OpenNTF/das-api-specs
#engageug
Domino	Access	Services
• Drawbacks:	
• Weak	control	over	the	data!	
• No	checkpoints	on	CRUD,	No	coding	involved…	
• No	place	for	business	logic!	
• Exposes	internals	
• Not	opGmized	for	some	use	cases	
• You	should	trust	consumers	and	the	environment…
#engageug
REST	Components	(ExtLib)
• Provided	and	Supported	by	HCL	
• Customizable	component	version	of	the	DAS	
• Computed/Filtered	columns,	Custom	search,	etc.	
• Event	model	helps	building	business	logic	on	top	of	REST	model	
• Custom	REST	Service	
• Write	your	own	SSJS	or	Java	bean	
• Write	your	CSJS	rouGnes	for	async	access		
• Remote	Service	/	JSON-RPC	
• Dojo	support	for	single	page	model
#engageug
REST	Components	(ExtLib)
• Setup	REST	component(s)	on	your	page.	
• Minimal	coding,	no	administrator	needed.
Add to your XPage Add a Service Configure Options
#engageug
REST	Components	(ExtLib)
• Drawbacks:	
• Easy	to	slip	into	a	spages	code!	
• Not	opGmized	for	performance	and	scalability	
• Difficult	to	follow	RESTful	URL	ConvenGon
https://someserver.domain.com/database.nsf/somepage.xsp/service/…
#engageug
Hardcoding	(Web	agents,	XAgents,	Servlets…)
• Old	school	way;	sGll	quite	useful	for	some	cases.	
• Great	if	you	have	pre-exisGng	code	(e.g.	Lotusscript	libraries,	etc.)	
• Also,	useful	to	prototype	quick	ideas.	
• Customizable,	flexible	and	simple	way	to	create	any	service.
#engageug
Hardcoding	(Web	agents,	XAgents,	Servlets…)
• Drawbacks:	
• Hardcode	everything…	
• e.g.	Header/parameter	extracGon	
• Very	easy	to	slip	into	a	spages	code!	
• Error	handling	/	proper	tesGng	needed	
• Difficult	to	follow	RESTful	URL	ConvenGon
https://someserver.domain.com/database.nsf/xagent.xsp?…
https://someserver.domain.com/database.nsf/someagent?OpenAgent&…
#engageug
Java	(JAX-RS)	with	OSGi	Plugins
• JAX-RS:	‘Java-ish’	way	to	define	RESTful	services	
• Create	JAX-RS	based	REST	services	on	top	of	OSGi	plugins.	
• Complete	Java	soluGon,	extensible	with	custom	providers	
• OpGons	
• Apache	Wink	1.1.2	(DAS	uses!)	
• Jakarta	EE	(Official	Java)	
• RestEasy,	Apache	CXF,	Jersey,	etc.	
• Code	reusability	outside	HCL	Domino	world.
#engageug
JAX-RS	Architecture
JAX-RS Runtime Application Code
Servlet
(Customizable)
HTTP/HTTPS
Client
Datastore(s)
Resource
Resource
Resource
Resource
Controllers
Data Accessors
Tools/Utilities
Request/Response
Wrappers
Context Helpers
/BaseURI/* /BaseURI/Path-Patterns
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
	 private	DominoAccessor	accessor	=	new	DominoAccessor(ContextInfo.getUserSession());	
	 	
	 @GET()	
	 public	Response	getContactList(	@QueryParam("start")	int	start,	@QueryParam("count")	int	count)	{	
	 	 	
	 	 List<Contact>	contactList	=	accessor.pullContacts(start,	count);	
	 	 String	result	=	ModelUtils.toJson(contactList).toString();	
	 	 	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 	
	 @Path("/{id}")	
	 @GET()	
	 public	Response	getContact(@PathParam("id")	String	id)	{	
	 	 Contact	contact	=	accessor.findContact(id);	
	 	 if(null	==	contact)	{	
	 	 	 throw	new	WebApplicationException(Response.Status.NOT_FOUND);	
	 	 }	else	{	
	 	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 	 }	
	 }	
}
{	
		"zip":	"13202",	
		"state":	"NY",	
		"lastName":	"Abbate",	
		"middle":	"J",	
		"country":	"US",	
		"emailAddress":	"Jessica.J.Abbate@trashymail.com",	
		"number":	"DLEY-ACLH6Y",	
		"city":	"Syracuse",	
		"firstName":	"Jessica"	
}
Contact Resource Class
Contact Resource
Short JSON Representation
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
	 private	DominoAccessor	accessor	=	new	DominoAccessor(ContextInfo.getUserSession());	
	 	
	 @GET()	
	 public	Response	getContactList(	@QueryParam("start")	int	start,	@QueryParam("count")	int	count)	{	
	 	 	
	 	 List<Contact>	contactList	=	accessor.pullContacts(start,	count);	
	 	 String	result	=	ModelUtils.toJson(contactList).toString();	
	 	 	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 	
	 @Path("/{id}")	
	 @GET()	
	 public	Response	getContact(@PathParam("id")	String	id)	{	
	 	 Contact	contact	=	accessor.findContact(id);	
	 	 if(null	==	contact)	{	
	 	 	 throw	new	WebApplicationException(Response.Status.NOT_FOUND);	
	 	 }	else	{	
	 	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 	 }	
	 }	
}
The base URI for the
resource
In the demo, the root path of
the plugin is “/twink”. So this
class is enabled for requests
made to:
/twink/contacts/*
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
	 private	DominoAccessor	accessor	=	new	DominoAccessor(ContextInfo.getUserSession());	
	 	
	 @GET()	
	 public	Response	getContactList(	@QueryParam("start")	int	start,	@QueryParam("count")	int	count)	{	
	 	 	
	 	 List<Contact>	contactList	=	accessor.pullContacts(start,	count);	
	 	 String	result	=	ModelUtils.toJson(contactList).toString();	
	 	 	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 	
	 @Path("/{id}")	
	 @GET()	
	 public	Response	getContact(@PathParam("id")	String	id)	{	
	 	 Contact	contact	=	accessor.findContact(id);	
	 	 if(null	==	contact)	{	
	 	 	 throw	new	WebApplicationException(Response.Status.NOT_FOUND);	
	 	 }	else	{	
	 	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 	 }	
	 }	
}
This method responds to
GET requests.
No path defined, so this is
the default responder.
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
	 private	DominoAccessor	accessor	=	new	DominoAccessor(ContextInfo.getUserSession());	
	 	
	 @GET()	
	 public	Response	getContactList(	@QueryParam("start")	int	start,	@QueryParam("count")	int	count)	{	
	 	 	
	 	 List<Contact>	contactList	=	accessor.pullContacts(start,	count);	
	 	 String	result	=	ModelUtils.toJson(contactList).toString();	
	 	 	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 	
	 @Path("/{id}")	
	 @GET()	
	 public	Response	getContact(@PathParam("id")	String	id)	{	
	 	 Contact	contact	=	accessor.findContact(id);	
	 	 if(null	==	contact)	{	
	 	 	 throw	new	WebApplicationException(Response.Status.NOT_FOUND);	
	 	 }	else	{	
	 	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 	 }	
	 }	
}
This method also responds
to GET requests.
But it the request path will
be elected based on this
format.
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
	 private	DominoAccessor	accessor	=	new	DominoAccessor(ContextInfo.getUserSession());	
	 	
	 @GET()	
	 public	Response	getContactList(	@QueryParam("start")	int	start,	@QueryParam("count")	int	count)	{	
	 	 	
	 	 List<Contact>	contactList	=	accessor.pullContacts(start,	count);	
	 	 String	result	=	ModelUtils.toJson(contactList).toString();	
	 	 	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 	
	 @Path("/{id}")	
	 @GET()	
	 public	Response	getContact(@PathParam("id")	String	id)	{	
	 	 Contact	contact	=	accessor.findContact(id);	
	 	 if(null	==	contact)	{	
	 	 	 throw	new	WebApplicationException(Response.Status.NOT_FOUND);	
	 	 }	else	{	
	 	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 	 }	
	 }	
}
Parameters will be injected
into methods.
/contacts?start=X&count=Y
/contacts/someId
JAX-RS servlet will handle
type conversion.
It supports ordinary java
objects, enums, primitives,
etc.
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
	 private	DominoAccessor	accessor	=	new	DominoAccessor(ContextInfo.getUserSession());	
	 	
	 @GET()	
	 public	Response	getContactList(	@QueryParam("start")	int	start,	@QueryParam("count")	int	count)	{	
	 	 	
	 	 List<Contact>	contactList	=	accessor.pullContacts(start,	count);	
	 	 String	result	=	ModelUtils.toJson(contactList).toString();	
	 	 	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 	
	 @Path("/{id}")	
	 @GET()	
	 public	Response	getContact(@PathParam("id")	String	id)	{	
	 	 Contact	contact	=	accessor.findContact(id);	
	 	 if(null	==	contact)	{	
	 	 	 throw	new	WebApplicationException(Response.Status.NOT_FOUND);	
	 	 }	else	{	
	 	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 	 }	
	 }	
}
There are lots of options of
returning response.
ResponseBuilders and some
other helpers make it quite
easy.
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
	 private	DominoAccessor	accessor	=	new	DominoAccessor(ContextInfo.getUserSession());	
	 	
	 @GET()	
	 public	Response	getContactList(	@QueryParam("start")	int	start,	@QueryParam("count")	int	count)	{	
	 	 	
	 	 List<Contact>	contactList	=	accessor.pullContacts(start,	count);	
	 	 String	result	=	ModelUtils.toJson(contactList).toString();	
	 	 	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 	
	 @Path("/{id}")	
	 @GET()	
	 public	Response	getContact(@PathParam("id")	String	id)	{	
	 	 Contact	contact	=	accessor.findContact(id);	
	 	 if(null	==	contact)	{	
	 	 	 throw	new	WebApplicationException(Response.Status.NOT_FOUND);	
	 	 }	else	{	
	 	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 	 }	
	 }	
}
Error handling is handled by the
JAX-RS engine as well.
You can inject your own errors.
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
…………	
	 @POST()	
	 @Consumes(MediaType.APPLICATION_JSON)	
	 public	Response	postContactJson(String	body)	{	
	 	 Contact	contact	=	ModelUtils.buildContactfromJson(body);	
	 	 accessor.saveNewContact(contact);	
	 	 	
	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 @POST()	
	 @Consumes(MediaType.MULTIPART_FORM_DATA)	
	 public	Response	postContactForm(BufferedInMultiPart	formData)	{	
	 	 Contact	contact	=	ModelUtils.buildContactfromMultipart(formData);	
	 	 accessor.saveNewContact(contact);	
	 	 	
	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
}
This methods respond to POST
requests.
This time the selection depends
on the incoming data type.
Client marks the request with
Content-Type header and
Request processor will select
the appropriate method here.
#engageug
@Path("/contacts")	
public	class	ContactResource	{	
…………	
	 @POST()	
	 @Consumes(MediaType.APPLICATION_JSON)	
	 public	Response	postContactJson(String	body)	{	
	 	 Contact	contact	=	ModelUtils.buildContactfromJson(body);	
	 	 accessor.saveNewContact(contact);	
	 	 	
	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
	 @POST()	
	 @Consumes(MediaType.MULTIPART_FORM_DATA)	
	 public	Response	postContactForm(BufferedInMultiPart	formData)	{	
	 	 Contact	contact	=	ModelUtils.buildContactfromMultipart(formData);	
	 	 accessor.saveNewContact(contact);	
	 	 	
	 	 String	result	=	ModelUtils.toJson(contact).toString();	
	 	 return	Response.ok(result,	MediaType.APPLICATION_JSON).build();	
	 }	
}
Wink injects the incoming
data into the method
automatically.
JAX-RS libraries provide
their own implementation
to process different data
formats (Multipart, Atom,
XML, JSON, etc.)
#engageug
JAX-RS	Methods
On	Apache	Wink…	
hWps://speakerdeck.com/sbasegmez/iconuk-2016-rest-assured...	
On	Jakarta	EE…	(by	Jesse	Gallagher)	
hWps://github.com/OpenNTF/org.opennx.xsp.jakartaee
#engageug
JAX-RS	Methods
• Drawbacks:	
• Plugin	only	
• Difficult	if	you	are	not	familiar,	Takes	Gme	to	learn	
• Overkill?	
• Not	suitable	for	small	projects	and	simple	needs	
• Tool	selecGon	is	criGcal.	
• Apache	Wink	is	old	school	
• IntegraGng	alternaGves	might	be	difficult
#engageug
Node.js
• DQL	+	Domino	AppDev	Pack:	
• Domino	Query	Language	
• AppDev	Pack:	Proton	Task	/	domino-db.js	
• Countless	opportuniGes	in	the	most	popular	framework	
• Different	possibiliGes	for	the	architecture	
• Wide	range	of	opGons	for	tooling
https://insights.stackoverflow.com/survey/2019
#engageug
Node.js	Support	for	Domino	Apps
HCL Domino Server
Proton
Node.js Layer
domino-db.js
GRPC
Application
………
ApplicationREST
New Add-on
Domino v10
Routers for
the RESTful service
Might be on the same box or not
MyRoutes.js
NSF
#engageug
DQL:	Domino	Query	Language
• Available	since	Domino	V10	
• OpGmized	query	access	to	NSF	data	
• Domino	server	extracts	and	opGmizes	data	for	DQL	access
John Curtis, “Factory Tour DQL Performance Explanation”, https://jdcurtis.blog/2019/07/17/factory-tour-dql-performance-explanation/
#engageug
IAM:	Iden<ty	and	Access	Management
* IAM Setup documentation - https://doc.cwpcollaboration.com/appdevpack/docs/en/iam_setup.html
#engageug
Other	Implementa<ons
• UnconvenGonal	implementaGons	
• Why?	
• Specific	needs	
• Matching	skills	
• Prefer	soluGons	with	less	effort	
• Why	not?	
• No	support	
• Version	lock-in	
• ExperGse	needed
#engageug
SmartNSF
• OpenNTF	Plugin	
• Beta-7	version.	
• Developers:	
• ChrisGan	Güdemann	
• MarGn	Jinoch	
• Define	your	REST	Services	from	DDE!	
• Uses	Groovy	
• Auto-generate	OpenAPI	definiGons
Looking for Contributors!
#engageug
JAX-RS	inside	NSF
• IniGal	work:	MarGn	Pradny	
• Included	in	Jakarta	EE	by	Jesse	Gallagher	
• JAX-RS	2.1	support	(Apache	Wink:	JAX	RS	1.1.1)	
• No	need	to	deal	with	OSGi	
• Directly	create	annotated	classes	inside	NSF	
• OpenAPI	SpecificaGon	annotaGons	supported
https://www.pradny.com/2019/05/using-jax-rs-inside-nsf-follow-up.html
#engageug
Integrate	Domino	into	Open	Liberty
• ImplementaGon:	Jesse	Gallagher	
• Inspired	by	Sven	Hasselbach	
• Run	Java	EE	server		
• e.g.	Open	Liberty,	open	source	variant	of	Websphere	Liberty	
• Run	Domino	HTTP	Stack	side	by	side	
• Deploy	Java	EE	projects	connecGng	to	Domino	data	naGvely.	
• HTTP/2,	Servlet	4,	Websockets,	etc.	
• High	performance,	scalability
https://frostillic.us/blog/posts/2019/1/3/be9501a07279b40d85258377007b0dfd
#engageug
Bonus…
#engageug
Hybrid	Approaches
• Wrap	services	using	a	suitable	front-end	
• e.g.	Express,	Node-RED,	etc.	
• Add	some	magic	
• Extra	processing,	computaGon,	security,	etc.	
• Wrap	missing	parts	from	exisGng	assets	
• Combine	best	of	all	worlds	
• Consistency	across	the	soluGon	
• OpGmized	ImplementaGon
Internal
Domino Server
Node.js
JAX-RS Service
ExtLib REST
Service
DAS - Data API
Proton
domino-db.js
JavaScript
Services
Wrapped
Services
Data / Application Layer
Non-Domino
Services
API Clients
API ClientsAPI Clients
#engageug
Tooling	-	OpenAPI
• OpenAPI	SpecificaGons	/	DocumentaGon	
• Swagger	Tools	-	swagger.io	
• Stoplight	Studio	-	stoplight.io	
• Apicurio	-	apicur.io
#engageug
Tooling	-	Tes<ng
• TesGng	
• Postman	-	postman.com		
• Paw	-	paw.cloud	[Mac	only]	
• SoapUI	-	soapui.org
#engageug
Thank	you!
Serdar	Basegmez	
Developi
serdar_basegmez
lotusnotus.com
#engageug
Resources
• Serdar	Başeğmez:	Node.js	demo	for	this	session

hWps://github.com/sbasegmez/Engage19Demo	
• Tom	Van	Aken:	Rest	calls	and	JSON	Parsing	in	LotusScript

hWps://vanakentom.wordpress.com/2019/01/15/rest-calls-and-json-parsing-in-lotusscript/	
• Serdar	Başeğmez:	Demo	for	IBM	Connect	2017	session

hWps://github.com/sbasegmez/IC17RestDemo	
• Serdar	Başeğmez:	Apache	Wink	Template	and	Demo	for	Icon	UK	2016

hWps://github.com/sbasegmez/RestAssuredDemo	
• Graham	Acres	/	Serdar	Başeğmez:	The	Journey	to	Becoming	a	Social	ApplicaGon	Developer	(IBM	Connect	2014)

hWps://speakerdeck.com/sbasegmez/bp308-the-journey-to-becoming-a-social-applicaGon-developer		
• Stephan	H.	Wissel:	Custom	REST	service	in	XPages	using	a	service	bean

hWps://wissel.net/blog/d6plinks/SHWL-9Q55QL
#engageug
Resources	(cont.)
• Eric	McCormick:	Series	on	JSON	Data	with	Java	in	XPages

hWps://edm00se.io/json-with-java-in-xpages		
• Thomas	Ladehoff:	REST	Services	with	the	XPages	Extension	Library

hWps://www.assono.de/blog/d6plinks/REST-Services-with-the-XPages-Extension-Library		
• Paul	Withers:	XPages	OSGi	Plugins	series

hWp://www.intec.co.uk/xpages-osgi-plugins-1-an-introducGon/	
• John	Cooper:	Domino	OSGI	(Part	1)	-	Configuring	Eclipse	for	XPages	OSGI	Plugins

hWp://developmentblog.johnmcooper.co.uk/2014/05/configuring-eclipse-for-xpages-osgi-plugins-part1.html	
• Toby	Samples:	JAX-RS	or	THE	way	to	do	REST	in	Domino	series

hWps://tobysamples.wordpress.com/2015/04/28/jax-rs-or-the-way-to-do-rest-in-domino-part-1/		
• Jesse	Gallagher:	Eclipse	Tutorial	for	Domino	Developers

hWps://github.com/jesse-gallagher/eclipse-tutorial-oct2015/wiki/Java
#engageug
Resources	(cont.)
• Ulrich	Krause:	NotesJsonNavigator,	NotesJsonElement,	NotesJsonArray,	NotesJsonObject	example

hWps://www.eknori.de/2019-01-01/notesjsonnavigator-notesjsonelement-notesjsonarray-notesjsonobject-example/		
• John	Dalsgaard:	REST	Services	in	IBM	Domino/XWork

hWps://www.dalsgaard-data.eu/blog/rest-services-in-ibm-dominoxwork		
• Oliver	Busse:	First	dive	into	Domino	and	Node.js

hWp://oliverbusse.notesx.net/hp.nsf/blogpost.xsp?documentId=2E52	
• Oliver	Busse:	Domino,	Proton,	IAM,	OAuth	(Series)

hWp://oliverbusse.notesx.net/hp.nsf/blogpost.xsp?documentId=2FEA	
• Sven	Hasselbach:	node.js,	domino-db	&	Docker

hWp://hasselba.ch/blog/?p=2670		
• Jesse	Gallagher:	That	Java	Thing,	Part	1:	The	Java	Problem	in	the	Community

hWps://frosGllic.us/blog/thread.xsp?thread=That+Java+Thing
#engageug
Resources	(cont.)
• Graham	Acres	/	Heiko	Voigt:	Engage	2019	Demo	of	Domino	v10,	Proton	and	Node.js	session	

hWps://github.com/c3ug/engage2019democode		
• Troy	Reimer:	OpenNTF	Project:	LotusScript	implementaGon	of	a	reader	and	writer	for	JSON

hWps://opennx.org/main.nsf/project.xsp?r=project/JSON%20LotusScript%20Classes	
• Bansilal	Haudakari:	EffecGve	API	Design	

hWps://www.slideshare.net/BansilalHaudakari/effecGve-api-design		
• Heiko	Voigt:	How	to	set	up	the	Domino	10	OAUTH2	Provider	-	IAM	Basics	

hWps://www.harbour-light.org/2019/02/18/how-to-set-up-the-domino-10-oauth2-provider-iam-basics/		
• Mar<n	Pradny:	Using	JAX-RS	inside	NSF	follow-up	-	Swagger	UI	

hWps://www.pradny.com/2019/05/using-jax-rs-inside-nsf-follow-up.html		
• Cross	Canada	Collabora<on	User	Group:	John	CurGs	-	Domino	Query	Language	with	John	CurGs	Part	1

hWps://www.youtube.com/watch?v=qm_LJ9-6OTE

More Related Content

What's hot

Emily Grossman App Indexing SMX West 2017
Emily Grossman App Indexing SMX West 2017Emily Grossman App Indexing SMX West 2017
Emily Grossman App Indexing SMX West 2017MobileMoxie
 
Introduction to the Art of API Practice
Introduction to the Art of API PracticeIntroduction to the Art of API Practice
Introduction to the Art of API PracticeBill Doerrfeld
 
apidays LIVE Australia - Contract-first API development with Spot by Francois...
apidays LIVE Australia - Contract-first API development with Spot by Francois...apidays LIVE Australia - Contract-first API development with Spot by Francois...
apidays LIVE Australia - Contract-first API development with Spot by Francois...apidays
 
API Marketing: First Comes Usability, Then Discoverability
API Marketing: First Comes Usability, Then DiscoverabilityAPI Marketing: First Comes Usability, Then Discoverability
API Marketing: First Comes Usability, Then DiscoverabilityBill Doerrfeld
 
Continuous API Strategies for Integrated Platforms
 Continuous API Strategies for Integrated Platforms Continuous API Strategies for Integrated Platforms
Continuous API Strategies for Integrated PlatformsBill Doerrfeld
 
API Athens Meetup - API standards 25-6-2014
API Athens Meetup - API standards   25-6-2014API Athens Meetup - API standards   25-6-2014
API Athens Meetup - API standards 25-6-2014Michael Petychakis
 
10 patterns in successful api programs 2
10 patterns in successful api programs 210 patterns in successful api programs 2
10 patterns in successful api programs 2Apigee | Google Cloud
 
Open Bank Project September 2014 at Open Data CH
Open Bank Project September 2014  at Open Data CHOpen Bank Project September 2014  at Open Data CH
Open Bank Project September 2014 at Open Data CHTESOBE
 
apidays LIVE Australia - Federating API Development at Australia’s largest bu...
apidays LIVE Australia - Federating API Development at Australia’s largest bu...apidays LIVE Australia - Federating API Development at Australia’s largest bu...
apidays LIVE Australia - Federating API Development at Australia’s largest bu...apidays
 
Open Event API
Open Event APIOpen Event API
Open Event APIAvi Aryan
 
From Website to Web App - Indexing, Optimizing, and Auditing Experiences for ...
From Website to Web App - Indexing, Optimizing, and Auditing Experiences for ...From Website to Web App - Indexing, Optimizing, and Auditing Experiences for ...
From Website to Web App - Indexing, Optimizing, and Auditing Experiences for ...MobileMoxie
 
apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...
apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...
apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...apidays
 
Building Self Documenting REST APIs
Building Self Documenting REST APIsBuilding Self Documenting REST APIs
Building Self Documenting REST APIsYan Pritzker
 
apidays LIVE Australia 2021 - Confessions of a Product Geek : My First API BY...
apidays LIVE Australia 2021 - Confessions of a Product Geek : My First API BY...apidays LIVE Australia 2021 - Confessions of a Product Geek : My First API BY...
apidays LIVE Australia 2021 - Confessions of a Product Geek : My First API BY...apidays
 
Operational API design anti-patterns (Jason Harmon)
Operational API design anti-patterns (Jason Harmon)Operational API design anti-patterns (Jason Harmon)
Operational API design anti-patterns (Jason Harmon)Nordic APIs
 
apidays LIVE Paris - Exploring an API with Blocks by Larry Kluger
apidays LIVE Paris - Exploring an API with Blocks by Larry Klugerapidays LIVE Paris - Exploring an API with Blocks by Larry Kluger
apidays LIVE Paris - Exploring an API with Blocks by Larry Klugerapidays
 
apidays LIVE New York 2021 - Designing API's: Less Data is More! by Damir Svr...
apidays LIVE New York 2021 - Designing API's: Less Data is More! by Damir Svr...apidays LIVE New York 2021 - Designing API's: Less Data is More! by Damir Svr...
apidays LIVE New York 2021 - Designing API's: Less Data is More! by Damir Svr...apidays
 

What's hot (20)

Emily Grossman App Indexing SMX West 2017
Emily Grossman App Indexing SMX West 2017Emily Grossman App Indexing SMX West 2017
Emily Grossman App Indexing SMX West 2017
 
Introduction to the Art of API Practice
Introduction to the Art of API PracticeIntroduction to the Art of API Practice
Introduction to the Art of API Practice
 
14 API Directories
14 API Directories14 API Directories
14 API Directories
 
apidays LIVE Australia - Contract-first API development with Spot by Francois...
apidays LIVE Australia - Contract-first API development with Spot by Francois...apidays LIVE Australia - Contract-first API development with Spot by Francois...
apidays LIVE Australia - Contract-first API development with Spot by Francois...
 
API Marketing: First Comes Usability, Then Discoverability
API Marketing: First Comes Usability, Then DiscoverabilityAPI Marketing: First Comes Usability, Then Discoverability
API Marketing: First Comes Usability, Then Discoverability
 
Continuous API Strategies for Integrated Platforms
 Continuous API Strategies for Integrated Platforms Continuous API Strategies for Integrated Platforms
Continuous API Strategies for Integrated Platforms
 
API Athens Meetup - API standards 25-6-2014
API Athens Meetup - API standards   25-6-2014API Athens Meetup - API standards   25-6-2014
API Athens Meetup - API standards 25-6-2014
 
10 patterns in successful api programs 2
10 patterns in successful api programs 210 patterns in successful api programs 2
10 patterns in successful api programs 2
 
Open Bank Project September 2014 at Open Data CH
Open Bank Project September 2014  at Open Data CHOpen Bank Project September 2014  at Open Data CH
Open Bank Project September 2014 at Open Data CH
 
API Trends: What to expect in 2012
API Trends: What to expect in 2012API Trends: What to expect in 2012
API Trends: What to expect in 2012
 
apidays LIVE Australia - Federating API Development at Australia’s largest bu...
apidays LIVE Australia - Federating API Development at Australia’s largest bu...apidays LIVE Australia - Federating API Development at Australia’s largest bu...
apidays LIVE Australia - Federating API Development at Australia’s largest bu...
 
Open Event API
Open Event APIOpen Event API
Open Event API
 
From Website to Web App - Indexing, Optimizing, and Auditing Experiences for ...
From Website to Web App - Indexing, Optimizing, and Auditing Experiences for ...From Website to Web App - Indexing, Optimizing, and Auditing Experiences for ...
From Website to Web App - Indexing, Optimizing, and Auditing Experiences for ...
 
apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...
apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...
apidays LIVE London 2021 - API Horror Stories from an Unnamed Coworking Compa...
 
Building Self Documenting REST APIs
Building Self Documenting REST APIsBuilding Self Documenting REST APIs
Building Self Documenting REST APIs
 
apidays LIVE Australia 2021 - Confessions of a Product Geek : My First API BY...
apidays LIVE Australia 2021 - Confessions of a Product Geek : My First API BY...apidays LIVE Australia 2021 - Confessions of a Product Geek : My First API BY...
apidays LIVE Australia 2021 - Confessions of a Product Geek : My First API BY...
 
Operational API design anti-patterns (Jason Harmon)
Operational API design anti-patterns (Jason Harmon)Operational API design anti-patterns (Jason Harmon)
Operational API design anti-patterns (Jason Harmon)
 
apidays LIVE Paris - Exploring an API with Blocks by Larry Kluger
apidays LIVE Paris - Exploring an API with Blocks by Larry Klugerapidays LIVE Paris - Exploring an API with Blocks by Larry Kluger
apidays LIVE Paris - Exploring an API with Blocks by Larry Kluger
 
apidays LIVE New York 2021 - Designing API's: Less Data is More! by Damir Svr...
apidays LIVE New York 2021 - Designing API's: Less Data is More! by Damir Svr...apidays LIVE New York 2021 - Designing API's: Less Data is More! by Damir Svr...
apidays LIVE New York 2021 - Designing API's: Less Data is More! by Damir Svr...
 
Mulesoft Raml APIs
Mulesoft Raml APIsMulesoft Raml APIs
Mulesoft Raml APIs
 

Similar to Engage 2020: Six Polite Ways to Design a RESTful API for Your Application!

Creating compelling user experiences through APIs
Creating compelling user experiences through APIsCreating compelling user experiences through APIs
Creating compelling user experiences through APIsJeremy Brown
 
Why your APIs should fly first class
Why your APIs should fly first classWhy your APIs should fly first class
Why your APIs should fly first classLibbySchulze
 
Your API is your Product - Arun Ravindran, Unisys
Your API is your Product - Arun Ravindran, UnisysYour API is your Product - Arun Ravindran, Unisys
Your API is your Product - Arun Ravindran, Unisysbaconfblr
 
INTERFACE by apidays_What's your Type? Understanding API Types and Choosing t...
INTERFACE by apidays_What's your Type? Understanding API Types and Choosing t...INTERFACE by apidays_What's your Type? Understanding API Types and Choosing t...
INTERFACE by apidays_What's your Type? Understanding API Types and Choosing t...apidays
 
RESTful applications: The why and how by Maikel Mardjan
RESTful applications: The why and how by Maikel MardjanRESTful applications: The why and how by Maikel Mardjan
RESTful applications: The why and how by Maikel MardjanJexia
 
API Management in Digital Transformation
API Management in Digital TransformationAPI Management in Digital Transformation
API Management in Digital TransformationAditya Thatte
 
Lessons learned on the Azure API Stewardship Journey.pptx
Lessons learned on the Azure API Stewardship Journey.pptxLessons learned on the Azure API Stewardship Journey.pptx
Lessons learned on the Azure API Stewardship Journey.pptxapidays
 
Frontend APIs powering fast paced product iterations
Frontend APIs powering fast paced product iterationsFrontend APIs powering fast paced product iterations
Frontend APIs powering fast paced product iterationsKarthik Ramgopal
 
Designing and Implementing a Multiuser Apps Platform
Designing and Implementing a Multiuser Apps PlatformDesigning and Implementing a Multiuser Apps Platform
Designing and Implementing a Multiuser Apps PlatformApigee | Google Cloud
 
WSO2Con Asia 2014 - Building the API-Centric Enterprise
WSO2Con Asia 2014 - Building the API-Centric EnterpriseWSO2Con Asia 2014 - Building the API-Centric Enterprise
WSO2Con Asia 2014 - Building the API-Centric EnterpriseWSO2
 
2016_Mrutyunjaya_SharePoint2013
2016_Mrutyunjaya_SharePoint2013 2016_Mrutyunjaya_SharePoint2013
2016_Mrutyunjaya_SharePoint2013 Mrutyunjaya Rath
 
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20Phil Wilkins
 
Dynamic APIs: SOA Done Right
Dynamic APIs: SOA Done RightDynamic APIs: SOA Done Right
Dynamic APIs: SOA Done RightInside Analysis
 
Ambikumar - Sharepoint Developer
Ambikumar - Sharepoint DeveloperAmbikumar - Sharepoint Developer
Ambikumar - Sharepoint DeveloperAmbi kumar
 
Why and How SmartNews uses SaaS?
Why and How SmartNews uses SaaS?Why and How SmartNews uses SaaS?
Why and How SmartNews uses SaaS?Takumi Sakamoto
 
OUGN 2018 - Chatbot and the need to integrate
OUGN 2018 - Chatbot and the need to integrateOUGN 2018 - Chatbot and the need to integrate
OUGN 2018 - Chatbot and the need to integrateJon Petter Hjulstad
 

Similar to Engage 2020: Six Polite Ways to Design a RESTful API for Your Application! (20)

Creating compelling user experiences through APIs
Creating compelling user experiences through APIsCreating compelling user experiences through APIs
Creating compelling user experiences through APIs
 
Why your APIs should fly first class
Why your APIs should fly first classWhy your APIs should fly first class
Why your APIs should fly first class
 
API Design Workflows
API Design WorkflowsAPI Design Workflows
API Design Workflows
 
Your API is your Product - Arun Ravindran, Unisys
Your API is your Product - Arun Ravindran, UnisysYour API is your Product - Arun Ravindran, Unisys
Your API is your Product - Arun Ravindran, Unisys
 
INTERFACE by apidays_What's your Type? Understanding API Types and Choosing t...
INTERFACE by apidays_What's your Type? Understanding API Types and Choosing t...INTERFACE by apidays_What's your Type? Understanding API Types and Choosing t...
INTERFACE by apidays_What's your Type? Understanding API Types and Choosing t...
 
RESTful applications: The why and how by Maikel Mardjan
RESTful applications: The why and how by Maikel MardjanRESTful applications: The why and how by Maikel Mardjan
RESTful applications: The why and how by Maikel Mardjan
 
API Management in Digital Transformation
API Management in Digital TransformationAPI Management in Digital Transformation
API Management in Digital Transformation
 
Lessons learned on the Azure API Stewardship Journey.pptx
Lessons learned on the Azure API Stewardship Journey.pptxLessons learned on the Azure API Stewardship Journey.pptx
Lessons learned on the Azure API Stewardship Journey.pptx
 
Frontend APIs powering fast paced product iterations
Frontend APIs powering fast paced product iterationsFrontend APIs powering fast paced product iterations
Frontend APIs powering fast paced product iterations
 
Designing and Implementing a Multiuser Apps Platform
Designing and Implementing a Multiuser Apps PlatformDesigning and Implementing a Multiuser Apps Platform
Designing and Implementing a Multiuser Apps Platform
 
WSO2Con Asia 2014 - Building the API-Centric Enterprise
WSO2Con Asia 2014 - Building the API-Centric EnterpriseWSO2Con Asia 2014 - Building the API-Centric Enterprise
WSO2Con Asia 2014 - Building the API-Centric Enterprise
 
2016_Mrutyunjaya_SharePoint2013
2016_Mrutyunjaya_SharePoint2013 2016_Mrutyunjaya_SharePoint2013
2016_Mrutyunjaya_SharePoint2013
 
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
gRPC, GraphQL, REST - Which API Tech to use - API Conference Berlin oct 20
 
Dynamic APIs: SOA Done Right
Dynamic APIs: SOA Done RightDynamic APIs: SOA Done Right
Dynamic APIs: SOA Done Right
 
Ambikumar - Sharepoint Developer
Ambikumar - Sharepoint DeveloperAmbikumar - Sharepoint Developer
Ambikumar - Sharepoint Developer
 
PykQuery.js
PykQuery.jsPykQuery.js
PykQuery.js
 
Why and How SmartNews uses SaaS?
Why and How SmartNews uses SaaS?Why and How SmartNews uses SaaS?
Why and How SmartNews uses SaaS?
 
SamSegalResume
SamSegalResumeSamSegalResume
SamSegalResume
 
OUGN 2018 - Chatbot and the need to integrate
OUGN 2018 - Chatbot and the need to integrateOUGN 2018 - Chatbot and the need to integrate
OUGN 2018 - Chatbot and the need to integrate
 
Resume
ResumeResume
Resume
 

More from Serdar Basegmez

OpenNTF Webinar - October 2021: Return of the DOTS
OpenNTF Webinar - October 2021: Return of the DOTSOpenNTF Webinar - October 2021: Return of the DOTS
OpenNTF Webinar - October 2021: Return of the DOTSSerdar Basegmez
 
Engage 2022: The Superpower of Integrating External APIs for Notes and Domino...
Engage 2022: The Superpower of Integrating External APIs for Notes and Domino...Engage 2022: The Superpower of Integrating External APIs for Notes and Domino...
Engage 2022: The Superpower of Integrating External APIs for Notes and Domino...Serdar Basegmez
 
Engage 2023: Taking Domino Apps to the next level by providing a Rest API
Engage 2023: Taking Domino Apps to the next level by providing a Rest APIEngage 2023: Taking Domino Apps to the next level by providing a Rest API
Engage 2023: Taking Domino Apps to the next level by providing a Rest APISerdar Basegmez
 
Engage 2019: Your Data in the Major Leagues: A Practical and Updated Guide to...
Engage 2019: Your Data in the Major Leagues: A Practical and Updated Guide to...Engage 2019: Your Data in the Major Leagues: A Practical and Updated Guide to...
Engage 2019: Your Data in the Major Leagues: A Practical and Updated Guide to...Serdar Basegmez
 
IBM Connect 2017: Your Data In the Major Leagues: A Practical Guide to REST S...
IBM Connect 2017: Your Data In the Major Leagues: A Practical Guide to REST S...IBM Connect 2017: Your Data In the Major Leagues: A Practical Guide to REST S...
IBM Connect 2017: Your Data In the Major Leagues: A Practical Guide to REST S...Serdar Basegmez
 
IBM Connect 2017: Back from the Dead: When Bad Code Kills a Good Server
IBM Connect 2017: Back from the Dead: When Bad Code Kills a Good ServerIBM Connect 2017: Back from the Dead: When Bad Code Kills a Good Server
IBM Connect 2017: Back from the Dead: When Bad Code Kills a Good ServerSerdar Basegmez
 
ICONUK 2016: REST Assured, Freeing Your Domino Data Has Never Been That Easy!
ICONUK 2016: REST Assured, Freeing Your Domino Data Has Never Been That Easy!ICONUK 2016: REST Assured, Freeing Your Domino Data Has Never Been That Easy!
ICONUK 2016: REST Assured, Freeing Your Domino Data Has Never Been That Easy!Serdar Basegmez
 
ICONUK 2016: Back From the Dead: How Bad Code Kills a Good Server
ICONUK 2016: Back From the Dead: How Bad Code Kills a Good ServerICONUK 2016: Back From the Dead: How Bad Code Kills a Good Server
ICONUK 2016: Back From the Dead: How Bad Code Kills a Good ServerSerdar Basegmez
 
Engage 2016: Back From the Dead: How Bad Code Kills a Good Server
Engage 2016: Back From the Dead: How Bad Code Kills a Good ServerEngage 2016: Back From the Dead: How Bad Code Kills a Good Server
Engage 2016: Back From the Dead: How Bad Code Kills a Good ServerSerdar Basegmez
 
ICONUK 2015: How to Embrace Your XPages Plugin Super Powers
ICONUK 2015: How to Embrace Your XPages Plugin Super PowersICONUK 2015: How to Embrace Your XPages Plugin Super Powers
ICONUK 2015: How to Embrace Your XPages Plugin Super PowersSerdar Basegmez
 
Engage 2015 - 10 Mistakes You and Every XPages Developer Make. Yes, I said YOU!
Engage 2015 - 10 Mistakes You and Every XPages Developer Make. Yes, I said YOU!Engage 2015 - 10 Mistakes You and Every XPages Developer Make. Yes, I said YOU!
Engage 2015 - 10 Mistakes You and Every XPages Developer Make. Yes, I said YOU!Serdar Basegmez
 
BP 308 - The Journey to Becoming a Social Application Developer
BP 308 - The Journey to Becoming a Social Application DeveloperBP 308 - The Journey to Becoming a Social Application Developer
BP 308 - The Journey to Becoming a Social Application DeveloperSerdar Basegmez
 
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®Serdar Basegmez
 
BP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoBP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoSerdar Basegmez
 

More from Serdar Basegmez (14)

OpenNTF Webinar - October 2021: Return of the DOTS
OpenNTF Webinar - October 2021: Return of the DOTSOpenNTF Webinar - October 2021: Return of the DOTS
OpenNTF Webinar - October 2021: Return of the DOTS
 
Engage 2022: The Superpower of Integrating External APIs for Notes and Domino...
Engage 2022: The Superpower of Integrating External APIs for Notes and Domino...Engage 2022: The Superpower of Integrating External APIs for Notes and Domino...
Engage 2022: The Superpower of Integrating External APIs for Notes and Domino...
 
Engage 2023: Taking Domino Apps to the next level by providing a Rest API
Engage 2023: Taking Domino Apps to the next level by providing a Rest APIEngage 2023: Taking Domino Apps to the next level by providing a Rest API
Engage 2023: Taking Domino Apps to the next level by providing a Rest API
 
Engage 2019: Your Data in the Major Leagues: A Practical and Updated Guide to...
Engage 2019: Your Data in the Major Leagues: A Practical and Updated Guide to...Engage 2019: Your Data in the Major Leagues: A Practical and Updated Guide to...
Engage 2019: Your Data in the Major Leagues: A Practical and Updated Guide to...
 
IBM Connect 2017: Your Data In the Major Leagues: A Practical Guide to REST S...
IBM Connect 2017: Your Data In the Major Leagues: A Practical Guide to REST S...IBM Connect 2017: Your Data In the Major Leagues: A Practical Guide to REST S...
IBM Connect 2017: Your Data In the Major Leagues: A Practical Guide to REST S...
 
IBM Connect 2017: Back from the Dead: When Bad Code Kills a Good Server
IBM Connect 2017: Back from the Dead: When Bad Code Kills a Good ServerIBM Connect 2017: Back from the Dead: When Bad Code Kills a Good Server
IBM Connect 2017: Back from the Dead: When Bad Code Kills a Good Server
 
ICONUK 2016: REST Assured, Freeing Your Domino Data Has Never Been That Easy!
ICONUK 2016: REST Assured, Freeing Your Domino Data Has Never Been That Easy!ICONUK 2016: REST Assured, Freeing Your Domino Data Has Never Been That Easy!
ICONUK 2016: REST Assured, Freeing Your Domino Data Has Never Been That Easy!
 
ICONUK 2016: Back From the Dead: How Bad Code Kills a Good Server
ICONUK 2016: Back From the Dead: How Bad Code Kills a Good ServerICONUK 2016: Back From the Dead: How Bad Code Kills a Good Server
ICONUK 2016: Back From the Dead: How Bad Code Kills a Good Server
 
Engage 2016: Back From the Dead: How Bad Code Kills a Good Server
Engage 2016: Back From the Dead: How Bad Code Kills a Good ServerEngage 2016: Back From the Dead: How Bad Code Kills a Good Server
Engage 2016: Back From the Dead: How Bad Code Kills a Good Server
 
ICONUK 2015: How to Embrace Your XPages Plugin Super Powers
ICONUK 2015: How to Embrace Your XPages Plugin Super PowersICONUK 2015: How to Embrace Your XPages Plugin Super Powers
ICONUK 2015: How to Embrace Your XPages Plugin Super Powers
 
Engage 2015 - 10 Mistakes You and Every XPages Developer Make. Yes, I said YOU!
Engage 2015 - 10 Mistakes You and Every XPages Developer Make. Yes, I said YOU!Engage 2015 - 10 Mistakes You and Every XPages Developer Make. Yes, I said YOU!
Engage 2015 - 10 Mistakes You and Every XPages Developer Make. Yes, I said YOU!
 
BP 308 - The Journey to Becoming a Social Application Developer
BP 308 - The Journey to Becoming a Social Application DeveloperBP 308 - The Journey to Becoming a Social Application Developer
BP 308 - The Journey to Becoming a Social Application Developer
 
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
ICONUK 2013 - An XPager's Guide to Process Server-Side Jobs on IBM® Domino®
 
BP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM DominoBP207 - Meet the Java Application Server You Already Own – IBM Domino
BP207 - Meet the Java Application Server You Already Own – IBM Domino
 

Recently uploaded

Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....kzayra69
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 

Recently uploaded (20)

Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....What are the key points to focus on before starting to learn ETL Development....
What are the key points to focus on before starting to learn ETL Development....
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 

Engage 2020: Six Polite Ways to Design a RESTful API for Your Application!