SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
Writing HTTP
Middleware In Go
Shiju Varghese
GopherCon India 2016
Agenda
• Introduction to HTTP Middleware
• Writing HTTP Middleware with Negroni
HTTP Handlers
!
!
!
!
!
!
Handlers are responsible for writing headers and bodies !
into HTTP responses. !
!
//	ServeHTTP	should	write	reply	headers	and	data		
//	to	the	ResponseWriter	and	then	return.	
!
type	Handler	interface	{	
				ServeHTTP(ResponseWriter,	*Request)	
}
HTTP Middleware
• Pluggable and self-contained piece of code that
wraps web application handlers.!
• Components that work as another layer in the
request handling cycle, which can execute some
logic before or after executing your HTTP
application handlers.!
• Great for implementing cross-cutting concerns:
Authentication, authorization, caching, logging,
etc. 	
!
Using StripPrefix to Wraps http.FileServer
handler
package	main	
!
import	(	
				"net/http"	
)	
!
func	main()	{	
				//	To	serve	a	directory	on	disk	under	an	alternate	URL	
				//	path	(/public/),	use	StripPrefix	to	modify	the	request	
				//	URL's	path	before	the	FileServer	sees	it:	
!
				fs	:=	http.FileServer(http.Dir("public"))	
				http.Handle("/public/",	http.StripPrefix("/public/",	fs))	
	 }
func	StripPrefix(prefix	string,	h	Handler)	Handler	{	
				if	prefix	==	""	{	
								return	h	
				}	
				return	HandlerFunc(func(w	ResponseWriter,	r	*Request)	{	
								if	p	:=	strings.TrimPrefix(r.URL.Path,	prefix);	len(p)	<	
len(r.URL.Path)	{	
												r.URL.Path	=	p	
												h.ServeHTTP(w,	r)	
								}	else	{	
												NotFound(w,	r)	
								}	
				})	
}
StripPrefix Function
Pattern for Writing HTTP
Middleware	 .	 	
func	middlewareHandler(next	http.Handler)	http.Handler	{	
				return	http.HandlerFunc(func(w	http.ResponseWriter,	r	
*http.Request)	{	
				//	Our	middleware	logic	goes	here	before		
	 	//	executing	application	handler	
								next.ServeHTTP(w,	r)	
				//	Our	middleware	logic	goes	here	after		
	 	//	executing	application	handler	
				})	
}
Writing a Logging Middleware
func	loggingHandler(next	http.Handler)	http.Handler	{	
				return	http.HandlerFunc(func(w	http.ResponseWriter,	r	*http.Request)	{	
!
					 //	Before	executing	the	handler	
!
								start	:=	time.Now()	
								log.Printf("Started	%s	%s",	r.Method,	r.URL.Path)	
								next.ServeHTTP(w,	r)	
!
	 //	After	executing	the	handler	
!
								log.Printf("Completed	%s	in	%v",	r.URL.Path,	time.Since(start))	
				})	
}	
• Parameter of type http.Handler!
• Returns http.Handler type
!
!
func	index(w	http.ResponseWriter,	r	*http.Request)	{	
						fmt.Fprintf(w,	"Welcome!")	
}	
func	about(w	http.ResponseWriter,	r	*http.Request)	{	
						fmt.Fprintf(w,	"About")	
}	
func	main()	{	
				http.Handle("/",	loggingHandler(http.HandlerFunc(index)))	
				http.Handle("/about",	loggingHandler(http.HandlerFunc(about)))	
!
				server	:=	&http.Server{	
								Addr:	":3000",	
				}	
				server.ListenAndServe()	
}
Using the Logging Middleware
Middleware Chaining
http.Handle("/",	middlewareFirst(middlewareSecond(loggingHandler(	
http.HandlerFunc(index)))))
Using HTTP Middleware with
Negroni Package
Install Negroni:!
$ go get github.com/codegangsta/negroni!
Import Negroni package:!
import "github.com/codegangsta/negroni"
//	Handler	handler	is	an	interface	that	objects		
//	can	implement	to	be	registered	to	serve	as	middleware	
//	in	the	Negroni	middleware	stack.	
//	ServeHTTP	should	yield	to	the	next	middleware		
//	in	the	chain	by	invoking	the	next	http.HandlerFunc	
//	passed	in.	
//	
//	If	the	Handler	writes	to	the	ResponseWriter,	the	next	http.HandlerFunc	
should	not	be	invoked.	
type	Handler	interface	{	
				ServeHTTP(rw	http.ResponseWriter,	r	*http.Request,	next	http.HandlerFunc)	
}	
!
//	HandlerFunc	is	an	adapter	to	allow	the	use	of		
//	ordinary	functions	as	Negroni	handlers.	
type	HandlerFunc	func(rw	http.ResponseWriter,	r	*http.Request,	next	
http.HandlerFunc)	
!
func	(h	HandlerFunc)	ServeHTTP(rw	http.ResponseWriter,	r	*http.Request,	next	
http.HandlerFunc)	{	
				h(rw,	r,	next)	
}
Writing HTTP Middleware with
Negroni
func	MyMiddleware(rw	http.ResponseWriter,	r	*http.Request,	next	
http.HandlerFunc)	{	
		//	logic	before	executing	the	next	handler	
		next(rw,	r)	
		//	logic	after	executing	the	next	handler	
}
Mapping Middleware Chaining
with Negroni
func	main()	{	
				mux	:=	http.NewServeMux()	
				//	map	your	routes	here	
				n	:=	negroni.New()	
				//	You	can	map	it	to	the	handler	chain	with	the	Use	function:	
				n.Use(negroni.HandlerFunc(MyMiddleware))	
				n.UseHandler(mux)	
				server	:=	&http.Server{	
								Addr:				":8080",	
								Handler:	n,	
				}	
				server.ListenAndServe()	
}
Register Middleware Handlers for Specific
Routes
router	:=	mux.NewRouter()		
adminRoutes	:=	mux.NewRouter()		
!
//	add	admin	routes	here	
..	.	
!
//	Add	route	specific	Middleware	to	“/admin”	route	
router.Handle("/admin",	negroni.New(	
		Middleware1,	
		Middleware2,	
		negroni.Wrap(adminRoutes),	
))
Applying an Authentication
Middleware into Specific Routes
//	Middleware	for	validating	JWT	tokens	
func	Authorize(w	http.ResponseWriter,	r	*http.Request,	next	http.HandlerFunc)	{	
				//	validate	the	token	
				token,	err	:=	jwt.ParseFromRequest(r,	func(token	*jwt.Token)	(interface{},	error)	{	
!
								//	Verify	the	token	with	public	key,	which	is	the	counter	part	of	private	key	
								return	verifyKey,	nil	
				})	
!
				if	err	!=	nil	{	
								switch	err.(type)	{	
!
								case	*jwt.ValidationError:	//	JWT	validation	error	
												vErr	:=	err.(*jwt.ValidationError)	
!
												switch	vErr.Errors	{	
												case	jwt.ValidationErrorExpired:	//JWT	expired	
																DisplayAppError(w,	err,	"Access	Token	is	expired,	get	a	new	Token",	401)	
																return	
!
												default:	
																DisplayAppError(w,	err,	"Error	while	parsing	the	Access	Token!",	500)	
																return	
												}	
!
								default:	
												DisplayAppError(w,	err,	"Error	while	parsing	Access	Token!",	500)	
												return	
								}	
!
				}	
				if	token.Valid	{	
								next(w,	r)	
				}	else	{	
								DisplayAppError(w,	err,	"Invalid	Access	Token",	401)	
!
				}	
}
//	Routes	for	“/users”	path	
func	SetUserRoutes(router	*mux.Router)	*mux.Router	{	
				router.HandleFunc("/users/register",	
controllers.Register).Methods("POST")	
				router.HandleFunc("/users/login",	
controllers.Login).Methods("POST")	
				return	router	
}	
!
//	Routes	for	“/tasks”	path	
func	SetTaskRoutes(router	*mux.Router)	*mux.Router	{	
				taskRouter	:=	mux.NewRouter()	
				taskRouter.HandleFunc("/tasks",	
controllers.CreateTask).Methods("POST")	
			taskRouter.HandleFunc("/tasks/{id}",	
controllers.UpdateTask).Methods(“PUT”)	
..	.	
!
	//	Apply	Authorize	middleware	into	“/tasks”	path	
!
				router.PathPrefix("/tasks").Handler(negroni.New(	
								negroni.HandlerFunc(Authorize),	
								negroni.Wrap(taskRouter),	
				))	
				return	router	
}
THANKS
Shiju Varghese!
gophermonk@gmail.com
https://medium.com/@shijuvar
https://github.com/shijuvar

Contenu connexe

Tendances

Tendances (20)

gRPC Design and Implementation
gRPC Design and ImplementationgRPC Design and Implementation
gRPC Design and Implementation
 
gRPC - RPC rebirth?
gRPC - RPC rebirth?gRPC - RPC rebirth?
gRPC - RPC rebirth?
 
Intro to GraphQL
 Intro to GraphQL Intro to GraphQL
Intro to GraphQL
 
REST vs gRPC: Battle of API's
REST vs gRPC: Battle of API'sREST vs gRPC: Battle of API's
REST vs gRPC: Battle of API's
 
Project Frankenstein: A multitenant, horizontally scalable Prometheus as a se...
Project Frankenstein: A multitenant, horizontally scalable Prometheus as a se...Project Frankenstein: A multitenant, horizontally scalable Prometheus as a se...
Project Frankenstein: A multitenant, horizontally scalable Prometheus as a se...
 
InfluxDB & Grafana
InfluxDB & GrafanaInfluxDB & Grafana
InfluxDB & Grafana
 
ORC Column Encryption
ORC Column EncryptionORC Column Encryption
ORC Column Encryption
 
Intro to sitespeed.io
Intro to sitespeed.ioIntro to sitespeed.io
Intro to sitespeed.io
 
Introduction to gRPC
Introduction to gRPCIntroduction to gRPC
Introduction to gRPC
 
Easy Cloud Native Transformation with Nomad
Easy Cloud Native Transformation with NomadEasy Cloud Native Transformation with Nomad
Easy Cloud Native Transformation with Nomad
 
Introduction to gRPC
Introduction to gRPCIntroduction to gRPC
Introduction to gRPC
 
Grokking Techtalk #40: Consistency and Availability tradeoff in database cluster
Grokking Techtalk #40: Consistency and Availability tradeoff in database clusterGrokking Techtalk #40: Consistency and Availability tradeoff in database cluster
Grokking Techtalk #40: Consistency and Availability tradeoff in database cluster
 
Intro to open source observability with grafana, prometheus, loki, and tempo(...
Intro to open source observability with grafana, prometheus, loki, and tempo(...Intro to open source observability with grafana, prometheus, loki, and tempo(...
Intro to open source observability with grafana, prometheus, loki, and tempo(...
 
Loki - like prometheus, but for logs
Loki - like prometheus, but for logsLoki - like prometheus, but for logs
Loki - like prometheus, but for logs
 
API
APIAPI
API
 
What is Swagger?
What is Swagger?What is Swagger?
What is Swagger?
 
Monitoring Hadoop with Prometheus (Hadoop User Group Ireland, December 2015)
Monitoring Hadoop with Prometheus (Hadoop User Group Ireland, December 2015)Monitoring Hadoop with Prometheus (Hadoop User Group Ireland, December 2015)
Monitoring Hadoop with Prometheus (Hadoop User Group Ireland, December 2015)
 
Linking Metrics to Logs using Loki
Linking Metrics to Logs using LokiLinking Metrics to Logs using Loki
Linking Metrics to Logs using Loki
 
Robert Kubis - gRPC - boilerplate to high-performance scalable APIs - code.t...
 Robert Kubis - gRPC - boilerplate to high-performance scalable APIs - code.t... Robert Kubis - gRPC - boilerplate to high-performance scalable APIs - code.t...
Robert Kubis - gRPC - boilerplate to high-performance scalable APIs - code.t...
 
gRPC - Fastest Data Transfer Protocol
gRPC - Fastest Data Transfer ProtocolgRPC - Fastest Data Transfer Protocol
gRPC - Fastest Data Transfer Protocol
 

En vedette

Flogo - A Golang-powered Open Source IoT Integration Framework (Gophercon)
Flogo - A Golang-powered Open Source IoT Integration Framework (Gophercon)Flogo - A Golang-powered Open Source IoT Integration Framework (Gophercon)
Flogo - A Golang-powered Open Source IoT Integration Framework (Gophercon)
Kai Wähner
 
The Pause Legacy - Chapter 8: Four! I Mean Five! I Mean Fire!
The Pause Legacy - Chapter 8: Four! I Mean Five! I Mean Fire!The Pause Legacy - Chapter 8: Four! I Mean Five! I Mean Fire!
The Pause Legacy - Chapter 8: Four! I Mean Five! I Mean Fire!
pauselegacy
 

En vedette (20)

Comparative Analysis Of GoLang Testing Frameworks
Comparative Analysis Of GoLang Testing FrameworksComparative Analysis Of GoLang Testing Frameworks
Comparative Analysis Of GoLang Testing Frameworks
 
Stream Processing In Go
Stream Processing In GoStream Processing In Go
Stream Processing In Go
 
Building Scalable Backends with Go
Building Scalable Backends with GoBuilding Scalable Backends with Go
Building Scalable Backends with Go
 
Flogo - A Golang-powered Open Source IoT Integration Framework (Gophercon)
Flogo - A Golang-powered Open Source IoT Integration Framework (Gophercon)Flogo - A Golang-powered Open Source IoT Integration Framework (Gophercon)
Flogo - A Golang-powered Open Source IoT Integration Framework (Gophercon)
 
TDD in Go with Ginkgo and Gomega
TDD in Go with Ginkgo and GomegaTDD in Go with Ginkgo and Gomega
TDD in Go with Ginkgo and Gomega
 
Webservices ingo
Webservices ingoWebservices ingo
Webservices ingo
 
TDD in Python With Pytest
TDD in Python With PytestTDD in Python With Pytest
TDD in Python With Pytest
 
Canastas Navideñas 2014 Perú
Canastas Navideñas 2014 PerúCanastas Navideñas 2014 Perú
Canastas Navideñas 2014 Perú
 
Internet Movilidad Productividad 20091201 Manresa
Internet Movilidad Productividad 20091201 ManresaInternet Movilidad Productividad 20091201 Manresa
Internet Movilidad Productividad 20091201 Manresa
 
Google Actívate 2015-05-19 Purchase funnel & Marketing de resultados
Google Actívate 2015-05-19 Purchase funnel & Marketing de resultadosGoogle Actívate 2015-05-19 Purchase funnel & Marketing de resultados
Google Actívate 2015-05-19 Purchase funnel & Marketing de resultados
 
The Pause Legacy - Chapter 8: Four! I Mean Five! I Mean Fire!
The Pause Legacy - Chapter 8: Four! I Mean Five! I Mean Fire!The Pause Legacy - Chapter 8: Four! I Mean Five! I Mean Fire!
The Pause Legacy - Chapter 8: Four! I Mean Five! I Mean Fire!
 
Rector de la Universidad Industrial de Santander y paramilitar conversan para...
Rector de la Universidad Industrial de Santander y paramilitar conversan para...Rector de la Universidad Industrial de Santander y paramilitar conversan para...
Rector de la Universidad Industrial de Santander y paramilitar conversan para...
 
BPS DCP SIGOPAC Good Practice Guidance in Demonstrating Quality and Outcomes ...
BPS DCP SIGOPAC Good Practice Guidance in Demonstrating Quality and Outcomes ...BPS DCP SIGOPAC Good Practice Guidance in Demonstrating Quality and Outcomes ...
BPS DCP SIGOPAC Good Practice Guidance in Demonstrating Quality and Outcomes ...
 
Mein Parlament
Mein ParlamentMein Parlament
Mein Parlament
 
Global Affinity Finance Club Summer 2013
Global Affinity Finance Club Summer 2013Global Affinity Finance Club Summer 2013
Global Affinity Finance Club Summer 2013
 
Student.profinfo.pl
Student.profinfo.pl Student.profinfo.pl
Student.profinfo.pl
 
Sprint Point - prezentare Adrian Pica
Sprint Point - prezentare Adrian PicaSprint Point - prezentare Adrian Pica
Sprint Point - prezentare Adrian Pica
 
Psychoanalysis of Online Behavior and Cyber Conduct of Chatters in Chat Rooms...
Psychoanalysis of Online Behavior and Cyber Conduct of Chatters in Chat Rooms...Psychoanalysis of Online Behavior and Cyber Conduct of Chatters in Chat Rooms...
Psychoanalysis of Online Behavior and Cyber Conduct of Chatters in Chat Rooms...
 
Laboratorio 4
Laboratorio 4Laboratorio 4
Laboratorio 4
 
Competitividad Y Crecimiento Pasos Que Chile Debe Dar
Competitividad Y Crecimiento Pasos Que Chile Debe DarCompetitividad Y Crecimiento Pasos Que Chile Debe Dar
Competitividad Y Crecimiento Pasos Que Chile Debe Dar
 

Similaire à Writing HTTP Middleware In Go

05.m3 cms list-ofwebserver
05.m3 cms list-ofwebserver05.m3 cms list-ofwebserver
05.m3 cms list-ofwebserver
tarensi
 
Presentation1
Presentation1Presentation1
Presentation1
Twigsta
 

Similaire à Writing HTTP Middleware In Go (20)

Basics of the Web Platform
Basics of the Web PlatformBasics of the Web Platform
Basics of the Web Platform
 
Evolution Of The Web Platform & Browser Security
Evolution Of The Web Platform & Browser SecurityEvolution Of The Web Platform & Browser Security
Evolution Of The Web Platform & Browser Security
 
ASP.NET Mvc 4 web api
ASP.NET Mvc 4 web apiASP.NET Mvc 4 web api
ASP.NET Mvc 4 web api
 
Spider Course Day 1
Spider Course Day 1Spider Course Day 1
Spider Course Day 1
 
Presentation on php and Javascript
Presentation on php and JavascriptPresentation on php and Javascript
Presentation on php and Javascript
 
CNIT 129S: Ch 3: Web Application Technologies
CNIT 129S: Ch 3: Web Application TechnologiesCNIT 129S: Ch 3: Web Application Technologies
CNIT 129S: Ch 3: Web Application Technologies
 
Desktop Apps with PHP and Titanium
Desktop Apps with PHP and TitaniumDesktop Apps with PHP and Titanium
Desktop Apps with PHP and Titanium
 
Php reports sumit
Php reports sumitPhp reports sumit
Php reports sumit
 
KMUTNB - Internet Programming 2/7
KMUTNB - Internet Programming 2/7KMUTNB - Internet Programming 2/7
KMUTNB - Internet Programming 2/7
 
Intro apache
Intro apacheIntro apache
Intro apache
 
CNIT 129S - Ch 3: Web Application Technologies
CNIT 129S - Ch 3: Web Application TechnologiesCNIT 129S - Ch 3: Web Application Technologies
CNIT 129S - Ch 3: Web Application Technologies
 
Java part 3
Java part  3Java part  3
Java part 3
 
Www(alyssa) (2)
Www(alyssa) (2)Www(alyssa) (2)
Www(alyssa) (2)
 
5-WebServers.ppt
5-WebServers.ppt5-WebServers.ppt
5-WebServers.ppt
 
Shindig Apachecon Asia 09
Shindig Apachecon Asia 09Shindig Apachecon Asia 09
Shindig Apachecon Asia 09
 
05.m3 cms list-ofwebserver
05.m3 cms list-ofwebserver05.m3 cms list-ofwebserver
05.m3 cms list-ofwebserver
 
JS BASICS JAVA SCRIPT SCRIPTING
JS BASICS JAVA SCRIPT SCRIPTINGJS BASICS JAVA SCRIPT SCRIPTING
JS BASICS JAVA SCRIPT SCRIPTING
 
Middleware in Golang: InVision's Rye
Middleware in Golang: InVision's RyeMiddleware in Golang: InVision's Rye
Middleware in Golang: InVision's Rye
 
Module-3 15CS71-WTA-Serverside Development with PHP
Module-3 15CS71-WTA-Serverside Development with PHPModule-3 15CS71-WTA-Serverside Development with PHP
Module-3 15CS71-WTA-Serverside Development with PHP
 
Presentation1
Presentation1Presentation1
Presentation1
 

Plus de Shiju Varghese

NoSQL Database in .NET Apps
NoSQL Database in .NET AppsNoSQL Database in .NET Apps
NoSQL Database in .NET Apps
Shiju Varghese
 

Plus de Shiju Varghese (20)

Building Modern Distributed Applications in Go with Service Weaver
Building Modern Distributed Applications in Go with Service WeaverBuilding Modern Distributed Applications in Go with Service Weaver
Building Modern Distributed Applications in Go with Service Weaver
 
NATS: A Cloud Native Messaging System
NATS: A Cloud Native Messaging SystemNATS: A Cloud Native Messaging System
NATS: A Cloud Native Messaging System
 
Event-Driven Microservices With NATS Streaming
Event-Driven Microservices With NATS StreamingEvent-Driven Microservices With NATS Streaming
Event-Driven Microservices With NATS Streaming
 
Building Microservices with gRPC and NATS
Building Microservices with gRPC and NATSBuilding Microservices with gRPC and NATS
Building Microservices with gRPC and NATS
 
A Primer to Containerization & Microservices
A Primer to Containerization & MicroservicesA Primer to Containerization & Microservices
A Primer to Containerization & Microservices
 
Building RESTful Services With Go and MongoDB
Building RESTful Services With Go and MongoDBBuilding RESTful Services With Go and MongoDB
Building RESTful Services With Go and MongoDB
 
Docker and Kubernetes
Docker and KubernetesDocker and Kubernetes
Docker and Kubernetes
 
Practicing Mindfulness
Practicing MindfulnessPracticing Mindfulness
Practicing Mindfulness
 
Azure DocumentDB
Azure DocumentDBAzure DocumentDB
Azure DocumentDB
 
Azure Mobile Services .NET Backend
Azure Mobile Services .NET BackendAzure Mobile Services .NET Backend
Azure Mobile Services .NET Backend
 
Windows Azure Mobile Services
Windows Azure Mobile ServicesWindows Azure Mobile Services
Windows Azure Mobile Services
 
JavaScript, Meet Cloud : Node.js on Windows Azure
JavaScript, Meet Cloud : Node.js on Windows AzureJavaScript, Meet Cloud : Node.js on Windows Azure
JavaScript, Meet Cloud : Node.js on Windows Azure
 
Introduction to Node js
Introduction to Node jsIntroduction to Node js
Introduction to Node js
 
Windows Azure Cloud Services
Windows Azure Cloud Services Windows Azure Cloud Services
Windows Azure Cloud Services
 
Windows Azure Webs Sites
Windows Azure Webs SitesWindows Azure Webs Sites
Windows Azure Webs Sites
 
Building Apps with Node.js
Building Apps with Node.jsBuilding Apps with Node.js
Building Apps with Node.js
 
Node on Windows Azure
Node on Windows AzureNode on Windows Azure
Node on Windows Azure
 
Introducing Razor - A new view engine for ASP.NET
Introducing Razor - A new view engine for ASP.NET Introducing Razor - A new view engine for ASP.NET
Introducing Razor - A new view engine for ASP.NET
 
NoSQL Database in .NET Apps
NoSQL Database in .NET AppsNoSQL Database in .NET Apps
NoSQL Database in .NET Apps
 
TDD with ASP.NET MVC 1.0
TDD with ASP.NET MVC 1.0TDD with ASP.NET MVC 1.0
TDD with ASP.NET MVC 1.0
 

Dernier

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Dernier (20)

FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 

Writing HTTP Middleware In Go