Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraphQL with Spring Boot

GraphQL with Spring Boot

Slides from the presentation at CareerCon Kariera IT in Cracow

Krzysztof Pawlowski

December 02, 2017
Tweet

More Decks by Krzysztof Pawlowski

Other Decks in Technology

Transcript

  1. About me • Senior Java Developer @ Merapar Technologies •

    Coder, Lecturer (PJATK), Java Trainer (infoShare Academy) • 7+ years of experience in Java Development • using GraphQL for a year now • E-mail: [email protected] • Twitter: krzychpawlowski
  2. REST not so restful? GET /author/:id <<class>>
 Author Long id

    String name String email String bio List<BlogEntry>
 blogEntries <<class>>
 BlogEntry Long id String title List<Comment> comments <<class>>
 Comment Long id String author String comment
  3. REST not so restful? GET /author/:id <<class>>
 Author Long id

    String name String email String bio List<BlogEntry>
 blogEntries <<class>>
 BlogEntry Long id String title List<Comment> comments <<class>>
 Comment Long id String author String comment {
 id: 1,
 name: “Krzysztof”,
 email:”[email protected]“,
 bio: “java dev”, blogEntriesIds: [1, 2]
 }
  4. REST not so restful? GET /author/:id GET /author/:id/blogEntry/:id <<class>>
 Author

    Long id String name String email String bio List<BlogEntry>
 blogEntries <<class>>
 BlogEntry Long id String title List<Comment> comments <<class>>
 Comment Long id String author String comment
  5. REST not so restful? GET /author/:id GET /author/:id/blogEntry/:id <<class>>
 Author

    Long id String name String email String bio List<BlogEntry>
 blogEntries <<class>>
 BlogEntry Long id String title List<Comment> comments <<class>>
 Comment Long id String author String comment {
 id: 1, title: “GraphQL”,
 authorId: 1, commentsIds: [1, 2]
 }
  6. REST not so restful? GET /author/:id/blogEntry/:id/comments GET /author/:id GET /author/:id/blogEntry/:id

    <<class>>
 Author Long id String name String email String bio List<BlogEntry>
 blogEntries <<class>>
 BlogEntry Long id String title List<Comment> comments <<class>>
 Comment Long id String author String comment
  7. REST not so restful? GET /author/:id/blogEntry/:id/comments GET /author/:id GET /author/:id/blogEntry/:id

    <<class>>
 Author Long id String name String email String bio List<BlogEntry>
 blogEntries <<class>>
 BlogEntry Long id String title List<Comment> comments <<class>>
 Comment Long id String author String comment {
 id: 1,
 author: “anonymous”,
 comment: “super!”
 }
  8. While in GraphQL… authors(filter : {id : 1 }) {


    name
 blogEntries {
 title
 comments {
 comment
 }
 }
 } <<class>>
 Author Long id String name String email String bio List<BlogEntry>
 blogEntries <<class>>
 BlogEntry Long id String title List<Comment> comments <<class>>
 Comment Long id String author String comment
  9. What is GraphQL? “GraphQL is a query language for APIs

    and a runtime for fulfilling those queries with your existing data.” — http://graphql.org
  10. What is GraphQL? “GraphQL is a query language for APIs

    and a runtime for fulfilling those queries with your existing data.” — http://graphql.org Declarative
 Ask for what you need, get exactly that
  11. What is GraphQL? “GraphQL is a query language for APIs

    and a runtime for fulfilling those queries with your existing data.” — http://graphql.org Declarative
 Ask for what you need, get exactly that Compositional
 Get many resources in a single request
  12. What is GraphQL? “GraphQL is a query language for APIs

    and a runtime for fulfilling those queries with your existing data.” — http://graphql.org Declarative
 Ask for what you need, get exactly that Compositional
 Get many resources in a single request Strongly Typed
 Describe what’s possible with a type system
  13. GraphQL query authors { # queries can have comments! name

    email blogEntries { title } } { "data": { "authors": [ { "name": "author 1", "email": "Python dev", "blogEntries": [ { "title": "blog entry 1" }, { "title": "blog entry 3" } ] }, { "name": "author 2", "email": "Java dev", "blogEntries": [ { "title": "blog entry 2" }, { "title": "blog entry 4" } ] } ] }
  14. GraphQL query - filter authors(filter : {id : 1 })

    { name email blogEntries { title } }
  15. GraphQL query - filter authors(filter : {id : 1 })

    { name email blogEntries { title } } { "data": { "authors": [ { "name": "author 1", "email": "Python dev", "blogEntries": [ { "title": "blog entry 1" }, { "title": "blog entry 3" } ] } ] } }
  16. GraphQL mutation mutation addAuthorMutation($authorInfo: addAuthorInput!) { addAuthor(input : $authorInfo) {

    id name bio email } } { "authorInfo": { "id": 1, “name" : "Krzysztof Pawlowski", "bio" : "java dev", "email" : "[email protected]" }
  17. GraphQL mutation mutation addAuthorMutation($authorInfo: addAuthorInput!) { addAuthor(input : $authorInfo) {

    id name bio email } } { "authorInfo": { "id": 1, “name" : "Krzysztof Pawlowski", "bio" : "java dev", "email" : "[email protected]" } { "data": { "addAuthor": { "id": 1, "name": "Krzysztof Pawlowski", "bio": "java dev", "email": 
 “[email protected]" } } }
  18. GraphQL schema type Author {
 id: Long! name: String bio:

    String email: String
 blogEntries: [BlogEntry] }
 
 type BlogEntry { id: Long! title: String! comments: [Comment] } type Comment { id: Long! author: String comment: String }

  19. GraphQL schema type Author {
 id: Long! name: String bio:

    String email: String
 blogEntries: [BlogEntry] }
 
 type BlogEntry { id: Long! title: String! comments: [Comment] } type Comment { id: Long! author: String comment: String }
 type Query { authors(id: Long!): Author blogEntries(id: Long!): BlogEntry comments(id: Long!): Comment } type Mutation { addAuthor(author: Author!): Author updateAuthor(author: Author!): Author deleteAuthor(author: Author!): Author … }
  20. GraphQL schema type Author {
 id: Long! name: String bio:

    String email: String
 blogEntries: [BlogEntry] }
 
 type BlogEntry { id: Long! title: String! comments: [Comment] } type Comment { id: Long! author: String comment: String }
 type Query { authors(id: Long!): Author blogEntries(id: Long!): BlogEntry comments(id: Long!): Comment } type Mutation { addAuthor(author: Author!): Author updateAuthor(author: Author!): Author deleteAuthor(author: Author!): Author … } schema { query: Query mutation: Mutation }
  21. Other benefits of GraphQL ‣flexibility ‣one end-point ‣self-documenting (strong typing

    and schema) ‣query validation ‣easy to implement consumer-driven contracts
  22. Spring Boot Starter for GraphQL ‣adding Maven dependency creates GraphQL

    controller under
 /v1/graphql <dependency> <groupId>com.merapar</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>1.0.2</version> </dependency> ‣adding new queries and mutation is a matter of implementing GraphQlFields interface