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.
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!
}
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
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
}
}
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
}
}
Temel Abonelik:
subscription {
newPost {
id
title
author {
name
}
}
}
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şkenli Sorgu:
query GetUser($userId: ID!) {
user(id: $userId) {
name
email
}
}
Değişken Değerleri:
{
"userId": "123"
}
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ça Tanımı ve Kullanımı:
fragment UserFields on User {
id
name
email
}
query {
user(id: "123") {
...UserFields
posts {
title
}
}
}
İçe Bakış Sorgusu:
query {
__schema {
types {
name
kind
description
}
}
}
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();
},
},
};
2024 © Tüm hakları saklıdır - buraxta.com