Supabase API'sini Nasıl Kullanılır: Eksiksiz Bir Kılavuz

Bu rehber, Supabase API'sinden nasıl yararlanılacağına dair kapsamlı bir genel bakış sunar.

Efe Demir

Efe Demir

5 June 2025

Supabase API'sini Nasıl Kullanılır: Eksiksiz Bir Kılavuz

Supabase, PostgreSQL veritabanı etrafında oluşturulmuş bir dizi araç sunarak, geliştiricilere Firebase'e güçlü bir açık kaynak alternatifi olarak hızla ortaya çıktı. Temelinde Supabase, veritabanınızın üzerine anında, gerçek zamanlı bir API katmanı sunarak arka uç geliştirmeyi önemli ölçüde hızlandırır. Bu kılavuz, Supabase API'sinden nasıl yararlanılacağına dair kapsamlı bir genel bakış sunar ve ilk kurulum ve temel işlemlerden güvenliğe, özelleştirmeye ve tür güvenliğine kadar her şeyi kapsar.

💡
Güzel API Dokümantasyonu oluşturan harika bir API Test aracı mı istiyorsunuz?

Geliştirici Ekibinizin maksimum verimlilikle birlikte çalışması için entegre, Hepsi Bir Arada bir platform mu istiyorsunuz?

Apidog tüm taleplerinizi karşılıyor ve Postman'in yerini çok daha uygun bir fiyata alıyor!
button

1. Giriş: Supabase API Nedir?

Veritabanınızla etkileşim kurmak için REST veya GraphQL uç noktaları oluşturmak için önemli zaman harcayabileceğiniz geleneksel arka uç geliştirmesinden farklı olarak, Supabase sizin için otomatik olarak güvenli ve performanslı bir API oluşturur. Supabase PostgreSQL veritabanınızda bir tablo oluşturduğunuzda, Supabase, veritabanı şemanızı incelemek ve ilgili RESTful uç noktaları sağlamak için PostgREST, açık kaynaklı bir araç kullanır.

Temel Faydalar:

Bu kılavuz öncelikle REST API'sine ve istemci kitaplıkları aracılığıyla etkileşimine ve ayrıca Supabase Edge Functions'a odaklanmaktadır.

2. Supabase API'ye Başlarken

Supabase API'sini anlamanın en kolay yolu doğrudan atlamaktır. Bir Supabase projeniz olduğunu (değilse, supabase.com adresini ziyaret edin ve ücretsiz bir tane oluşturun) ve örneğin profiles gibi basit bir tablo oluşturduğunuzu varsayalım:

-- Create a table for public profiles
create table profiles (
  id uuid references auth.users not null primary key,
  updated_at timestamp with time zone,
  username text unique,
  avatar_url text,
  website text,

  constraint username_length check (char_length(username) >= 3)
);

-- Set up Row Level Security (RLS)
-- See https://supabase.com/docs/guides/auth/row-level-security for more details.
alter table profiles
  enable row level security;

create policy "Public profiles are viewable by everyone." on profiles
  for select using (true);

create policy "Users can insert their own profile." on profiles
  for insert with check (auth.uid() = id);

create policy "Users can update own profile." on profiles
  for update using (auth.uid() = id);

-- This trigger automatically creates a profile entry when a new user signs up via Supabase Auth.
-- See https://supabase.com/docs/guides/auth/managing-user-data#using-triggers for more details.
create function public.handle_new_user()
returns trigger as $$
begin
  insert into public.profiles (id, username)
  values (new.id, new.raw_user_meta_data->>'username');
  return new;
end;
$$ language plpgsql security definer;
create trigger on_auth_user_created
  after insert on auth.users
  for each row execute procedure public.handle_new_user();

(Not: Yukarıdaki örnek, Supabase'in standart örnekleriyle uyumlu olarak profiles kullanır. Konsept, bir todos tablosu veya oluşturduğunuz başka herhangi bir tablo için eşit olarak geçerlidir.)

API Kimlik Bilgilerinizi Bulma:

Her Supabase projesi benzersiz API kimlik bilgileriyle birlikte gelir:

  1. Proje URL'si: Benzersiz Supabase uç noktanız (örneğin, https://<your-project-ref>.supabase.co).
  2. API Anahtarları: Project Settings > API altında Supabase Proje Panonuzda bulunur.

API ile Etkileşim (Supabase JS İstemci Kitaplığı kullanılarak):

Supabase, API etkileşimlerini basitleştirmek için istemci kitaplıkları sağlar. İşte JavaScript kitaplığını (supabase-js) nasıl kullanacağınız:

// 1. Import and initialize the client
import { createClient } from '@supabase/supabase-js'

const supabaseUrl = 'https://<your-project-ref>.supabase.co'
const supabaseAnonKey = '<your-anon-key>'

const supabase = createClient(supabaseUrl, supabaseAnonKey)

// 2. Fetch data (SELECT *)
async function getProfiles() {
  const { data, error } = await supabase
    .from('profiles')
    .select('*')

  if (error) console.error('Error fetching profiles:', error)
  else console.log('Profiles:', data)
}

// 3. Insert data (INSERT)
async function createProfile(userId, username) {
  const { data, error } = await supabase
    .from('profiles')
    .insert([
      { id: userId, username: username, updated_at: new Date() },
    ])
    .select() // Return the inserted data

  if (error) console.error('Error creating profile:', error)
  else console.log('Created Profile:', data)
}

// 4. Update data (UPDATE)
async function updateProfileUsername(userId, newUsername) {
  const { data, error } = await supabase
    .from('profiles')
    .update({ username: newUsername, updated_at: new Date() })
    .eq('id', userId) // Only update where id matches
    .select()

  if (error) console.error('Error updating profile:', error)
  else console.log('Updated Profile:', data)
}

// 5. Delete data (DELETE)
async function deleteProfile(userId) {
  const { data, error } = await supabase
    .from('profiles')
    .delete()
    .eq('id', userId) // Only delete where id matches

  if (error) console.error('Error deleting profile:', error)
  // Note: Delete often returns minimal data on success unless .select() is used *before* .delete() on some versions/setups.
  else console.log('Profile deleted successfully')
}

// Example Usage (assuming you have a user ID)
// getProfiles();
// createProfile('some-uuid-v4', 'new_user');
// updateProfileUsername('some-uuid-v4', 'updated_username');
// deleteProfile('some-uuid-v4');

Bu hızlı başlangıç, dahili olarak REST API'sini çağıran istemci kitaplığını kullanarak temel CRUD (Oluştur, Oku, Güncelle, Sil) işlemlerini gösterir.

3. Otomatik Oluşturulan Supabase REST API'si

İstemci kitaplıkları kullanışlı olsa da, PostgREST tarafından oluşturulan temel REST API'sini anlamak çok önemlidir.

API Uç Noktası Yapısı:

REST API'si için temel URL genellikle şudur: https://<your-project-ref>.supabase.co/rest/v1/

Uç noktalar tablolarınız için otomatik olarak oluşturulur:

Kimlik Doğrulama:

API istekleri, apikey başlığında API anahtarınızı ve genellikle Bearer <your-api-key> içeren bir Authorization başlığı (genellikle istemci tarafı istekler için aynı anon anahtarı veya sunucu tarafı için service_role anahtarı) içermelidir.

apikey: <your-anon-or-service-role-key>
Authorization: Bearer <your-anon-or-service-role-key>

Yaygın İşlemler (curl örnekleri kullanılarak):

Önceki örnekleri doğrudan REST API'sine karşı curl kullanarak çoğaltalım. Yer tutucuları buna göre değiştirin.

Veri Getirme (GET):

curl 'https://<ref>.supabase.co/rest/v1/profiles?select=*' \
  -H "apikey: <anon-key>" \
  -H "Authorization: Bearer <anon-key>"

Veri Ekleme (POST):

curl 'https://<ref>.supabase.co/rest/v1/profiles' \
  -X POST \
  -H "apikey: <anon-key>" \
  -H "Authorization: Bearer <anon-key>" \
  -H "Content-Type: application/json" \
  -H "Prefer: return=representation" \# Optional: Returns the inserted row(s) \
  -d '{ "id": "some-uuid", "username": "rest_user" }'

Veri Güncelleme (PATCH): (Kullanıcı adı 'rest_user' olan profili güncelle)

curl 'https://<ref>.supabase.co/rest/v1/profiles?username=eq.rest_user' \
  -X PATCH \
  -H "apikey: <anon-key>" \
  -H "Authorization: Bearer <anon-key>" \
  -H "Content-Type: application/json" \
  -H "Prefer: return=representation" \
  -d '{ "website": "https://example.com" }'

Veri Silme (DELETE): (Kullanıcı adı 'rest_user' olan profili sil)

curl 'https://<ref>.supabase.co/rest/v1/profiles?username=eq.rest_user' \
  -X DELETE \
  -H "apikey: <anon-key>" \
  -H "Authorization: Bearer <anon-key>"

Filtreleme, Seçme, Sıralama, Sayfalama:

REST API'si, URL parametreleri aracılığıyla güçlü sorgulamayı destekler:

Otomatik Oluşturulan API Dokümantasyonu:

Supabase'in en yardımcı özelliklerinden biri, proje panonuzda doğrudan bulunan otomatik oluşturulan API dokümantasyonudur.

  1. Supabase projenize gidin.
  2. Sol kenar çubuğundaki API Belgeleri simgesine (genellikle <> gibi görünür) tıklayın.
  3. "Tablolar ve Görünümler" altında bir tablo seçin.
  4. Şunları içeren, o tabloya özel REST uç noktaları için ayrıntılı dokümantasyon göreceksiniz:

Bu etkileşimli dokümantasyon, API çağrılarınızı nasıl yapılandıracağınızı anlamak için paha biçilmezdir.

4. Supabase API'sini Kullanarak Gelişmiş Geliştirme İçin Tür Oluşturma

TypeScript veya diğer türü belirlenmiş dilleri kullanan projeler için Supabase, tür tanımlarını doğrudan veritabanı şemanızdan oluşturmanın bir yolunu sağlar. Bu, önemli faydalar sağlar:

Supabase CLI Kullanarak Tür Oluşturma:

  1. Supabase CLI'yi Yükleyin: https://supabase.com/docs/guides/cli adresindeki talimatları izleyin.
  2. Oturum açın: supabase login
  3. Projenizi bağlayın: supabase link --project-ref <your-project-ref> (Bunu yerel proje dizininizde çalıştırın). Bir veritabanı parolası sağlamanız gerekebilir.
  4. Türleri oluşturun:
supabase gen types typescript --linked > src/database.types.ts
# Or specify project-id if not linked or in a different context
# supabase gen types typescript --project-id <your-project-ref> > src/database.types.ts

Bu komut, bağlantılı Supabase projenizin veritabanı şemasını inceler ve tablolarınız, görünümleriniz ve işlev bağımsız değişkenleriniz/dönüş türleriniz için arabirimler içeren bir TypeScript dosyası (bu örnekte database.types.ts) çıkarır.

Oluşturulan Türleri Kullanma:

Daha sonra bu türleri uygulama kodunuza aktarabilirsiniz:

import { createClient } from '@supabase/supabase-js'
// Import the generated types
import { Database } from './database.types' // Adjust path as needed

const supabaseUrl = 'https://<your-project-ref>.supabase.co'
const supabaseAnonKey = '<your-anon-key>'

// Provide the Database type to createClient
const supabase = createClient<Database>(supabaseUrl, supabaseAnonKey)

// Now you get type safety and autocompletion!
async function getSpecificUserProfile(username: string) {
  // Autocompletes table names ('profiles')
  const { data, error } = await supabase
    .from('profiles')
    // Autocompletes column names ('id', 'username', 'website')
    .select('id, username, website')
    // Type checks the value against the column type
    .eq('username', username)
    .single() // Expects a single result or null

  if (error) {
    console.error('Error fetching profile:', error)
    return null;
  }

  // 'data' is now correctly typed based on your select query
  if (data) {
    console.log(`User ID: ${data.id}, Website: ${data.website}`);
    // console.log(data.non_existent_column); // <-- TypeScript error!
  }

  return data;
}

Tür oluşturma, Supabase ile sağlam uygulama geliştirmesi için şiddetle tavsiye edilen bir uygulamadır.

5. Edge Functions ile Özel Supabase API Rotaları Oluşturma

Otomatik oluşturulan REST API'si standart CRUD işlemlerini kapsarken, genellikle aşağıdakiler için özel sunucu tarafı mantığına ihtiyacınız olacaktır:

Supabase Edge Functions, Deno tabanlı TypeScript işlevlerini kullanıcılarınıza yakın, kenarda küresel olarak dağıtmanın bir yolunu sağlar.

Bir Edge İşlevi Oluşturma:

  1. İşlevleri Başlatın (henüz yapılmadıysa): supabase functions new hello-world (bağlantılı proje dizininizde çalıştırın). Bu, bir supabase/functions/hello-world/index.ts dosyası oluşturur.

İşlev kodunuzu yazın:

// supabase/functions/hello-world/index.ts
import { serve } from 'https://deno.land/std@0.177.0/http/server.ts' // Use appropriate std version

serve(async (req) => {
  // You can access request headers, method, body etc. from 'req'
  console.log(`Request received for: ${req.url}`);

  // Example: Accessing Supabase DB from within the function
  // Note: Requires setting up the Supabase client *inside* the function
  // Use environment variables for secrets!
  // import { createClient } from '@supabase/supabase-js'
  // const supabaseAdmin = createClient(
  //   Deno.env.get('SUPABASE_URL') ?? '',
  //   Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? ''
  // )
  // const { data: users, error } = await supabaseAdmin.from('profiles').select('*').limit(10);

  const data = {
    message: `Hello from the Edge!`,
    // users: users // Example if fetching data
  }

  return new Response(
    JSON.stringify(data),
    { headers: { 'Content-Type': 'application/json' } },
  )
})

İşlevi dağıtın:

supabase functions deploy hello-world --no-verify-jwt
# Use --no-verify-jwt for publicly accessible functions
# Omit it or set --verify-jwt=true to require a valid Supabase Auth JWT

İşlevi çağırın:
Dağıtılan işlevleri, benzersiz uç noktalarına HTTP POST istekleri (veya GET, işlev mantığına bağlı olarak) aracılığıyla çağırabilirsiniz:
https://<your-project-ref>.supabase.co/functions/v1/hello-world

curl kullanma:

curl -X POST 'https://<ref>.supabase.co/functions/v1/hello-world' \
  -H "Authorization: Bearer <user-jwt-if-required>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Functions"}' # Optional request body

Veya Supabase JS istemcisini kullanma:

const { data, error } = await supabase.functions.invoke('hello-world', {
  method: 'POST', // or 'GET', etc.
  body: { name: 'Functions' }
})

Edge Functions, Supabase arka uç yeteneklerinizi basit veritabanı işlemlerinin ötesine genişletmek için güçlü bir araçtır.

6. API Anahtarları ve Supabase API'nizi Güvenli Hale Getirme

API anahtarlarını anlamak ve uygun güvenlik önlemleri uygulamak pazarlık edilemez.

API Anahtarları Özeti:

Satır Düzeyi Güvenliğinin (RLS) Önemli Rolü:

anon anahtarını kullanırken Supabase güvenliğinin temel taşı RLS'dir. PostgreSQL veritabanında doğrudan ayrıntılı erişim kontrolü ilkeleri tanımlamanıza olanak tanır. İlkeler, bir kullanıcının kimlik doğrulama durumuna, kullanıcı kimliğine, rolüne veya diğer ölçütlere göre hangi satırları görüntüleyebileceğini, ekleyebileceğini, güncelleyebileceğini veya silebileceğini belirleyen temel olarak SQL kurallarıdır.

RLS'yi Etkinleştirme:

Varsayılan olarak, RLS yeni tablolarda devre dışıdır. anon anahtarını kullanarak istemci tarafından erişmeyi düşündüğünüz herhangi bir tablo için etkinleştirmeniz gerekir.

-- Enable RLS on the 'profiles' table
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;

-- IMPORTANT: If no policies are defined after enabling RLS,
-- access is implicitly denied for all operations (except the table owner).

RLS İlkeleri Oluşturma:

İlkeler, USING yan tümcesini (SELECT, UPDATE, DELETE gibi okuma erişimi için) ve WITH CHECK yan tümcesini (INSERT, UPDATE gibi yazma erişimi için) tanımlar.

Örnek 1: Oturum açmış kullanıcıların tüm profilleri okumasına izin verin:

CREATE POLICY "Allow authenticated read access"
ON profiles FOR SELECT
USING ( auth.role() = 'authenticated' );

Örnek 2: Kullanıcıların yalnızca kendi profilini görüntülemesine izin verin:

CREATE POLICY "Allow individual read access"
ON profiles FOR SELECT
USING ( auth.uid() = id ); -- Assumes 'id' column matches the user's UUID from Supabase Auth

Örnek 3: Kullanıcıların yalnızca kendi profilini güncellemesine izin verin:

CREATE POLICY "Allow individual update access"
ON profiles FOR UPDATE
USING ( auth.uid() = id ) -- Specifies which rows can be targeted for update
WITH CHECK ( auth.uid() = id ); -- Ensures any *new* data still matches the condition

Örnek 4: Kullanıcıların kendi profilini eklemesine izin verin:

CREATE POLICY "Allow individual insert access"
ON profiles FOR INSERT
WITH CHECK ( auth.uid() = id );

RLS ilkelerini doğrudan Supabase Panosunda Authentication > Policies altında görüntüleyebilir, oluşturabilir ve yönetebilirsiniz.

Temel Güvenlik İlkeleri:

  1. anon anahtarı aracılığıyla erişilen tablolarda her zaman RLS'yi etkinleştirin.
  2. Gerektiğinde SELECT, INSERT, UPDATE, DELETE için açık ilkeler tanımlayın. Kısıtlayıcı ilkelerle başlayın ve erişimi dikkatlice açın.
  3. İstemci tarafı kodda veya güvensiz ortamlarda asla service_role anahtarını ifşa etmeyin.
  4. Ayrıcalıklı ayrıcalıklar veya karmaşık sunucu tarafı mantığı gerektiren işlemler için Edge Functions kullanın, service_role anahtarınızı işlevin güvenli ortam değişkenleri içinde koruyun.
  5. Uygulamanızın güvenlik gereksinimlerini karşıladıklarından emin olmak için RLS ilkelerinizi düzenli olarak inceleyin.

7. SQL Kavramlarını Supabase API'sine Eşleme (SQL'den API'ye)

SQL'e aşinaysanız, yaygın SQL işlemlerinin Supabase API'sine (hem REST hem de istemci kitaplıkları) nasıl eşlendiğini anlamak faydalıdır.

SELECT * FROM my_table;

SELECT column1, column2 FROM my_table WHERE id = 1;

INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2');

UPDATE my_table SET column1 = 'new_value' WHERE id = 1;

DELETE FROM my_table WHERE id = 1;

Birleştirmeler: Temel REST çağrılarında doğrudan SQL JOIN sözdizimi kullanılmazken, ilgili verileri şunları kullanarak getirebilirsiniz:

-- Example SQL function
CREATE FUNCTION get_user_posts(user_id uuid)
RETURNS TABLE (post_id int, post_content text) AS $$
  SELECT posts.id, posts.content
  FROM posts
  WHERE posts.author_id = user_id;
$$ LANGUAGE sql;

8. Supabase API ile Özel Şemalar Kullanma

Varsayılan olarak, Supabase SQL Düzenleyicisi'nde oluşturduğunuz tablolar public şemasında bulunur. Daha iyi organizasyon, ad alanı veya izin yönetimi için, özel PostgreSQL şemaları kullanmak isteyebilirsiniz.

Özel Bir Şema Oluşturma:

CREATE SCHEMA private_schema;

Özel Bir Şemada Tablolar Oluşturma:

CREATE TABLE private_schema.sensitive_data (
  id serial primary key,
  payload jsonb
);

API aracılığıyla Özel Şemalardaki Tablolara Erişim:

Supabase'in PostgREST katmanı, public dışındaki şemalardaki tabloları otomatik olarak algılar.

// Accessing a table in 'private_schema' (assuming RLS/permissions allow)
const { data, error } = await supabase
  .from('sensitive_data') //

Explore more

Fathom-R1-14B: Hindistan'dan Gelişmiş Yapay Zeka Muhakeme Modeli

Fathom-R1-14B: Hindistan'dan Gelişmiş Yapay Zeka Muhakeme Modeli

Yapay zeka hızla gelişiyor. FractalAIResearch/Fathom-R1-14B, 14.8 milyar parametreyle matematik ve genel akıl yürütmede başarılı.

5 June 2025

Mistral Code: İşletmeler için En Özelleştirilebilir Yapay Zeka Destekli Kodlama Asistanı

Mistral Code: İşletmeler için En Özelleştirilebilir Yapay Zeka Destekli Kodlama Asistanı

Mistral Code'u keşfedin: Kurumsal kullanıma özel, en özelleştirilebilir yapay zeka destekli kodlama asistanı.

5 June 2025

Claude Code'un 2025'te Yapay Zeka Kodlamasını Nasıl Dönüştürdüğü

Claude Code'un 2025'te Yapay Zeka Kodlamasını Nasıl Dönüştürdüğü

Claude Code, 2025'te yapay zeka destekli kodlamayı nasıl devrimleştiriyor? Özelliklerini, kullanımını ve Windsurf kısıtlamalarından sonra neden popüler olduğunu öğrenin. Geliştiriciler için okunması gereken!

5 June 2025

API Tasarım-Öncelikli Yaklaşımı Apidog'da Uygulayın

API'leri oluşturmanın ve kullanmanın daha kolay yolunu keşfedin