SlideShare ist ein Scribd-Unternehmen logo
1 von 199
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

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
 

Was ist angesagt? (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 ...
 

Ähnlich wie 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
 

Ähnlich wie 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
 

Mehr von 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
 

Mehr von 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
 

Kürzlich hochgeladen

08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 

Kürzlich hochgeladen (20)

08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
Neo4j - How KGs are shaping the future of Generative AI at AWS Summit London ...
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 

GraphQL vs Traditional Rest API