REST API vs GraphQL
REST, avec plus de 20 ans d'existence, affronte GraphQL, né chez Facebook. Quel paradigme de conception d'API choisir pour le backend de votre application mobile ?
La plateforme complète de développement mobile de Google
Alternative open-source à Firebase — basée sur PostgreSQL, auto-hébergeable
| Catégorie | Firebase | Supabase |
|---|---|---|
| Performance | 9/10 | 9/10 |
| Facilité d'apprentissage | 8/10 | 7/10 |
| Écosystème | 10/10 | 7/10 |
| Communauté | 9/10 | 8/10 |
| Marché de l'emploi | 9/10 | 7/10 |
| Pérennité | 7/10 | 9/10 |
// Firebase - Messages de chat en temps réel
import FirebaseFirestore
import FirebaseAuth
import SwiftUI
@Observable
class ChatViewModel {
var messages: [Message] = []
private var listener: ListenerRegistration?
private let db = Firestore.firestore()
struct Message: Identifiable, Codable {
@DocumentID var id: String?
let senderId: String
let senderName: String
let text: String
let timestamp: Timestamp
}
func startListening(roomId: String) {
listener = db.collection("rooms")
.document(roomId)
.collection("messages")
.order(by: "timestamp", descending: false)
.limit(toLast: 50)
.addSnapshotListener { [weak self] snapshot, error in
guard let documents = snapshot?.documents else { return }
self?.messages = documents.compactMap {
try? $0.data(as: Message.self)
}
}
}
func sendMessage(text: String, roomId: String) async throws {
guard let user = Auth.auth().currentUser else { return }
let message = Message(
senderId: user.uid,
senderName: user.displayName ?? "Anonyme",
text: text,
timestamp: Timestamp()
)
try db.collection("rooms")
.document(roomId)
.collection("messages")
.addDocument(from: message)
}
func stopListening() { listener?.remove() }
}// Supabase - CRUD de publications utilisateur
import Supabase
import Foundation
struct Post: Codable, Identifiable {
let id: UUID
let userId: UUID
let title: String
let content: String
let createdAt: Date
enum CodingKeys: String, CodingKey {
case id, title, content
case userId = "user_id"
case createdAt = "created_at"
}
}
class PostRepository {
private let client = SupabaseClient(
supabaseURL: URL(string: ProcessInfo.processInfo.environment["SUPABASE_URL"]!)!,
supabaseKey: ProcessInfo.processInfo.environment["SUPABASE_ANON_KEY"]!
)
func fetchPosts() async throws -> [Post] {
try await client
.from("posts")
.select("*")
.order("created_at", ascending: false)
.limit(20)
.execute()
.value
}
func createPost(title: String, content: String) async throws -> Post {
let userId = try await client.auth.session.user.id
return try await client
.from("posts")
.insert(["user_id": userId.uuidString, "title": title, "content": content])
.select()
.single()
.execute()
.value
}
func subscribeToNewPosts(onNewPost: @escaping (Post) -> Void) -> RealtimeChannelV2 {
let channel = client.channel("public:posts")
channel.onPostgresChange(
InsertAction.self,
table: "posts"
) { change in
if let post = try? change.record.decode(as: Post.self) {
onNewPost(post)
}
}
Task { await channel.subscribe() }
return channel
}
}Pour un développement rapide, un excellent SDK iOS et des fonctionnalités temps réel, Firebase est puissant. Pour des données relationnelles, la flexibilité du SQL, l'open-source et l'inquiétude du lock-in vendeur, choisissez Supabase. En 2025, Supabase mûrit rapidement et devient une alternative sérieuse — son intégration pgvector se distingue notamment pour les applications dotées de fonctionnalités IA.
Obtenir une consultation gratuiteC'est possible, mais pas simple. La structure NoSQL de Firestore doit être convertie vers un schéma PostgreSQL, les utilisateurs Auth doivent être migrés, les fichiers de Storage transférés. Cela nécessite un projet de migration conséquent.