Firebase vs Supabase
Google's Firebase versus open-source Supabase: developer experience, pricing, vendor lock-in, real-time capabilities, and full-stack feature comparison.
Resource-based, stateless, evrensel HTTP standartları
Sorgu dili — istemci tam olarak ne istediğini belirtiyor
// Swift - REST API istemcisi
import Foundation
enum HTTPMethod: String {
case GET, POST, PUT, DELETE, PATCH
}
struct APIClient {
private let baseURL = URL(string: "https://api.example.com")!
private let session: URLSession
init(session: URLSession = .shared) {
self.session = session
}
func request<T: Decodable>(
path: String,
method: HTTPMethod = .GET,
body: Encodable? = nil
) async throws -> T {
var url = baseURL.appendingPathComponent(path)
var request = URLRequest(url: url)
request.httpMethod = method.rawValue
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer \(AuthManager.shared.token)", forHTTPHeaderField: "Authorization")
if let body {
request.httpBody = try JSONEncoder().encode(body)
}
let (data, response) = try await session.data(for: request)
guard let http = response as? HTTPURLResponse else {
throw APIError.invalidResponse
}
switch http.statusCode {
case 200...299:
return try JSONDecoder().decode(T.self, from: data)
case 401:
throw APIError.unauthorized
case 404:
throw APIError.notFound
default:
throw APIError.serverError(http.statusCode)
}
}
}
// Kullanım
let client = APIClient()
let user: User = try await client.request(path: "/users/123")
let posts: [Post] = try await client.request(path: "/users/123/posts")// Swift - GraphQL Apollo istemcisi
import Apollo
import Foundation
// GraphQL sorgu tanımı (koddan üretilen)
// query GetUserWithPosts($id: ID!) {
// user(id: $id) {
// id
// name
// email
// posts(limit: 5) {
// id
// title
// excerpt
// publishedAt
// }
// }
// }
class GraphQLService {
private lazy var apollo = ApolloClient(url: URL(string: "https://api.example.com/graphql")!)
func fetchUserWithPosts(id: String) async throws -> UserWithPostsQuery.Data.User {
try await withCheckedThrowingContinuation { continuation in
apollo.fetch(query: UserWithPostsQuery(id: id)) { result in
switch result {
case .success(let graphQLResult):
if let errors = graphQLResult.errors {
continuation.resume(throwing: GraphQLError(errors))
} else if let user = graphQLResult.data?.user {
continuation.resume(returning: user)
} else {
continuation.resume(throwing: APIError.notFound)
}
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
func createPost(title: String, content: String) async throws -> CreatePostMutation.Data.CreatePost {
try await withCheckedThrowingContinuation { continuation in
apollo.perform(mutation: CreatePostMutation(title: title, content: content)) { result in
switch result {
case .success(let graphQLResult):
if let post = graphQLResult.data?.createPost {
continuation.resume(returning: post)
} else {
continuation.resume(throwing: APIError.invalidResponse)
}
case .failure(let error):
continuation.resume(throwing: error)
}
}
}
}
}Küçük-orta API'ler ve public entegrasyonlar için REST — basit, evrensel, cache-friendly. Karmaşık veri gereksinimleri, çoklu istemciler ve hızlı ürün iterasyonu gerekiyorsa GraphQL güçlü bir seçim. 2025'te birçok şirket hibrit yaklaşım benimsiyor: REST güvenli verimler, GraphQL esneklik gerektiren sorgular için.
Ücretsiz Danışmanlık AlBu yazının en değerli bilgisi
Bu ipucu, yazının en önemli çıkarımını içeriyor.
Haftalık Swift tips, SwiftUI tricks ve iOS best practices. Spam yok, sadece değerli içerik.
Gizliliğinize saygı duyuyoruz. İstediğiniz zaman abonelikten çıkabilirsiniz.
Hayır. İkisi farklı use case'lere hizmet ediyor. REST basit ve evrensel kalmaya devam edecek; GraphQL karmaşık ürün ihtiyaçları için güçlü alternatif.