SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
RESTful Services	in	Python	on	
Google	App	Engine
Ryan	Morlok
Docalytics
http://documents.morlok.net/devfest-2015
Overview
• What	is	REST?
• Why	JSON?
• HTTP	Considerations
• One	example,	three	ways
– Raw	Webapp2
– Google	Cloud	Endpoints
– Protopy
http://documents.morlok.net/devfest-2015
http://documents.morlok.net/devfest-2015
What	Make	REST	Different?
• REpresentational State	
Transfer
• An	approach,	not	a	
standard
• REST	is	noun oriented	
while	RPC	is	verb
oriented
• URIs
• HTTP	Verbs
• A	pragmatic	spectrum	
exists
http://documents.morlok.net/devfest-2015
JSON
• JavaScript	Object	
Notation
• Invented	by	Douglas	
Crockford in	in	the	
early-2000’s
• Based	on	the	object	
literal	format	in	
JavaScript
http://documents.morlok.net/devfest-2015
JSON						versus									XML
• Data	interchange	
format
• Simple
• Maps	naturally	to	native	
data	types
• Human	
Readable/Writable
• Limited	data	types
• Document	format
• Formal	(schema	
definitions,	
namespaces,	etc)
• Transforms
• XPath/Xquery
• Extensible
CRUD	via	HTTP
Create è POST
Read è GET
Update è PUT,	PATCH
Delete è DELETE
http://documents.morlok.net/devfest-2015
PUT								versus								PATCH
• Idempotent
• Set	the	resource	as	
desired
• Can	also	be	used	for	
create
• Idempotent
• Set	sub-properties	of	
the	resource
• Only	used	for	update
• Absent	Property	!=	null
http://documents.morlok.net/devfest-2015
HTTP	Status	Codes
Code Meaining Used	in
200 OK Successful	GETs,	PUTs,	PATCHes
201 Created Successful	POSTs
204 No	Content Successful	DELETEs
301 Moved	Permanently
302 Found
400 Bad	Request Invalid	query	parameters or	request	body
403 Forbidden Access	denied	to	resource
404 Not	Found Cannot	find	resource
410 Gone
418 I’m	a	teapot This	is	the real	meaning	of	this	code
500 Internal	Server	Error You	screwed	up
501 Not	implemented Valid	resource,	method	not	supported
http://documents.morlok.net/devfest-2015
Tools
• Fiddler
• Postman	REST	Client
• cUrl
• Python	requests	library
http://documents.morlok.net/devfest-2015
Entities
Team:
• Name
• Mascot
• Colors
Player:
• Team
• Name
• Position
Team Player
*1
http://documents.morlok.net/devfest-2015
URL	Structure
GET /v1/teams
POST /v1/teams
GET /v1/teams/<team_id>
PUT /v1/teams/<team_id>
PATCH /v1/teams/<team_id>
DELETE /v1/teams/<team_id>
GET /v1/teams/<team_id>/players
POST /v1/teams/<team_id>/players
GET /v1/teams/<team_id>/players/<player_id>
PUT /v1/teams/<team_id>/players/<player_id>
PATCH /v1/teams/<team_id>/players/<player_id>
DELETE /v1/teams/<team_id>/players/<player_id>
http://documents.morlok.net/devfest-2015
NDB	Entities
from google.appengine.ext import ndb
class Team(ndb.Model):
name = ndb.StringProperty()
colors = ndb.StringProperty(repeated=True)
mascot = ndb.StringProperty()
class Player(ndb.Model):
team = ndb.KeyProperty()
name = ndb.StringProperty()
position = ndb.StringProperty()
http://documents.morlok.net/devfest-2015
JSON	Structure
Team
{
"id": "...",
"name": "Minnesota",
"mascot": "Gopher",
"colors": [
"maroon",
"gold"
]
}
Player
{
"id": "...",
"name": "Kyle Rau",
"position": "Defense",
"team_id": ”...",
}
http://documents.morlok.net/devfest-2015
JSON +	WEBAPP2
Monkey	Patch	Webapp2	for	PATCH
import webapp2
allowed_methods = webapp2.WSGIApplication.allowed_methods
new_allowed_methods = allowed_methods.union(('PATCH',))
webapp2.WSGIApplication.allowed_methods =
new_allowed_methods
Define	Endpoints
class TeamHandler(webapp2.RequestHandler):
…
def get_team(self, team_id):
self.response.content_type = 'application/json'
self.response.write(json.dumps(team_to_dict(
get_team_or_404(team_id))))
app = webapp2.WSGIApplication([
…
webapp2.Route(r'/v1/teams/<team_id>',
methods=['GET’],
handler='main.TeamHandler:get_team',
name='get_team’)
…
])
Raise	Exceptions	For	Error	Statuses
def get_team_or_404(team_id):
t = ndb.Key(urlsafe=team_id).get()
if not t:
raise webapp2.exc.HTTPNotFound()
if not isinstance(t, Team):
raise webapp2.exc.HTTPNotFound()
return t
http://documents.morlok.net/devfest-2015
Team:	Entity	è Dict è JSON	
def team_to_dict(team):
d = team.to_dict()
d['id'] = team.key.id() if team.key else None
return d
# json.dumps(team_to_dict(Team(name="Minnesota",
mascot="Gopher", colors=["maroon", "gold"])))
# => {
"id": null,
"colors": ["maroon", "gold"],
"name": "Minnesota",
"mascot": "Gopher”
}
http://documents.morlok.net/devfest-2015
Player:	Entity	è Dict è JSON	
def player_to_dict(player):
return {
'id': player.key.id() if player.key else None,
'name': player.name,
'position': player.position,
'team_id': player.team.id() if player.team
else None
}
# json.dumps(main.player_to_dict(
main.Player(name="Kyle Rau", position="Forward",
team=t.key)))
# => {"position": "Forward", "team_id": 1,
"id": null, "name": "Kyle Rau"}
Set	Headers,	Status,	Write	Response
class TeamHandler(webapp2.RequestHandler):
…
def create_team(self):
team = None
try:
team_dict = json.loads(self.request.body)
team = dict_to_team_set(team_dict)
team.put()
except:
raise webapp2.exc.HTTPBadRequest()
self.response.headers['Location'] = webapp2.uri_for(
'get_team', team_id=team.key.urlsafe())
self.response.status_int = 201
self.response.content_type = 'application/json'
self.response.write(json.dumps(team_to_dict(team)))
http://documents.morlok.net/devfest-2015
GOOGLE	CLOUD	ENDPOINTS
API	Explorer
Define	Messages
from protorpc import messages, message_types, remote
class TeamMessage(messages.Message):
id = messages.StringField(1)
name = messages.StringField(2)
colors = messages.StringField(3, repeated=True)
mascot = messages.StringField(4)
class PlayerMessage(messages.Message):
id = messages.StringField(1)
name = messages.StringField(2)
position = messages.StringField(3)
team_id = messages.StringField(4)
Annotate	Endpoints
@endpoints.api(name='sports',
version='v1',
description='Sports API')
class SportsAPI(remote.Service):
@endpoints.method(message_types.VoidMessage,
TeamsResponseMessage,
name='teamsList',
path='teams',
http_method='GET')
def get_teams(self, request):
response = TeamsResponseMessage()
response.teams = []
for team in Team.query().iter():
response.teams.append(team_to_msg(team))
return response
All	Data	Needs	a	Wrapper
TEAM_UPDATE = endpoints.ResourceContainer(
TeamMessage,
team_id=messages.StringField(2, required=True))
class SportsAPI(remote.Service):
@endpoints.method(TEAM_UPDATE,
TeamMessage,
name='teamsSet',
path='teams/{team_id}',
http_method='PUT')
def set_team(self, request):
team = get_team_or_404(request.team_id)
team = msg_to_team_set(request, team=team)
team.put()
return team_to_msg(team)
PATCH	Not	Possible
def msg_to_player_update(msg, player=None):
player = player or Player()
if msg.name is not None:
player.name = msg.name
if msg.position is not None:
player.position = msg.position
if msg.team_id is not None:
team_id = msg.team_id
player.team = ndb.Key(urlsafe=team_id)
return player
http://documents.morlok.net/devfest-2015
PROTOPY
http://documents.morlok.net/devfest-2015
Why	ProtoPy
• Messages	are	good,	but	need	to	be	simplified
• Fully	support	PATCH
• Maintain	control	of	HTTP
• Control	URL	structure
• Support	for	unstructured	data
Messages
class TeamMessage(messages.Message):
id = messages.StringField()
name = messages.StringField()
colors = messages.StringField(repeated=True)
mascot = messages.StringField()
class PlayerMessage(messages.Message):
id = messages.StringField()
name = messages.StringField()
position = messages.StringField()
team_id = messages.StringField()
Annotate	Endpoints
class PlayerHandler(webapp2.RequestHandler):
@protopy.endpoint
@protopy.query.string('position')
def get_players(self, team_id, position):
_ = get_team_or_404(team_id)
response = PlayersResponseMessage()
response.players = []
q = Player.query(Player.team ==
ndb.Key(urlsafe=team_id))
if position:
q = q.filter(Player.position == position)
for player in q.iter():
response.players.append(player_to_msg(player))
return response
Control	HTTP
class PlayerHandler(webapp2.RequestHandler):
@protopy.endpoint(player_details=PlayerMessage)
def create_player(self, team_id, player_details):
_ = get_team_or_404(team_id)
player_details.team_id = team_id
player = msg_to_player_set(player_details)
player.put()
return 201, player_to_msg(player),
{'Location': webapp2.uri_for('get_player',
team_id=team_id, player_id=player.key.urlsafe())}
http://documents.morlok.net/devfest-2015
CLOSING	THOUGHTS
Code	Structure
Handlers
HTTP	Concerns
Services
Business	Logic
Models
Persistence
Messages
Models
Models,	Messages
http://documents.morlok.net/devfest-2015
Tips	&	Tricks
• Special	IDs
• RPC	methods	off	of	resources	when	it	makes	
more	sense
• Think	hard	before	using	nested	resources
• Prefer	PATCH	to	PUT
Thank	You
@rmorlok
ryan.morlok@morlok.com
https://github.com/rmorlok

Weitere ähnliche Inhalte

Was ist angesagt?

The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2fishwarter
 
Jumpstart Django
Jumpstart DjangoJumpstart Django
Jumpstart Djangoryates
 
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KThomas Fuchs
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldChristian Melchior
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projectsIgnacio Martín
 
Django Framework Overview forNon-Python Developers
Django Framework Overview forNon-Python DevelopersDjango Framework Overview forNon-Python Developers
Django Framework Overview forNon-Python DevelopersRosario Renga
 
ERRest - Designing a good REST service
ERRest - Designing a good REST serviceERRest - Designing a good REST service
ERRest - Designing a good REST serviceWO Community
 
Introducing Apache Spark's Data Frames and Dataset APIs workshop series
Introducing Apache Spark's Data Frames and Dataset APIs workshop seriesIntroducing Apache Spark's Data Frames and Dataset APIs workshop series
Introducing Apache Spark's Data Frames and Dataset APIs workshop seriesHolden Karau
 
Introduction to Grails Framework
Introduction to Grails FrameworkIntroduction to Grails Framework
Introduction to Grails FrameworkPT.JUG
 
Django Overview
Django OverviewDjango Overview
Django OverviewBrian Tol
 
django Forms in a Web API World
django Forms in a Web API Worlddjango Forms in a Web API World
django Forms in a Web API WorldTareque Hossain
 
Beyond parallelize and collect - Spark Summit East 2016
Beyond parallelize and collect - Spark Summit East 2016Beyond parallelize and collect - Spark Summit East 2016
Beyond parallelize and collect - Spark Summit East 2016Holden Karau
 
Akka and the Zen of Reactive System Design
Akka and the Zen of Reactive System DesignAkka and the Zen of Reactive System Design
Akka and the Zen of Reactive System DesignLightbend
 

Was ist angesagt? (20)

The Django Web Application Framework 2
The Django Web Application Framework 2The Django Web Application Framework 2
The Django Web Application Framework 2
 
Jumpstart Django
Jumpstart DjangoJumpstart Django
Jumpstart Django
 
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
 
Painless Persistence in a Disconnected World
Painless Persistence in a Disconnected WorldPainless Persistence in a Disconnected World
Painless Persistence in a Disconnected World
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
Discovering Django - zekeLabs
Discovering Django - zekeLabsDiscovering Django - zekeLabs
Discovering Django - zekeLabs
 
Slickdemo
SlickdemoSlickdemo
Slickdemo
 
Having Fun with Play
Having Fun with PlayHaving Fun with Play
Having Fun with Play
 
KISS Automation.py
KISS Automation.pyKISS Automation.py
KISS Automation.py
 
Django Framework Overview forNon-Python Developers
Django Framework Overview forNon-Python DevelopersDjango Framework Overview forNon-Python Developers
Django Framework Overview forNon-Python Developers
 
ERRest - Designing a good REST service
ERRest - Designing a good REST serviceERRest - Designing a good REST service
ERRest - Designing a good REST service
 
Introducing Apache Spark's Data Frames and Dataset APIs workshop series
Introducing Apache Spark's Data Frames and Dataset APIs workshop seriesIntroducing Apache Spark's Data Frames and Dataset APIs workshop series
Introducing Apache Spark's Data Frames and Dataset APIs workshop series
 
JS Essence
JS EssenceJS Essence
JS Essence
 
Introduction to Grails Framework
Introduction to Grails FrameworkIntroduction to Grails Framework
Introduction to Grails Framework
 
Django Overview
Django OverviewDjango Overview
Django Overview
 
django Forms in a Web API World
django Forms in a Web API Worlddjango Forms in a Web API World
django Forms in a Web API World
 
Beyond parallelize and collect - Spark Summit East 2016
Beyond parallelize and collect - Spark Summit East 2016Beyond parallelize and collect - Spark Summit East 2016
Beyond parallelize and collect - Spark Summit East 2016
 
Akka and the Zen of Reactive System Design
Akka and the Zen of Reactive System DesignAkka and the Zen of Reactive System Design
Akka and the Zen of Reactive System Design
 
2012: ql.io and Node.js
2012: ql.io and Node.js2012: ql.io and Node.js
2012: ql.io and Node.js
 
Mongo db
Mongo dbMongo db
Mongo db
 

Andere mochten auch

2011 july-gtug-high-replication-datastore
2011 july-gtug-high-replication-datastore2011 july-gtug-high-replication-datastore
2011 july-gtug-high-replication-datastoreikailan
 
Googleクラウドサービスを利用したシステム構築
Googleクラウドサービスを利用したシステム構築Googleクラウドサービスを利用したシステム構築
Googleクラウドサービスを利用したシステム構築Naomichi Yamakita
 
プロ用CMSフレームワークテーマ「echo」のご紹介
プロ用CMSフレームワークテーマ「echo」のご紹介プロ用CMSフレームワークテーマ「echo」のご紹介
プロ用CMSフレームワークテーマ「echo」のご紹介Seiko Kuchida
 
Google App Engine Java 入門
Google App Engine Java 入門Google App Engine Java 入門
Google App Engine Java 入門tantack
 
Google cloud datastore driver for Google Apps Script DB abstraction
Google cloud datastore driver for Google Apps Script DB abstractionGoogle cloud datastore driver for Google Apps Script DB abstraction
Google cloud datastore driver for Google Apps Script DB abstractionBruce McPherson
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るMasahiro Wakame
 
リーンスタートアップにおける、実装やライブ配信基盤の共通化 村田紘司
リーンスタートアップにおける、実装やライブ配信基盤の共通化 村田紘司リーンスタートアップにおける、実装やライブ配信基盤の共通化 村田紘司
リーンスタートアップにおける、実装やライブ配信基盤の共通化 村田紘司紘司 村田
 
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑Seiji Takahashi
 
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 SummerGoのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 SummerHirokazu Fukami
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Takuya Ueda
 
How to make GAE adapt the Great Firewall
How to make GAE adapt the Great FirewallHow to make GAE adapt the Great Firewall
How to make GAE adapt the Great FirewallHayato Yoshikawa
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppAkihiko Horiuchi
 
[Golang] Go言語でサービス作ってる話
[Golang] Go言語でサービス作ってる話[Golang] Go言語でサービス作ってる話
[Golang] Go言語でサービス作ってる話株式会社YEBIS.XYZ
 
Java?ruby? そろそろgoで行ってみませんか?
Java?ruby? そろそろgoで行ってみませんか? Java?ruby? そろそろgoで行ってみませんか?
Java?ruby? そろそろgoで行ってみませんか? Kenichi Hoshi
 
Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践Takuya Ueda
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangYoshiki Shibukawa
 
Golangによるubicの試作
Golangによるubicの試作Golangによるubicの試作
Golangによるubicの試作kn1kn1
 

Andere mochten auch (20)

Webapp2 2.2
Webapp2 2.2Webapp2 2.2
Webapp2 2.2
 
2011 july-gtug-high-replication-datastore
2011 july-gtug-high-replication-datastore2011 july-gtug-high-replication-datastore
2011 july-gtug-high-replication-datastore
 
Googleクラウドサービスを利用したシステム構築
Googleクラウドサービスを利用したシステム構築Googleクラウドサービスを利用したシステム構築
Googleクラウドサービスを利用したシステム構築
 
プロ用CMSフレームワークテーマ「echo」のご紹介
プロ用CMSフレームワークテーマ「echo」のご紹介プロ用CMSフレームワークテーマ「echo」のご紹介
プロ用CMSフレームワークテーマ「echo」のご紹介
 
Google App Engine Java 入門
Google App Engine Java 入門Google App Engine Java 入門
Google App Engine Java 入門
 
Google cloud datastore driver for Google Apps Script DB abstraction
Google cloud datastore driver for Google Apps Script DB abstractionGoogle cloud datastore driver for Google Apps Script DB abstraction
Google cloud datastore driver for Google Apps Script DB abstraction
 
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作るGoCon 2015 Summer GoのASTをいじくって新しいツールを作る
GoCon 2015 Summer GoのASTをいじくって新しいツールを作る
 
リーンスタートアップにおける、実装やライブ配信基盤の共通化 村田紘司
リーンスタートアップにおける、実装やライブ配信基盤の共通化 村田紘司リーンスタートアップにおける、実装やライブ配信基盤の共通化 村田紘司
リーンスタートアップにおける、実装やライブ配信基盤の共通化 村田紘司
 
google Bigtable
google Bigtablegoogle Bigtable
google Bigtable
 
minne の API 改善
minne の API 改善minne の API 改善
minne の API 改善
 
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
お前なんかハッカーじゃない╭( ・ㅂ・)و ̑̑
 
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 SummerGoのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
 
How to make GAE adapt the Great Firewall
How to make GAE adapt the Great FirewallHow to make GAE adapt the Great Firewall
How to make GAE adapt the Great Firewall
 
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebAppGinとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
 
[Golang] Go言語でサービス作ってる話
[Golang] Go言語でサービス作ってる話[Golang] Go言語でサービス作ってる話
[Golang] Go言語でサービス作ってる話
 
Java?ruby? そろそろgoで行ってみませんか?
Java?ruby? そろそろgoで行ってみませんか? Java?ruby? そろそろgoで行ってみませんか?
Java?ruby? そろそろgoで行ってみませんか?
 
Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践Namespace API を用いたマルチテナント型 Web アプリの実践
Namespace API を用いたマルチテナント型 Web アプリの実践
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolang
 
Golangによるubicの試作
Golangによるubicの試作Golangによるubicの試作
Golangによるubicの試作
 

Ähnlich wie Restful App Engine

Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Luigi Dell'Aquila
 
Consuming REST services with ActiveResource
Consuming REST services with ActiveResourceConsuming REST services with ActiveResource
Consuming REST services with ActiveResourceWolfram Arnold
 
Dynamics 365 CRM Javascript Customization
Dynamics 365 CRM Javascript CustomizationDynamics 365 CRM Javascript Customization
Dynamics 365 CRM Javascript CustomizationSanjaya Prakash Pradhan
 
Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Matthew Groves
 
Full Stack Development with Node.js and NoSQL
Full Stack Development with Node.js and NoSQLFull Stack Development with Node.js and NoSQL
Full Stack Development with Node.js and NoSQLAll Things Open
 
03 form-data
03 form-data03 form-data
03 form-datasnopteck
 
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)Kai Chan
 
Kerberizing spark. Spark Summit east
Kerberizing spark. Spark Summit eastKerberizing spark. Spark Summit east
Kerberizing spark. Spark Summit eastJorge Lopez-Malla
 
Hands On Spring Data
Hands On Spring DataHands On Spring Data
Hands On Spring DataEric Bottard
 
Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)Jonathan Felch
 
Your Database Cannot Do this (well)
Your Database Cannot Do this (well)Your Database Cannot Do this (well)
Your Database Cannot Do this (well)javier ramirez
 
Drupal 8 Deep Dive: What It Means for Developers Now that REST Is in Core
Drupal 8 Deep Dive: What It Means for Developers Now that REST Is in Core Drupal 8 Deep Dive: What It Means for Developers Now that REST Is in Core
Drupal 8 Deep Dive: What It Means for Developers Now that REST Is in Core Acquia
 
Creating web applications with LODSPeaKr
Creating web applications with LODSPeaKrCreating web applications with LODSPeaKr
Creating web applications with LODSPeaKrAlvaro Graves
 
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...SPTechCon
 
RESTful JSON web databases
RESTful JSON web databasesRESTful JSON web databases
RESTful JSON web databaseskriszyp
 
Make BDD great again
Make BDD great againMake BDD great again
Make BDD great againYana Gusti
 
RedisConf18 - Redis and Elasticsearch
RedisConf18 - Redis and ElasticsearchRedisConf18 - Redis and Elasticsearch
RedisConf18 - Redis and ElasticsearchRedis Labs
 

Ähnlich wie Restful App Engine (20)

Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
Geospatial Graphs made easy with OrientDB - Codemotion Warsaw 2016
 
Consuming REST services with ActiveResource
Consuming REST services with ActiveResourceConsuming REST services with ActiveResource
Consuming REST services with ActiveResource
 
Dynamics 365 CRM Javascript Customization
Dynamics 365 CRM Javascript CustomizationDynamics 365 CRM Javascript Customization
Dynamics 365 CRM Javascript Customization
 
Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017
 
Full Stack Development with Node.js and NoSQL
Full Stack Development with Node.js and NoSQLFull Stack Development with Node.js and NoSQL
Full Stack Development with Node.js and NoSQL
 
03 form-data
03 form-data03 form-data
03 form-data
 
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
Search Engine Building with Lucene and Solr (So Code Camp San Diego 2014)
 
Kerberizing spark. Spark Summit east
Kerberizing spark. Spark Summit eastKerberizing spark. Spark Summit east
Kerberizing spark. Spark Summit east
 
Hands On Spring Data
Hands On Spring DataHands On Spring Data
Hands On Spring Data
 
Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)Groovy On Trading Desk (2010)
Groovy On Trading Desk (2010)
 
Your Database Cannot Do this (well)
Your Database Cannot Do this (well)Your Database Cannot Do this (well)
Your Database Cannot Do this (well)
 
Drupal 8 Deep Dive: What It Means for Developers Now that REST Is in Core
Drupal 8 Deep Dive: What It Means for Developers Now that REST Is in Core Drupal 8 Deep Dive: What It Means for Developers Now that REST Is in Core
Drupal 8 Deep Dive: What It Means for Developers Now that REST Is in Core
 
huhu
huhuhuhu
huhu
 
ReactJS for Beginners
ReactJS for BeginnersReactJS for Beginners
ReactJS for Beginners
 
Creating web applications with LODSPeaKr
Creating web applications with LODSPeaKrCreating web applications with LODSPeaKr
Creating web applications with LODSPeaKr
 
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
The Magic Revealed: Four Real-World Examples of Using the Client Object Model...
 
RESTful JSON web databases
RESTful JSON web databasesRESTful JSON web databases
RESTful JSON web databases
 
Express.pdf
Express.pdfExpress.pdf
Express.pdf
 
Make BDD great again
Make BDD great againMake BDD great again
Make BDD great again
 
RedisConf18 - Redis and Elasticsearch
RedisConf18 - Redis and ElasticsearchRedisConf18 - Redis and Elasticsearch
RedisConf18 - Redis and Elasticsearch
 

Kürzlich hochgeladen

CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AIABDERRAOUF MEHENNI
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceanilsa9823
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 

Kürzlich hochgeladen (20)

CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AISyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
SyndBuddy AI 2k Review 2024: Revolutionizing Content Syndication with AI
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female serviceCALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
CALL ON ➥8923113531 🔝Call Girls Badshah Nagar Lucknow best Female service
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 

Restful App Engine