Özet - REST API Modelleri
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 78 / 107.
Görev
KolayBir blog platformu için REST API model sistemi oluşturalım! JSON'a serileştirilen ve okunabilir dize gösterimleri sağlayan, gerçek API yanıtları oluştururken tam olarak ihtiyaç duyacağınız iyi yapılandırılmış türler oluşturacaksınız.
Kodunuzu iki dosyada düzenleyeceksiniz:
models.go: Uygun JSON etiketleri ve dize gösterimleriyle API veri modellerinizi tanımlayın.AuthoryapısınıID(int),Name(string) veEmail(string) alanlarıyla oluşturun. Bunları"id","name"ve"email"JSON anahtarlarıyla eşleyin.String()biçimini döndürecek şekilde[Name] <[Email]>yöntemini uygulayın.PostyapısınıID(int),Title(string),Content(string),Author(iç içe Author yapısı) vePublished(bool) alanlarıyla oluşturun. Bunları"id","title","content","author"ve"published"ile eşleyin. Boş içeriğin JSON'da görünmemesi içinContentalanıomitemptykullanmalıdır.String()döndürecek şekilde"[Title]" by [Author's String representation]yöntemini uygulayın.APIResponseyapısınıSuccess(bool),Message(string) veData(Post) alanlarıyla oluşturun. Bunları"success","message"ve"data"ile eşleyin.Messagealanıomitemptykullanmalıdır.main.go: API yanıtları oluşturun ve hem JSON çıktısını hem de dize gösterimlerini sergileyin.Bir işlem türü (
jsonveyadisplay) okuyun, ardından gönderi ayrıntılarını okuyun: gönderi ID'si, başlık, içerik, yazar ID'si, yazar adı, yazar e-postası ve yayımlanma durumu (trueveyafalse).jsoniçin:Success: trueolan ve gönderiyi veri olarak içeren bir APIResponse oluşturun (Message alanını boş bırakın). JSON'a dönüştürün ve yazdırın.displayiçin: Post'u oluşturun ve String yöntemini kullanarak yazdırın, ardından Author'u ayrı olarak yeni bir satırda yazdırın.
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: İşlem türü (
jsonveyadisplay) - 2. satır: Gönderi ID'si
- 3. satır: Başlık
- 4. satır: İçerik (boş olabilir)
- 5. satır: Yazar ID'si
- 6. satır: Yazar adı
- 7. satır: Yazar e-postası
- 8. satır: Yayımlanma durumu (
trueveyafalse)
Örneğin, şu girdi verildiğinde:
json
1
Getting Started with Go
Learn the basics of Go programming
101
Jane Smith
jane@example.com
trueÇıktınız şöyle olmalıdır:
{"success":true,"data":{"id":1,"title":"Getting Started with Go","content":"Learn the basics of Go programming","author":{"id":101,"name":"Jane Smith","email":"jane@example.com"},"published":true}}Ve şu girdi verildiğinde:
json
2
Draft Post
102
John Doe
john@example.com
falseÇıktınız şöyle olmalıdır:
{"success":true,"data":{"id":2,"title":"Draft Post","author":{"id":102,"name":"John Doe","email":"john@example.com"},"published":false}}Boş içerik alanının JSON çıktısında nasıl atlandığına dikkat edin.
Ve şu girdi verildiğinde:
display
3
Advanced Interfaces
Deep dive into Go interfaces
103
Alice Chen
alice@example.com
trueÇıktınız şöyle olmalıdır:
"Advanced Interfaces" by Alice Chen <alice@example.com>
Alice Chen <alice@example.com>Kendin dene
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// İşlem türünü oku
operation, _ := reader.ReadString('\n')
operation = strings.TrimSpace(operation)
// Gönderi ID'sini oku
postIDStr, _ := reader.ReadString('\n')
postID, _ := strconv.Atoi(strings.TrimSpace(postIDStr))
// Başlığı oku
title, _ := reader.ReadString('\n')
title = strings.TrimSpace(title)
// İçeriği oku
content, _ := reader.ReadString('\n')
content = strings.TrimSpace(content)
// Yazar ID'sini oku
authorIDStr, _ := reader.ReadString('\n')
authorID, _ := strconv.Atoi(strings.TrimSpace(authorIDStr))
// Yazar adını oku
authorName, _ := reader.ReadString('\n')
authorName = strings.TrimSpace(authorName)
// Yazar e-postasını oku
authorEmail, _ := reader.ReadString('\n')
authorEmail = strings.TrimSpace(authorEmail)
// Yayın durumunu oku
publishedStr, _ := reader.ReadString('\n')
published := strings.TrimSpace(publishedStr) == "true"
// TODO: Okunan değerlerle bir Author struct oluştur
// TODO: Okunan değerler ve Author ile bir Post struct oluştur
// TODO: İşlem türünü ele al
// Eğer işlem "json" ise:
// - Success: true ve Data olarak Post ile bir APIResponse oluştur
// - json.Marshal kullanarak JSON'a dönüştür
// - JSON dizesini yazdır
// Eğer operation "display" ise:
// - String metodunu kullanarak Post'u yazdır
// - Author'ı yeni bir satıra yazdır
// Değişkenleri kullanmak için yer tutucu (uygularken kaldır)
_ = postID
_ = title
_ = content
_ = authorID
_ = authorName
_ = authorEmail
_ = published
_ = operation
_ = json.Marshal
fmt.Println("TODO: Implement the solution")
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı11Standart Kütüphane ve OOP
io.Reader ve io.Writersort.Interface Arayüzüfmt.Stringer ArayüzüStruct'lar ile encoding/jsonhttp.Handler ArayüzüÖzet - REST API Modelleri3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi