SlideShare a Scribd company logo
1 of 199
Download to read offline
GraphQL
vs
Traditional REST API
Vladimir Dejanović
@VladimirD_42
amsterdamjug.com
ITShark.xyz
#DevoxxMA
#GraphQlVsRest
@VladimirD_42
Vladimir Dejanović
Let’s Meet
#GraphQlVsRest
@VladimirD_42
Vladimir Dejanović
Let’s Meet
#GraphQlVsRest
@VladimirD_42
Agenda
#GraphQlVsRest
@VladimirD_42
REST
Agenda
#GraphQlVsRest
@VladimirD_42
GraphQL
REST
Agenda
#GraphQlVsRest
@VladimirD_42
GraphQL
REST
Agenda
Questions
What is REST?
#GraphQlVsRest
#GraphQlVsRest
@VladimirD_42
REST
#GraphQlVsRest
@VladimirD_42
REST
Client-Server architecture
#GraphQlVsRest
@VladimirD_42
REST
Client-Server architecture
Statelessness
#GraphQlVsRest
@VladimirD_42
REST
Client-Server architecture
Statelessness
Cacheability
#GraphQlVsRest
@VladimirD_42
REST
Client-Server architecture
Statelessness
Cacheability
Layered system
#GraphQlVsRest
@VladimirD_42
REST
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
#GraphQlVsRest
@VladimirD_42
REST
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
Uniform Interface
#GraphQlVsRest
@VladimirD_42
REST
http://www.ics.uci.edu/~fielding/pubs/
dissertation/rest_arch_style.htm
#GraphQlVsRest
@VladimirD_42
Traditional REST API
#GraphQlVsRest
@VladimirD_42
Traditional REST API
#GraphQlVsRest
@VladimirD_42
Traditional REST API
#GraphQlVsRest
@VladimirD_42
Traditional REST API
#GraphQlVsRest
@VladimirD_42
Simple Blog
#GraphQlVsRest
@VladimirD_42
Simple Blog
Author
id
name
#GraphQlVsRest
@VladimirD_42
Simple Blog
Author
id
name
Post
id
title
body
authorId
#GraphQlVsRest
@VladimirD_42
Simple Blog
Author
id
name
Post
id
title
body
authorId
Comment
id
text
postId
authorId
#GraphQlVsRest
@VladimirD_42
Simple Blog
#GraphQlVsRest
@VladimirD_42
WARNING!!!!
Level of my real code is better ;)
This code was made intently for
demos, including errors and bad
code
Simple Blog
#GraphQlVsRest
@VladimirD_42
Let us Look at some code :D
Simple Blog
#GraphQlVsRest
@VladimirD_42
@Data
@Document(collection="authors")
public class Author {
@Id
private final String id;
private final String name;
}
Simple Blog
#GraphQlVsRest
@VladimirD_42
@Data
@Document(collection="authors")
public class Author {
@Id
private final String id;
private final String name;
}
Simple Blog
#GraphQlVsRest
@VladimirD_42
@Data
@Document(collection="authors")
public class Author {
@Id
private final String id;
private final String name;
}
Simple Blog
#GraphQlVsRest
@VladimirD_42
@Data
@Document(collection="authors")
public class Author {
@Id
private final String id;
private final String name;
}
Simple Blog
#GraphQlVsRest
@VladimirD_42
@Data
@Document(collection="authors")
public class Author {
@Id
private final String id;
private final String name;
}
Simple Blog
#GraphQlVsRest
@VladimirD_42
public interface AuthorRepository extends
MongoRepository<Author, String>
{}
Simple Blog
#GraphQlVsRest
@VladimirD_42
public interface AuthorRepository extends
MongoRepository<Author, String>
{}
Simple Blog
#GraphQlVsRest
@VladimirD_42
public interface AuthorRepository extends
MongoRepository<Author, String>
{}
Simple Blog
#GraphQlVsRest
@VladimirD_42
@RestControllerpublic
class SimpleRestController {
@Autowired
AuthorRepository authRepo;
@RequestMapping(path="/authors")
public List<Author> getAllAuthors() {
return authRepo.findAll(); }
@RequestMapping(path="/authors/{id}")
public Author getAuthorById(
@PathVariable String id) {
return authRepo.findOne(id);}
. . . . . .
Simple Blog
#GraphQlVsRest
@VladimirD_42
@RestControllerpublic
class SimpleRestController {
@Autowired
AuthorRepository authRepo;
@RequestMapping(path="/authors")
public List<Author> getAllAuthors() {
return authRepo.findAll(); }
@RequestMapping(path="/authors/{id}")
public Author getAuthorById(
@PathVariable String id) {
return authRepo.findOne(id);}
. . . . . .
Simple Blog
#GraphQlVsRest
@VladimirD_42
@RestControllerpublic
class SimpleRestController {
@Autowired
AuthorRepository authRepo;
@RequestMapping(path="/authors")
public List<Author> getAllAuthors() {
return authRepo.findAll(); }
@RequestMapping(path="/authors/{id}")
public Author getAuthorById(
@PathVariable String id) {
return authRepo.findOne(id);}
. . . . . .
Simple Blog
#GraphQlVsRest
@VladimirD_42
@RestControllerpublic
class SimpleRestController {
@Autowired
AuthorRepository authRepo;
@RequestMapping(path="/authors")
public List<Author> getAllAuthors() {
return authRepo.findAll(); }
@RequestMapping(path="/authors/{id}")
public Author getAuthorById(
@PathVariable String id) {
return authRepo.findOne(id);}
. . . . . .
Simple Blog
#GraphQlVsRest
@VladimirD_42
@RestControllerpublic
class SimpleRestController {
@Autowired
AuthorRepository authRepo;
@RequestMapping(path="/authors")
public List<Author> getAllAuthors() {
return authRepo.findAll(); }
@RequestMapping(path="/authors/{id}")
public Author getAuthorById(
@PathVariable String id) {
return authRepo.findOne(id);}
. . . . . .
Simple Blog
#GraphQlVsRest
@VladimirD_42
$ curl http://localhost:8080/authors | json_pp
[
{
"id" : "59f4c0f37718af0b1e001071",
"name" : "Ed Wong”
},
{
"id" : "59f4c1687718af0b1e001073",
"name" : "Son Goku”
}
]
Simple Blog
#GraphQlVsRest
@VladimirD_42
$ curl http://localhost:8080/authors | json_pp
[
{
"id" : "59f4c0f37718af0b1e001071",
"name" : "Ed Wong”
},
{
"id" : "59f4c1687718af0b1e001073",
"name" : "Son Goku”
}
]
Simple Blog
#GraphQlVsRest
@VladimirD_42
Code for Post and Comment similar
to code for Author
Simple Blog
#GraphQlVsRest
@VladimirD_42
$ curl http://localhost:8080/posts | json_pp
[
{
"body" : "Edward Wong Hau Pepelu Tivrusky IV
(エドワード・ウォン・ハウ・ペペル・チブルスキー4世 …………",
"title" : "Who is Ed Wong",
"authorId" : "59f4c0f37718af0b1e001071",
"id" : "59f4c12e7718af0b1e001072" },
. . . . . .
]
Simple Blog
#GraphQlVsRest
@VladimirD_42
$ curl http://localhost:8080/posts | json_pp
[
{
"body" : "Edward Wong Hau Pepelu Tivrusky IV
(エドワード・ウォン・ハウ・ペペル・チブルスキー4世 …………",
"title" : "Who is Ed Wong",
"authorId" : "59f4c0f37718af0b1e001071",
"id" : "59f4c12e7718af0b1e001072" },
. . . . . .
]
Simple Blog
#GraphQlVsRest
@VladimirD_42
$ curl http://localhost:8080/posts | json_pp
[
{
"body" : "Edward Wong Hau Pepelu Tivrusky IV
(エドワード・ウォン・ハウ・ペペル・チブルスキー4世 …………",
"title" : "Who is Ed Wong",
"authorId" : "59f4c0f37718af0b1e001071",
"id" : "59f4c12e7718af0b1e001072" },
. . . . . .
]
Simple Blog
#GraphQlVsRest
@VladimirD_42
$ curl
http://localhost:8080/authors/59f4c0f37718af0b1e0010
71 | json_pp
{
"name" : "Ed Wong",
"id" : "59f4c0f37718af0b1e001071”
}
Simple Blog
#GraphQlVsRest
@VladimirD_42
$ curl
http://localhost:8080/comments?post_id=59f4c12e7718a
f0b1e001072 | json_pp
[
{
"authorId" : "59f4c1687718af0b1e001073",
"text" : "you are great",
"id" : "59f4c3327718af0b1e001076",
"postId" : "59f4c12e7718af0b1e001072”
}
]
Simple Blog
#GraphQlVsRest
@VladimirD_42
Simple Blog
Simple REST API use case
#GraphQlVsRest
@VladimirD_42
Simple Blog
Simple REST API use case
‘‘Real enough’’
#GraphQlVsRest
@VladimirD_42
Simple Blog
Simple REST API use case
‘‘Real enough’’
Easy to extended, make complex
What is
GraphQL?
#GraphQlVsRest
#GraphQlVsRest
@VladimirD_42
GraphQL History
#GraphQlVsRest
@VladimirD_42
GraphQL History
Facebook internally 2012
#GraphQlVsRest
@VladimirD_42
GraphQL History
Public release 2015
Facebook internally 2012
#GraphQlVsRest
@VladimirD_42
GraphQL
GraphQL is a query language
for APIs
#GraphQlVsRest
@VladimirD_42
GraphQL
is
Specification
#GraphQlVsRest
@VladimirD_42
Talking is boring
Show us Code
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
type Author {
id: ID!
name: String!
}
type Post {
id: ID!
title: String!
body: String
authorId: String!
} . . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
type Comment {
id: ID!
authorId: String!
postId: String!
text: String
}
. . . .
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
}
type Query {
allPosts: [Post]
}
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
}
type Query {
allPosts: [Post]
}
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
}
type Query {
allPosts: [Post]
}
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
}
type Query {
allPosts: [Post]
}
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
}
type Query {
allPosts: [Post]
}
All Start with Schema
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
}
type Query {
allPosts: [Post]
}
All Start with Schema
#GraphQlVsRest
@VladimirD_42
Author, Post and Comment POJO are same
Repositories are same
Code
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
public class GraphQLEntryPoint extends
SimpleGraphQLServlet {
public
GraphQLEntryPoint(PostRepository p) {
super(buildSchema(p));
}
private static GraphQLSchema
buildSchema(PostRepository p) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository))
.build().makeExecutableSchema();
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructorpublic
class Query implements GraphQLRootResolver {
private final PostRepository postRepository;
public List<Post> allPosts() {
return postRepository.findAll();
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructorpublic
class Query implements GraphQLRootResolver {
private final PostRepository postRepository;
public List<Post> allPosts() {
return postRepository.findAll();
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructorpublic
class Query implements GraphQLRootResolver {
private final PostRepository postRepository;
public List<Post> allPosts() {
return postRepository.findAll();
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructorpublic
class Query implements GraphQLRootResolver {
private final PostRepository postRepository;
public List<Post> allPosts() {
return postRepository.findAll();
}
}
#GraphQlVsRest
@VladimirD_42
Request
query {
allPosts {
authorId
id
title
body
}
}
#GraphQlVsRest
@VladimirD_42
Response
{
"data": {
"allPosts": [
{
"authorId": "59f4c0f37718af0b1e001071",
"id": "59f4c12e7718af0b1e001072",
"title": "Who is Ed Wong",
"body": "Edward Wong Hau Pepelu .....”
},
. . . .
}
#GraphQlVsRest
@VladimirD_42
Request
query {
allPosts {
authorId
title
}
}
#GraphQlVsRest
@VladimirD_42
Response
{
"data": {
"allPosts": [
{
"authorId": "59f4c0f37718af0b1e001071",
"title": "Who is Ed Wong",
},
. . . .
}
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . .
type Post {
id: ID!
title: String!
body: String
createdBy: Author!
} . . . .
#GraphQlVsRest
@VladimirD_42
private static GraphQLSchema
buildSchema(PostRepository postRepository,
AuthorRepository authRepository) {
return SchemaParser.newParser()
.file("schema.graphqls")
.resolvers(new Query(postRepository),
new PostResolver(authRepository))
.build().makeExecutableSchema();
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructor
public class PostResolver implements
GraphQLResolver<Post> {
private final AuthorRepository authRepository;
public Author createdBy(Post post) {
return
authRepository
.findOne(post.getAuthorId());
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructor
public class PostResolver implements
GraphQLResolver<Post> {
private final AuthorRepository authRepository;
public Author createdBy(Post post) {
return
authRepository
.findOne(post.getAuthorId());
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructor
public class PostResolver implements
GraphQLResolver<Post> {
private final AuthorRepository authRepository;
public Author createdBy(Post post) {
return
authRepository
.findOne(post.getAuthorId());
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructor
public class PostResolver implements
GraphQLResolver<Post> {
private final AuthorRepository authRepository;
public Author createdBy(Post post) {
return
authRepository
.findOne(post.getAuthorId());
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructor
public class PostResolver implements
GraphQLResolver<Post> {
private final AuthorRepository authRepository;
public Author createdBy(Post post) {
return
authRepository
.findOne(post.getAuthorId());
}
}
#GraphQlVsRest
@VladimirD_42
@RequiredArgsConstructor
public class PostResolver implements
GraphQLResolver<Post> {
private final AuthorRepository authRepository;
public Author createdBy(Post post) {
return
authRepository
.findOne(post.getAuthorId());
}
}
#GraphQlVsRest
@VladimirD_42
Request
{
query {
allPosts {
title
createdBy {
name
}
}
}
}
#GraphQlVsRest
@VladimirD_42
Request
{
query {
allPosts {
title
createdBy {
name
}
}
}
}
#GraphQlVsRest
@VladimirD_42
Response
{
"data": {
"allPosts": [
{
"title": "Who is Ed Wong",
"createdBy": {
"name": "Ed Wong”
}
},
. . .
]
}
#GraphQlVsRest
@VladimirD_42
type Author {
id: ID!
name: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
body: String
createdBy: Author!
comments: [Comment]
}
#GraphQlVsRest
@VladimirD_42
type Author {
id: ID!
name: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
body: String
createdBy: Author!
comments: [Comment]
}
#GraphQlVsRest
@VladimirD_42
type Author {
id: ID!
name: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
body: String
createdBy: Author!
comments: [Comment]
}
#GraphQlVsRest
@VladimirD_42
type Author {
id: ID!
name: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
body: String
createdBy: Author!
comments: [Comment]
}
#GraphQlVsRest
@VladimirD_42
type Author {
id: ID!
name: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
body: String
createdBy: Author!
comments: [Comment]
}
#GraphQlVsRest
@VladimirD_42
type Author {
id: ID!
name: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
body: String
createdBy: Author!
comments: [Comment]
}
#GraphQlVsRest
@VladimirD_42
type Comment {
id: ID!
createdBy: Author!
belongsTo: Post!
text: String
}
#GraphQlVsRest
@VladimirD_42
type Comment {
id: ID!
createdBy: Author!
belongsTo: Post!
text: String
}
#GraphQlVsRest
@VladimirD_42
type Comment {
id: ID!
createdBy: Author!
belongsTo: Post!
text: String
}
#GraphQlVsRest
@VladimirD_42
type Comment {
id: ID!
createdBy: Author!
belongsTo: Post!
text: String
}
#GraphQlVsRest
@VladimirD_42
type Comment {
id: ID!
createdBy: Author!
belongsTo: Post!
text: String
}
#GraphQlVsRest
@VladimirD_42
Request
query {
allPosts {
title
comments {
text
createdBy {
name
posts {
title
comments {
text
. . . .
#GraphQlVsRest
@VladimirD_42
Request
query {
allPosts {
title
comments {
text
createdBy {
name
posts {
title
comments {
text
. . . .
#GraphQlVsRest
@VladimirD_42
Protect from Abuse
#GraphQlVsRest
@VladimirD_42
Protect from Abuse
Time out
#GraphQlVsRest
@VladimirD_42
Protect from Abuse
Time out
Max Query Depth
#GraphQlVsRest
@VladimirD_42
Protect from Abuse
Time out
Max Query Depth
Max Query Complexity
#GraphQlVsRest
@VladimirD_42
Protect from Abuse
Time out
Max Query Depth
Max Query Complexity
Throttling
#GraphQlVsRest
@VladimirD_42
Mutation
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
$ cat src/main/resources/schema.graphqls
. . . .
schema {
query: Query
mutation: Mutation
}
type Mutation {
addAuthor(name: String!) : Author
removeAuthour(id: ID!): Author
}
. . . .
#GraphQlVsRest
@VladimirD_42
private static GraphQLSchema
buildSchema(PostRepository pr,
AuthorRepository ar,
CommentRepository cr) {
return SchemaParser
.newParser().file("schema.graphqls")
.resolvers(
new Query(pr,ar),
new Mutation(ar),
new PostResolver(ar,cr),
new AuthorResolver(pr),
new CommentResolver(ar,pr))
.build().makeExecutableSchema();
}
#GraphQlVsRest
@VladimirD_42
private static GraphQLSchema
buildSchema(PostRepository pr,
AuthorRepository ar,
CommentRepository cr) {
return SchemaParser
.newParser().file("schema.graphqls")
.resolvers(
new Query(pr,ar),
new Mutation(ar),
new PostResolver(ar,cr),
new AuthorResolver(pr),
new CommentResolver(ar,pr))
.build().makeExecutableSchema();
}
#GraphQlVsRest
@VladimirD_42
private static GraphQLSchema
buildSchema(PostRepository pr,
AuthorRepository ar,
CommentRepository cr) {
return SchemaParser
.newParser().file("schema.graphqls")
.resolvers(
new Query(pr,ar),
new Mutation(ar),
new PostResolver(ar,cr),
new AuthorResolver(pr),
new CommentResolver(ar,pr))
.build().makeExecutableSchema();
}
#GraphQlVsRest
@VladimirD_42
private static GraphQLSchema
buildSchema(PostRepository pr,
AuthorRepository ar,
CommentRepository cr) {
return SchemaParser
.newParser().file("schema.graphqls")
.resolvers(
new Query(pr,ar),
new Mutation(ar),
new PostResolver(ar,cr),
new AuthorResolver(pr),
new CommentResolver(ar,pr))
.build().makeExecutableSchema();
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
public class Mutation
implements GraphQLRootResolver {
private final AuthorRepository authRepo;
public Author addAuthor(String name) {
return authRepo.save(new Author(null, name));
}
public Author removeAuthour(String id) {
Author auth = authRepo.findOne(id);
authRepo.delete(id); return auth;
}
}
#GraphQlVsRest
@VladimirD_42
Request
mutation {
addAuthor (name: " Gon Freecss") {
name
}
}
#GraphQlVsRest
@VladimirD_42
Response
{
"data": {
"addAuthor": {
"name": " Gon Freecss”
}
}
}
#GraphQlVsRest
@VladimirD_42
Subscription
#GraphQlVsRest
@VladimirD_42
Subscription
Realtime Updates
#GraphQlVsRest
@VladimirD_42
Subscription
Realtime Updates
Not supported by all implementations
#GraphQlVsRest
@VladimirD_42
Caching
#GraphQlVsRest
@VladimirD_42
Caching
Different approach
Is needed
#GraphQlVsRest
@VladimirD_42
Paramaters
#GraphQlVsRest
@VladimirD_42
Paramaters
Like in Mutation
#GraphQlVsRest
@VladimirD_42
Headers/Cookies
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
class MyCustomContext extends GraphQLContext
. . . .
@Override
protected GraphQLContext
createContext(Optional<HttpServletRequest> r,
Optional<HttpServletResponse> response) {
. . . .
return MyCustomContext
}
. . . .
public ? <method>(<args>,
DataFetchingEnvironment env) {
MyCustomContext con = env.getContext();
. . . .
#GraphQlVsRest
@VladimirD_42
Authentication
#GraphQlVsRest
@VladimirD_42
Authentication
Over custom Context
Conclusion
#GraphQlVsRest
#GraphQlVsRest
@VladimirD_42
GraphQL
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
Uniform Interface
#GraphQlVsRest
@VladimirD_42
GraphQL
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
Uniform Interface
#GraphQlVsRest
@VladimirD_42
GraphQL
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
Uniform Interface
#GraphQlVsRest
@VladimirD_42
GraphQL
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
Uniform Interface
#GraphQlVsRest
@VladimirD_42
GraphQL
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
Uniform Interface
#GraphQlVsRest
@VladimirD_42
GraphQL
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
Uniform Interface
#GraphQlVsRest
@VladimirD_42
GraphQL
Client-Server architecture
Statelessness
Cacheability
Layered system
Code on Demand (Optional)
Uniform Interface
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
$ curl -H "Content-Type: application/json" -X POST
-d '{"query":"query {allPosts { title }}",
"variables":null}' http://localhost:8080/graphql |
json_pp
{
"data" : {
"allPosts" : [
{
"title" : "Who is Ed Wong”
}, {
"title" : "Who is Son Goku”
},
. . . .
#GraphQlVsRest
@VladimirD_42
SOA and WSDL?
#GraphQlVsRest
@VladimirD_42
https://neurocapability.files.wordpress.com/2012/08/businessman-asleep-meeting-istock.jpg
#GraphQlVsRest
@VladimirD_42
#GraphQlVsRest
@VladimirD_42
HAL
#GraphQlVsRest
@VladimirD_42
HAL
Adopting HAL will make your API
explorable, and its documentation
easily discoverable from within the
API itself.
#GraphQlVsRest
@VladimirD_42
Code Examples
https://github.com/vladimir-dejanovic/simple-sp
ringboot-rest-mongo-conftalk-demo
https://github.com/vladimir-dejanovic/simple-sp
ringboot-graphql-mongo-conftalk-demo
Thank You
#GraphQlVsRest
#GraphQlVsRest
@VladimirD_42
Questions
@VladimirD_42
ed.wong.iv@gmail.com

More Related Content

What's hot

Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Ramamohan Chokkam
 
Need for Async: Hot pursuit for scalable applications
Need for Async: Hot pursuit for scalable applicationsNeed for Async: Hot pursuit for scalable applications
Need for Async: Hot pursuit for scalable applicationsKonrad Malawski
 
Relaxing With CouchDB
Relaxing With CouchDBRelaxing With CouchDB
Relaxing With CouchDBleinweber
 
Advanced Object-Oriented JavaScript
Advanced Object-Oriented JavaScriptAdvanced Object-Oriented JavaScript
Advanced Object-Oriented JavaScriptecker
 
Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptBeginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptStoyan Stefanov
 
JavaScript - From Birth To Closure
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To ClosureRobert Nyman
 
The things we don't see – stories of Software, Scala and Akka
The things we don't see – stories of Software, Scala and AkkaThe things we don't see – stories of Software, Scala and Akka
The things we don't see – stories of Software, Scala and AkkaKonrad Malawski
 
NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)
NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)
NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)Chris Richardson
 
Understanding Object Oriented Javascript - Coffee@DBG June
Understanding Object Oriented Javascript - Coffee@DBG JuneUnderstanding Object Oriented Javascript - Coffee@DBG June
Understanding Object Oriented Javascript - Coffee@DBG JuneDeepu S Nath
 
Static Analysis in IDEA
Static Analysis in IDEAStatic Analysis in IDEA
Static Analysis in IDEAHamletDRC
 
Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...Chris Richardson
 

What's hot (12)

Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268Automatically generating-json-from-java-objects-java-objects268
Automatically generating-json-from-java-objects-java-objects268
 
Json the-x-in-ajax1588
Json the-x-in-ajax1588Json the-x-in-ajax1588
Json the-x-in-ajax1588
 
Need for Async: Hot pursuit for scalable applications
Need for Async: Hot pursuit for scalable applicationsNeed for Async: Hot pursuit for scalable applications
Need for Async: Hot pursuit for scalable applications
 
Relaxing With CouchDB
Relaxing With CouchDBRelaxing With CouchDB
Relaxing With CouchDB
 
Advanced Object-Oriented JavaScript
Advanced Object-Oriented JavaScriptAdvanced Object-Oriented JavaScript
Advanced Object-Oriented JavaScript
 
Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptBeginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScript
 
JavaScript - From Birth To Closure
JavaScript - From Birth To ClosureJavaScript - From Birth To Closure
JavaScript - From Birth To Closure
 
The things we don't see – stories of Software, Scala and Akka
The things we don't see – stories of Software, Scala and AkkaThe things we don't see – stories of Software, Scala and Akka
The things we don't see – stories of Software, Scala and Akka
 
NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)
NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)
NodeJS: the good parts? A skeptic’s view (oredev, oredev2013)
 
Understanding Object Oriented Javascript - Coffee@DBG June
Understanding Object Oriented Javascript - Coffee@DBG JuneUnderstanding Object Oriented Javascript - Coffee@DBG June
Understanding Object Oriented Javascript - Coffee@DBG June
 
Static Analysis in IDEA
Static Analysis in IDEAStatic Analysis in IDEA
Static Analysis in IDEA
 
Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...Futures and Rx Observables: powerful abstractions for consuming web services ...
Futures and Rx Observables: powerful abstractions for consuming web services ...
 

Similar to GraphQL vs Traditional Rest API

GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
Overview of GraphQL & Clients
Overview of GraphQL & ClientsOverview of GraphQL & Clients
Overview of GraphQL & ClientsPokai Chang
 
Wroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaWroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
Java Day Istanbul 2018 GraphQL vs Traditional REST API
Java Day Istanbul 2018 GraphQL vs Traditional REST APIJava Day Istanbul 2018 GraphQL vs Traditional REST API
Java Day Istanbul 2018 GraphQL vs Traditional REST APIVladimir Dejanovic
 
Managing GraphQL servers with AWS Fargate & Prisma Cloud
Managing GraphQL servers  with AWS Fargate & Prisma CloudManaging GraphQL servers  with AWS Fargate & Prisma Cloud
Managing GraphQL servers with AWS Fargate & Prisma CloudNikolas Burk
 
GraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoGraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoMarcinStachniuk
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code genkoji lin
 
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademyGraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademyMarcinStachniuk
 
Vavr Java User Group Rheinland
Vavr Java User Group RheinlandVavr Java User Group Rheinland
Vavr Java User Group RheinlandDavid Schmitz
 
development, ruby, conferences, frameworks, ruby on rails, confreaks, actsasc...
development, ruby, conferences, frameworks, ruby on rails, confreaks, actsasc...development, ruby, conferences, frameworks, ruby on rails, confreaks, actsasc...
development, ruby, conferences, frameworks, ruby on rails, confreaks, actsasc...ActsAsCon
 
GraphQL & Prisma from Scratch
GraphQL & Prisma from ScratchGraphQL & Prisma from Scratch
GraphQL & Prisma from ScratchNikolas Burk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
Copy/paste detector for source code on javascript
Copy/paste detector for source code on javascript Copy/paste detector for source code on javascript
Copy/paste detector for source code on javascript Andrey Kucherenko
 
Spark schema for free with David Szakallas
Spark schema for free with David SzakallasSpark schema for free with David Szakallas
Spark schema for free with David SzakallasDatabricks
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
Next-generation API Development with GraphQL and Prisma
Next-generation API Development with GraphQL and PrismaNext-generation API Development with GraphQL and Prisma
Next-generation API Development with GraphQL and PrismaNikolas Burk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 

Similar to GraphQL vs Traditional Rest API (20)

GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
Overview of GraphQL & Clients
Overview of GraphQL & ClientsOverview of GraphQL & Clients
Overview of GraphQL & Clients
 
Wroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaWroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in Java
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
Java Day Istanbul 2018 GraphQL vs Traditional REST API
Java Day Istanbul 2018 GraphQL vs Traditional REST APIJava Day Istanbul 2018 GraphQL vs Traditional REST API
Java Day Istanbul 2018 GraphQL vs Traditional REST API
 
Managing GraphQL servers with AWS Fargate & Prisma Cloud
Managing GraphQL servers  with AWS Fargate & Prisma CloudManaging GraphQL servers  with AWS Fargate & Prisma Cloud
Managing GraphQL servers with AWS Fargate & Prisma Cloud
 
GraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoGraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za mało
 
Annotation processing and code gen
Annotation processing and code genAnnotation processing and code gen
Annotation processing and code gen
 
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademyGraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
GraphQL - Piękne API w Twojej Aplikacji - KrakowGraphAcademy
 
Vavr Java User Group Rheinland
Vavr Java User Group RheinlandVavr Java User Group Rheinland
Vavr Java User Group Rheinland
 
development, ruby, conferences, frameworks, ruby on rails, confreaks, actsasc...
development, ruby, conferences, frameworks, ruby on rails, confreaks, actsasc...development, ruby, conferences, frameworks, ruby on rails, confreaks, actsasc...
development, ruby, conferences, frameworks, ruby on rails, confreaks, actsasc...
 
GraphQL & Prisma from Scratch
GraphQL & Prisma from ScratchGraphQL & Prisma from Scratch
GraphQL & Prisma from Scratch
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
Copy/paste detector for source code on javascript
Copy/paste detector for source code on javascript Copy/paste detector for source code on javascript
Copy/paste detector for source code on javascript
 
Spark schema for free with David Szakallas
Spark schema for free with David SzakallasSpark schema for free with David Szakallas
Spark schema for free with David Szakallas
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
Next-generation API Development with GraphQL and Prisma
Next-generation API Development with GraphQL and PrismaNext-generation API Development with GraphQL and Prisma
Next-generation API Development with GraphQL and Prisma
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 

More from Vladimir Dejanovic

What limitations & problems of REST API can be solved with GraphQL [jPrime 2019]
What limitations & problems of REST API can be solved with GraphQL [jPrime 2019]What limitations & problems of REST API can be solved with GraphQL [jPrime 2019]
What limitations & problems of REST API can be solved with GraphQL [jPrime 2019]Vladimir Dejanovic
 
Micronaut, Dragon-Slayer (Spring/boot) or just another framework [GeeCON Krak...
Micronaut, Dragon-Slayer (Spring/boot) or just another framework [GeeCON Krak...Micronaut, Dragon-Slayer (Spring/boot) or just another framework [GeeCON Krak...
Micronaut, Dragon-Slayer (Spring/boot) or just another framework [GeeCON Krak...Vladimir Dejanovic
 
GraphQL in Java World [Workshop RivieraDev 2019]
GraphQL in Java World [Workshop RivieraDev 2019]GraphQL in Java World [Workshop RivieraDev 2019]
GraphQL in Java World [Workshop RivieraDev 2019]Vladimir Dejanovic
 
GraphQL vs Traditional Rest API [GeeCon Prague 2018]
GraphQL vs Traditional Rest API [GeeCon Prague 2018]GraphQL vs Traditional Rest API [GeeCon Prague 2018]
GraphQL vs Traditional Rest API [GeeCon Prague 2018]Vladimir Dejanovic
 
What Users Want, A/B testing explained [CodeteCon 2018]
What Users Want, A/B testing explained [CodeteCon 2018]What Users Want, A/B testing explained [CodeteCon 2018]
What Users Want, A/B testing explained [CodeteCon 2018]Vladimir Dejanovic
 
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]Vladimir Dejanovic
 
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...Vladimir Dejanovic
 
GeeCON 2018 GraphQL vs Traditional REST API
GeeCON 2018 GraphQL vs Traditional REST APIGeeCON 2018 GraphQL vs Traditional REST API
GeeCON 2018 GraphQL vs Traditional REST APIVladimir Dejanovic
 
Devoxx France 2018 GraphQL vs Traditional REST API
Devoxx France 2018 GraphQL vs Traditional REST APIDevoxx France 2018 GraphQL vs Traditional REST API
Devoxx France 2018 GraphQL vs Traditional REST APIVladimir Dejanovic
 
Java land What Users Want, A/B testing explained
Java land What Users Want, A/B testing explainedJava land What Users Want, A/B testing explained
Java land What Users Want, A/B testing explainedVladimir Dejanovic
 
Java One Secret of developing high performance website, with no budget
Java One Secret of developing high performance website, with no budgetJava One Secret of developing high performance website, with no budget
Java One Secret of developing high performance website, with no budgetVladimir Dejanovic
 
Voxxed Days Belgrade - Changing wheels on moving car, from monolith to micros...
Voxxed Days Belgrade - Changing wheels on moving car, from monolith to micros...Voxxed Days Belgrade - Changing wheels on moving car, from monolith to micros...
Voxxed Days Belgrade - Changing wheels on moving car, from monolith to micros...Vladimir Dejanovic
 
Secret of developing high performance website, with no budget in small amount...
Secret of developing high performance website, with no budget in small amount...Secret of developing high performance website, with no budget in small amount...
Secret of developing high performance website, with no budget in small amount...Vladimir Dejanovic
 
Changing wheels on moving car, from monolith to microservices by using api's V2
Changing wheels on moving car, from monolith to microservices by using api's V2Changing wheels on moving car, from monolith to microservices by using api's V2
Changing wheels on moving car, from monolith to microservices by using api's V2Vladimir Dejanovic
 
Changing wheels on moving car, from monolith to microservices by using api's
Changing wheels on moving car, from monolith to microservices by using api'sChanging wheels on moving car, from monolith to microservices by using api's
Changing wheels on moving car, from monolith to microservices by using api'sVladimir Dejanovic
 
Pain of growing up, and moving to large scale
Pain of growing up, and moving to large scalePain of growing up, and moving to large scale
Pain of growing up, and moving to large scaleVladimir Dejanovic
 
Protocol buffers and Microservices
Protocol buffers and MicroservicesProtocol buffers and Microservices
Protocol buffers and MicroservicesVladimir Dejanovic
 

More from Vladimir Dejanovic (20)

What limitations & problems of REST API can be solved with GraphQL [jPrime 2019]
What limitations & problems of REST API can be solved with GraphQL [jPrime 2019]What limitations & problems of REST API can be solved with GraphQL [jPrime 2019]
What limitations & problems of REST API can be solved with GraphQL [jPrime 2019]
 
Micronaut, Dragon-Slayer (Spring/boot) or just another framework [GeeCON Krak...
Micronaut, Dragon-Slayer (Spring/boot) or just another framework [GeeCON Krak...Micronaut, Dragon-Slayer (Spring/boot) or just another framework [GeeCON Krak...
Micronaut, Dragon-Slayer (Spring/boot) or just another framework [GeeCON Krak...
 
GraphQL in Java World [Workshop RivieraDev 2019]
GraphQL in Java World [Workshop RivieraDev 2019]GraphQL in Java World [Workshop RivieraDev 2019]
GraphQL in Java World [Workshop RivieraDev 2019]
 
GraphQL vs Traditional Rest API [GeeCon Prague 2018]
GraphQL vs Traditional Rest API [GeeCon Prague 2018]GraphQL vs Traditional Rest API [GeeCon Prague 2018]
GraphQL vs Traditional Rest API [GeeCon Prague 2018]
 
What Users Want, A/B testing explained [CodeteCon 2018]
What Users Want, A/B testing explained [CodeteCon 2018]What Users Want, A/B testing explained [CodeteCon 2018]
What Users Want, A/B testing explained [CodeteCon 2018]
 
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
REST API vs gRPC, which one should you use in breaking a monolith [Kdg.net 2018]
 
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
 
GeeCON 2018 GraphQL vs Traditional REST API
GeeCON 2018 GraphQL vs Traditional REST APIGeeCON 2018 GraphQL vs Traditional REST API
GeeCON 2018 GraphQL vs Traditional REST API
 
Devoxx France 2018 GraphQL vs Traditional REST API
Devoxx France 2018 GraphQL vs Traditional REST APIDevoxx France 2018 GraphQL vs Traditional REST API
Devoxx France 2018 GraphQL vs Traditional REST API
 
Java land What Users Want, A/B testing explained
Java land What Users Want, A/B testing explainedJava land What Users Want, A/B testing explained
Java land What Users Want, A/B testing explained
 
JavaLand gRPC vs REST API
JavaLand gRPC vs REST APIJavaLand gRPC vs REST API
JavaLand gRPC vs REST API
 
Java One Secret of developing high performance website, with no budget
Java One Secret of developing high performance website, with no budgetJava One Secret of developing high performance website, with no budget
Java One Secret of developing high performance website, with no budget
 
Voxxed Days Belgrade - Changing wheels on moving car, from monolith to micros...
Voxxed Days Belgrade - Changing wheels on moving car, from monolith to micros...Voxxed Days Belgrade - Changing wheels on moving car, from monolith to micros...
Voxxed Days Belgrade - Changing wheels on moving car, from monolith to micros...
 
What users want [DevoxxPL]
What users want [DevoxxPL]What users want [DevoxxPL]
What users want [DevoxxPL]
 
Secret of developing high performance website, with no budget in small amount...
Secret of developing high performance website, with no budget in small amount...Secret of developing high performance website, with no budget in small amount...
Secret of developing high performance website, with no budget in small amount...
 
Changing wheels on moving car, from monolith to microservices by using api's V2
Changing wheels on moving car, from monolith to microservices by using api's V2Changing wheels on moving car, from monolith to microservices by using api's V2
Changing wheels on moving car, from monolith to microservices by using api's V2
 
Changing wheels on moving car, from monolith to microservices by using api's
Changing wheels on moving car, from monolith to microservices by using api'sChanging wheels on moving car, from monolith to microservices by using api's
Changing wheels on moving car, from monolith to microservices by using api's
 
Pain of growing up, and moving to large scale
Pain of growing up, and moving to large scalePain of growing up, and moving to large scale
Pain of growing up, and moving to large scale
 
Protocol buffers and Microservices
Protocol buffers and MicroservicesProtocol buffers and Microservices
Protocol buffers and Microservices
 
What users want
What users wantWhat users want
What users want
 

Recently uploaded

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 

Recently uploaded (20)

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 

GraphQL vs Traditional Rest API