Sıfırdan REST API Yazma: Mux ve Net/http ile Başlama

Go ile REST API yazmak, diğer dillere kıyasla çok daha basittir. Standart kütüphane yeterlidir; Mux sadece yönlendirmeyi kolaylaştırır. Burada GET ve POST işlemleri yapan bir basit API örneği göreceğiz.

Problemi açıklamak gerekirse: HTTP isteklerini farklı URL'lere göre yönlendirmek, JSON yanıt vermek ve basit veri saklama işlemlerini tek dosyada halletmek istiyoruz.

1package main
2
3import (
4"encoding/json"
5"fmt"
6"log"
7"net/http"
8
9"github.com/gorilla/mux"
10)
11
12type Kitap struct {
13ID int `json:"id"`
14Baslik string `json:"baslik"`
15Yazar string `json:"yazar"`
16}
17
18var kitaplar = []Kitap{
19{ID: 1, Baslik: "1984", Yazar: "George Orwell"},
20{ID: 2, Baslik: "Dune", Yazar: "Frank Herbert"},
21}
22
23func tumKitaplar(w http.ResponseWriter, r *http.Request) {
24w.Header().Set("Content-Type", "application/json")
25json.NewEncoder(w).Encode(kitaplar)
26}
27
28func kitapEkle(w http.ResponseWriter, r *http.Request) {
29var yeni Kitap
30json.NewDecoder(r.Body).Decode(&yeni)
31yeni.ID = len(kitaplar) + 1
32kitaplar = append(kitaplar, yeni)
33w.Header().Set("Content-Type", "application/json")
34w.WriteHeader(http.StatusCreated)
35json.NewEncoder(w).Encode(yeni)
36}
37
38func main() {
39router:= mux.NewRouter()
40
41router.HandleFunc("/kitaplar", tumKitaplar).Methods("GET")
42router.HandleFunc("/kitaplar", kitapEkle).Methods("POST")
43
44fmt.Println("Server:8080 adresinde çalışıyor...")
45log.Fatal(http.ListenAndServe(":8080", router))
46}

Bu kodu çalıştırmak için önce Mux'u indirin:

1go get github.com/gorilla/mux
2go run main.go

Sonra test edin:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Beklenen çıktı:

1[{"id":1,"baslik":"1984","yazar":"George Orwell"},{"id":2,"baslik":"Dune","yazar":"Frank Herbert"}]

Yeni kitap eklemek için:

2-H "Content-Type: application/json" \
3-d '{"baslik":"Fondation","yazar":"Isaac Asimov"}'

Sık yapılan hata: `json.NewDecoder` kullanırken istek gövdesini (Body) kapatmamak. Gerçek projede `defer r.Body.Close()` ekleyin. Ayrıca Mux olmadan da `http.HandleFunc` ile yönlendirme yapabilirsiniz, ancak Mux URL parametreleri (`/kitaplar/{id}` gibi) ve HTTP metotlarını daha temiz hale getirir.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz