<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Alexis Reina</title>
    <description>The latest articles on Forem by Alexis Reina (@alexisreina).</description>
    <link>https://forem.com/alexisreina</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F907998%2Fea5f4acd-edd1-4404-87ba-b9089fa6d0fa.jpeg</url>
      <title>Forem: Alexis Reina</title>
      <link>https://forem.com/alexisreina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/alexisreina"/>
    <language>en</language>
    <item>
      <title>Introduction to the GraphQL Schema</title>
      <dc:creator>Alexis Reina</dc:creator>
      <pubDate>Tue, 20 Dec 2022 09:07:46 +0000</pubDate>
      <link>https://forem.com/one-beyond/introduction-to-the-graphql-schema-jn5</link>
      <guid>https://forem.com/one-beyond/introduction-to-the-graphql-schema-jn5</guid>
      <description>&lt;p&gt;Hi there! In this post we’ll cover some basics concepts to start describing your app data using the GraphQL Schema. But before we dive any further into detail, let’s find out more about GraphQL's origin, motivation and the problems it's conceived to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  GraphQL Origins
&lt;/h2&gt;

&lt;p&gt;Before diving into the GraphQL Schema, let's review briefly how GraphQL was originated and what's about. If you want to skip this section, you can go directly to the schema section&lt;/p&gt;

&lt;h3&gt;
  
  
  A Bit Of History
&lt;/h3&gt;

&lt;p&gt;GraphQL was created at Facebook (Meta) back in 2012, when they were rebuilding their mobile application. When they transitioned to a native app, they needed to build an API for their news feed from scratch.&lt;/p&gt;

&lt;p&gt;After considering many alternatives -including REST- &lt;a href="https://engineering.fb.com/2015/09/14/core-data/graphql-a-data-query-language/" rel="noopener noreferrer"&gt;they decided to start a new project&lt;/a&gt;, that later would become GraphQL.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We were frustrated with the differences between the data we wanted to use in our apps and the server queries they required. We don’t think of data in terms of resource URLs, secondary keys, or join tables; we think about it in terms of a graph of objects and the models we ultimately use in our apps like NSObjects or JSON&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GraphQL was designed to reduce the code needed to prepare and process the data needed both in the frontend and the backend, to bring data-fetching closer to the perspective of product owners and developers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;GraphQL was our opportunity to rethink mobile app data-fetching from the perspective of product designers and developers. It moved the focus of development to the client apps, where designers and developers spend their time and attention. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three years later the project was open-sourced. Now maintained by a large community of companies and individuals from all over the world.&lt;/p&gt;

&lt;p&gt;Today, GraphQL is used in production by &lt;a href="https://landscape.graphql.org/borderless-mode?grouping=category" rel="noopener noreferrer"&gt;lots of different companies&lt;/a&gt; such as Airbnb, GitHub, Shopify or Coursera - to name a few.&lt;/p&gt;

&lt;h3&gt;
  
  
  So, What Exactly is GraphQL?
&lt;/h3&gt;

&lt;p&gt;GraphQL is both a query language and a server-side runtime to fulfill those queries using a type system (schema) you define for your data.&lt;/p&gt;

&lt;p&gt;It's an alternative to REST designed to make APIs fast and flexible, providing a complete description of the data, allowing the clients to request exactly what they need.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4at12u19udvs1akihfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy4at12u19udvs1akihfg.png" alt="Github GraphQL Explorer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At its core, a GraphQL query is just a string that is sent to a server to be interpreted and fulfilled, which then returns JSON back to the client.&lt;/p&gt;

&lt;p&gt;The GraphQL server exposes a single endpoint and responds with just the data the client asked for.&lt;/p&gt;

&lt;p&gt;As we can see the shape of the query closely resembles the response, but how can we know what data and fields can we query for?&lt;/p&gt;

&lt;h2 id="sdl"&gt;GraphQL Schema Definition Language (SDL)&lt;/h2&gt;

&lt;p&gt;GraphQL is agnostic to the data sources or programming language, in fact &lt;a href="https://graphql.org/code/" rel="noopener noreferrer"&gt;there are many implementations&lt;/a&gt; in different languages.&lt;/p&gt;

&lt;p&gt;Instead GraphQL has its own type system that’s used to define the &lt;strong&gt;schema&lt;/strong&gt; of an API. The syntax for writing schemas is called &lt;a href="https://www.digitalocean.com/community/tutorials/graphql-graphql-sdl" rel="noopener noreferrer"&gt;Schema Definition Language&lt;/a&gt; (SDL).&lt;/p&gt;

&lt;p&gt;The schema is used to &lt;strong&gt;define a collection of types and the relationships between them&lt;/strong&gt;, but it’s not responsible for defining how the data it's stored or where it comes from.&lt;/p&gt;

&lt;h3&gt;
  
  
  Queries, Mutations and Subscriptions
&lt;/h3&gt;

&lt;p&gt;In GraphQL there're 3 &lt;em&gt;special&lt;/em&gt; object types already predefined for us, that will act as the entry point to our schema and app.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Query&lt;/code&gt; are used for fetching data from our server.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Mutation&lt;/code&gt; used for requesting data modifications.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Subscription&lt;/code&gt; used for notifying your client in real time about changes to back-end data.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;albums&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Album&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see in the example, our &lt;code&gt;albums&lt;/code&gt; query will return a list of &lt;code&gt;Album&lt;/code&gt;. But what is an &lt;code&gt;Album&lt;/code&gt;?&lt;/p&gt;

&lt;h3&gt;
  
  
  Object Types
&lt;/h3&gt;

&lt;p&gt;Objects and fields are the nuts-and-bolts of any GraphQL Schema. Following with our previous example, lets now define our &lt;code&gt;Album&lt;/code&gt; object.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Album&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;photos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Photo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s stop for a second and review what we have here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Album&lt;/code&gt; is an &lt;strong&gt;Object Type&lt;/strong&gt; which contain &lt;em&gt;fields&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;title&lt;/code&gt; is a field of our &lt;code&gt;Album&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Its value &lt;code&gt;String&lt;/code&gt;, is a built-in &lt;strong&gt;Scalar Type&lt;/strong&gt; and represent the type &lt;code&gt;title&lt;/code&gt; will resolve to.&lt;/li&gt;
&lt;li&gt;Note that we also have 2 other fields, &lt;code&gt;author&lt;/code&gt; and &lt;code&gt;photo&lt;/code&gt; that point to 2 other object types.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Author&lt;/code&gt; is another object type which we will define in a moment.&lt;/li&gt;
&lt;li&gt;And &lt;code&gt;[Photo]&lt;/code&gt; a &lt;strong&gt;List Type&lt;/strong&gt; and represent an array of objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding an &lt;strong&gt;exclamation mark&lt;/strong&gt; at the end of field types like &lt;code&gt;String!&lt;/code&gt; or &lt;code&gt;Author!&lt;/code&gt; means that the field is &lt;strong&gt;non-nullable&lt;/strong&gt; and that you can always expect to receive a value when the field is queried.&lt;/p&gt;

&lt;p&gt;It's possible to make nested lists &lt;code&gt;[[Matrix]]&lt;/code&gt; and make list non-nullable using exclamation marks like &lt;code&gt;[Photo!]!&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In order to complete our schema, let's define next our &lt;code&gt;Photo&lt;/code&gt; and &lt;code&gt;Author&lt;/code&gt; types.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Photo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;thumbnailUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;album&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Album&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Author&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;albums&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Album&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scalar Types
&lt;/h3&gt;

&lt;p&gt;Scalar types represent concrete data. In the GraphQL SDL  we have 5 built-in scalar types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Int&lt;/code&gt;: A signed 32‐bit integer.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Float&lt;/code&gt;: A signed double-precision floating-point value.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;String&lt;/code&gt;: A UTF‐8 character sequence.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Boolean&lt;/code&gt;: true or false.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ID&lt;/code&gt;: The ID scalar type represents a unique dentifier. It will be serialized as a string and be used by client libraries for caching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Besides these basic types, most GraphQL libraries will allow you to define custom types, such as &lt;code&gt;Date&lt;/code&gt; or &lt;code&gt;Json&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enumeration Types
&lt;/h3&gt;

&lt;p&gt;Enumeration types are a special kind of scalars that are restricted to a particular &lt;strong&gt;set of allowed values&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, we could express some measure units using an enum instead of the generic scalar &lt;code&gt;String&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;INCHES&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;CENTIMETERS&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Distance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enums values are normally expressed using all-caps. They are very useful to validate arguments, keep data values consistent and communicate through our type system that a field will always be one of a finite set of values.&lt;/p&gt;

&lt;p&gt;Note that the implementation of GraphQL enums are specific to the language in which our service is implemented.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arguments and Input Objects
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Every field&lt;/strong&gt; on a GraphQL object can have zero or any number of arguments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;albums&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Album&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arguments in GraphQL are passed by name. In this case, we just added &lt;code&gt;ids&lt;/code&gt; to our &lt;code&gt;albums&lt;/code&gt; field. They can be either required or optional.&lt;/p&gt;

&lt;p&gt;It's possible define a &lt;em&gt;default value&lt;/em&gt; that will be used when the value of that argument is not explicitly passed.&lt;/p&gt;

&lt;p&gt;When we want our arguments to be &lt;strong&gt;complex objects&lt;/strong&gt; we need to use the &lt;strong&gt;input type&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PaginationInput&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;albums&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pagination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PaginationInput&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Album&lt;/span&gt;&lt;span class="p"&gt;!]!&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also be aware that inputs, unlike object types, can't have arguments in their fields and can be made only of scalar types and other input types.&lt;/p&gt;

&lt;p&gt;Please note that the snippet above is an incomplete example of how to implement the pagination of a query and it's only used to illustrate the use of inputs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unions and Interfaces
&lt;/h3&gt;

&lt;p&gt;Unions and interfaces are both &lt;strong&gt;abstract&lt;/strong&gt; types that allow a field to have multiple object types.&lt;/p&gt;

&lt;p&gt;Let's explore them with an example. Let's create 2 different types of books first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TextBook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NoteBook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's create a quey that returns either one or the other depending on the &lt;code&gt;id&lt;/code&gt; we pass to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;union&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TextBook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NoteBook&lt;/span&gt;&lt;span class="w"&gt; 

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that members of a union type &lt;strong&gt;need to be concrete object types&lt;/strong&gt;. It's not possible to create a union type out of interfaces or other unions.&lt;/p&gt;

&lt;p&gt;Now let's explore how to express the same but this time using &lt;strong&gt;interfaces&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight graphql"&gt;&lt;code&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TextBook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;NoteBook&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;brand&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Float&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;!):&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see an interface declares a set of fields that multiple objects &lt;strong&gt;must include&lt;/strong&gt; to implement it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping it up
&lt;/h2&gt;

&lt;p&gt;Thank you for making it all the way here, to the end of this post. Today we have explored the building blocks of the GraphQL schema and hopefully after reading this post you're now better prepared to create your own GraphQL service.&lt;/p&gt;

&lt;p&gt;As we've seen the GraphQL schema is one of the main elements of the GraphQL spec, enabling some &lt;a href="https://www.javatpoint.com/graphql-advantages-and-disadvantages" rel="noopener noreferrer"&gt;advantages&lt;/a&gt; compared to other data fetching making possible to have a hierarchical, declarative and strongly-typed backend API.&lt;/p&gt;

&lt;p&gt;If you want to start playing around with GraphQL queries without having to write your own service, I'd recommend you using the &lt;a href="https://docs.github.com/en/graphql/overview/explorer" rel="noopener noreferrer"&gt;Github GraphQL Explorer&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;And that's it for now! Please let me know in the comments what do you think about this post and about GraphQL? Would you like to know more about directives, fragments, resolvers and dataloaders? If so, leave a comment below. Thank you so much for reading!&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://engineering.fb.com/2015/09/14/core-data/graphql-a-data-query-language/" rel="noopener noreferrer"&gt;https://engineering.fb.com/2015/09/14/core-data/graphql-a-data-query-language/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://spec.graphql.org/October2021/" rel="noopener noreferrer"&gt;https://spec.graphql.org/October2021/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://graphql.org" rel="noopener noreferrer"&gt;https://graphql.org&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.howtographql.com" rel="noopener noreferrer"&gt;https://www.howtographql.com&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.redhat.com/en/topics/api/what-is-graphql" rel="noopener noreferrer"&gt;https://www.redhat.com/en/topics/api/what-is-graphql&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.prisma.io/blog/graphql-sdl-schema-definition-language-6755bcb9ce51" rel="noopener noreferrer"&gt;https://www.prisma.io/blog/graphql-sdl-schema-definition-language-6755bcb9ce51&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/graphql-graphql-sdl" rel="noopener noreferrer"&gt;https://www.digitalocean.com/community/tutorials/graphql-graphql-sdl&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.apollographql.com/docs/react/data/subscriptions/" rel="noopener noreferrer"&gt;https://www.apollographql.com/docs/react/data/subscriptions/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.logrocket.com/what-you-need-to-know-about-graphql-enums/" rel="noopener noreferrer"&gt;https://blog.logrocket.com/what-you-need-to-know-about-graphql-enums/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://daily.dev/blog/pagination-in-graphql" rel="noopener noreferrer"&gt;https://daily.dev/blog/pagination-in-graphql&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.optisolbusiness.com/insight/top-5-advantages-of-graphql" rel="noopener noreferrer"&gt;https://www.optisolbusiness.com/insight/top-5-advantages-of-graphql&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apiacademy.co/2022/05/key-use-cases-for-graphql-apis/" rel="noopener noreferrer"&gt;https://apiacademy.co/2022/05/key-use-cases-for-graphql-apis/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>graphql</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
