logo
eng-flag

GraphQL Notları ve İpuçları

İçindekiler

  1. GraphQL'e Giriş
  2. Şema Tanımlama Dili (SDL)
  3. Tipler
  4. Sorgular
  5. Mutasyonlar
  6. Abonelikler
  7. Çözücüler
  8. Değişkenler
  9. Yönergeler
  10. Parçalar
  11. İçe Bakış
  12. Kimlik Doğrulama ve Yetkilendirme
  13. En İyi Uygulamalar
  14. Araçlar

GraphQL'e Giriş

GraphQL, API'ler için bir sorgu dili ve bu sorguları mevcut verilerinizle yürütmek için bir çalışma zamanıdır. API'nizdeki verilerin eksiksiz ve anlaşılır bir açıklamasını sunar, istemcilere tam olarak ihtiyaç duydukları şeyi isteme gücü verir, API'lerin zaman içinde geliştirilmesini kolaylaştırır ve güçlü geliştirici araçlarını mümkün kılar.

Şema Tanımlama Dili (SDL)

GraphQL, verilerinizin yapısını tanımlamak için SDL'yi kullanır.

type User {
  id: ID!
  name: String!
  email: String!
  posts: [Post!]!
}

type Post {
  id: ID!
  title: String!
  content: String!
  author: User!
}

type Query {
  user(id: ID!): User
  users: [User!]!
  post(id: ID!): Post
  posts: [Post!]!
}

type Mutation {
  createUser(name: String!, email: String!): User!
  createPost(title: String!, content: String!, authorId: ID!): Post!
}

Tipler

Temel Skaler Tipler:

Int: 32-bit tamsayı
Float: Çift hassasiyetli kayan nokta değeri
String: UTF-8 karakter dizisi
Boolean: true veya false
ID: Benzersiz tanımlayıcı

Nesne Tipleri:

type User {
  id: ID!
  name: String!
  email: String!
}

Giriş Tipleri:

input UserInput {
  name: String!
  email: String!
}

Enum Tipleri:

enum Role {
  USER
  ADMIN
  MODERATOR
}

Arayüz Tipleri:

interface Node {
  id: ID!
}

type User implements Node {
  id: ID!
  name: String!
}

Birleşim Tipleri:

union SearchResult = User | Post | Comment

Sorgular

Temel Sorgu:

query {
  user(id: "123") {
    name
    email
    posts {
      title
    }
  }
}

Çoklu Sorgular:

query {
  user(id: "123") {
    name
  }
  posts {
    title
  }
}

Takma Adlar:

query {
  user1: user(id: "123") {
    name
  }
  user2: user(id: "456") {
    name
  }
}

Mutasyonlar

Temel Mutasyon:

mutation {
  createUser(name: "John Doe", email: "john@example.com") {
    id
    name
    email
  }
}

Çoklu Mutasyonlar:

mutation {
  createUser(name: "John Doe", email: "john@example.com") {
    id
  }
  createPost(title: "Merhaba Dünya", content: "Bu benim ilk gönderim", authorId: "123") {
    id
    title
  }
}

Abonelikler

Temel Abonelik:

subscription {
  newPost {
    id
    title
    author {
      name
    }
  }
}

Çözücüler

JavaScript'te örnek çözücü:

const resolvers = {
  Query: {
    user: (parent, args, context, info) => {
      return getUserById(args.id);
    },
    posts: () => getAllPosts(),
  },
  Mutation: {
    createUser: (parent, args, context, info) => {
      return createNewUser(args.name, args.email);
    },
  },
  User: {
    posts: (parent) => getPostsByUserId(parent.id),
  },
};

Değişkenler

Değişkenli Sorgu:

query GetUser($userId: ID!) {
  user(id: $userId) {
    name
    email
  }
}

Değişken Değerleri:

{
  "userId": "123"
}

Yönergeler

Yerleşik Yönergeler:

query GetUser($includeEmail: Boolean!) {
  user(id: "123") {
    name
    email @include(if: $includeEmail)
  }
}

Özel Yönerge:

directive @deprecated(reason: String) on FIELD_DEFINITION

type User {
  id: ID!
  name: String!
  oldField: String @deprecated(reason: "Bunun yerine newField kullanın")
  newField: String
}

Parçalar

Parça Tanımı ve Kullanımı:

fragment UserFields on User {
  id
  name
  email
}

query {
  user(id: "123") {
    ...UserFields
    posts {
      title
    }
  }
}

İçe Bakış

İçe Bakış Sorgusu:

query {
  __schema {
    types {
      name
      kind
      description
    }
  }
}

Kimlik Doğrulama ve Yetkilendirme

Bağlam Tabanlı Kimlik Doğrulama:

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    const token = req.headers.authorization || '';
    const user = getUser(token);
    return { user };
  },
});

Çözücü Düzeyinde Yetkilendirme:

const resolvers = {
  Query: {
    sensitiveData: (parent, args, context) => {
      if (!context.user) throw new Error('Giriş yapmanız gerekiyor');
      if (!context.user.hasPermission('READ_SENSITIVE_DATA')) {
        throw new Error('Yetkiniz yok');
      }
      return getSensitiveData();
    },
  },
};

En İyi Uygulamalar

  1. Şemanızı istemci odaklı tasarlayın
  2. Anlamlı ve açıklayıcı isimler kullanın
  3. Büyük koleksiyonlar için sayfalandırma uygulayın
  4. Toplu işlem ve önbellekleme için DataLoader kullanın
  5. Hataları zarif bir şekilde ele alın
  6. Karmaşık mutasyonlar için giriş tiplerini kullanın
  7. Uygun kimlik doğrulama ve yetkilendirme uygulayın
  8. Performans için çözücüleri optimize edin
  9. Farklı argümanlarla aynı alanı istemek için takma adları kullanın
  10. Yeniden kullanılabilir alan seçimleri için parçalardan yararlanın
  11. Gerçek zamanlı güncellemeler için abonelikler uygulayın
  12. Büyük ölçekli uygulamalar için şema birleştirme veya federasyon kullanın
  13. Açıklamalar kullanarak şemanızı belgeleyin
  14. Belirli veri tipleri için özel skalerler kullanın (örn. DateTime)
  15. Gerektiğinde alan düzeyinde izinler uygulayın

Araçlar

  1. GraphQL Playground - Etkileşimli IDE
  2. Apollo Server - GraphQL sunucu uygulaması
  3. GraphQL Voyager - Etkileşimli grafik görselleştirme
  4. GraphQL Code Generator - GraphQL şemasına dayalı kod üretimi
  5. GraphQL Faker - GraphQL API'nizi gerçekçi verilerle taklit edin
  6. GraphQL Shield - Yetkilendirme ara yazılımı
  7. DataLoader - Toplu işlem ve önbellekleme kütüphanesi
  8. Apollo Client - Kapsamlı GraphQL istemcisi
  9. Prisma - Veritabanı araç seti ve ORM
  10. GraphQL Nexus - Kod öncelikli GraphQL şema oluşturma

2024 © Tüm hakları saklıdır - buraxta.com