Bu derste, Go dilinde API geliştirme konusunu ele alacağız. API’ler, uygulamalar arasında veri alışverişini sağlayan arayüzlerdir. Bu dersin sonunda, basit bir RESTful API oluşturmayı öğreneceksiniz.
API’ler, uygulamalar arasında veri alışverişini sağlayan arayüzlerdir. RESTful API’ler, HTTP protokolünü kullanarak veri alışverişi yapar ve genellikle JSON formatında veri döner.
Go dilinde HTTP sunucusu kurmak oldukça basittir. net/http
paketini kullanarak bir HTTP sunucusu oluşturabiliriz.
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Merhaba, Dünya!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Yukarıdaki kod, 8080 portunda çalışan basit bir HTTP sunucusu oluşturur.
REST (Representational State Transfer), HTTP protokolünü kullanarak veri alışverişi yapmayı sağlayan bir mimari stildir. RESTful API’ler, HTTP metodlarını (GET, POST, PUT, DELETE) kullanarak CRUD (Create, Read, Update, Delete) işlemlerini gerçekleştirir.
Şimdi, basit bir RESTful API oluşturalım. Bu API, kullanıcı bilgilerini saklayacak ve CRUD işlemlerini gerçekleştirecek.
package main
import (
"encoding/json"
"net/http"
"strconv"
"github.com/gorilla/mux"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
var users []User
func getUsers(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(users)
}
func getUser(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
for _, user := range users {
if user.ID == id {
json.NewEncoder(w).Encode(user)
return
}
}
http.NotFound(w, r)
}
func createUser(w http.ResponseWriter, r *http.Request) {
var user User
_ = json.NewDecoder(r.Body).Decode(&user)
user.ID = len(users) + 1
users = append(users, user)
json.NewEncoder(w).Encode(user)
}
func updateUser(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
for index, user := range users {
if user.ID == id {
users = append(users[:index], users[index+1:]...)
var updatedUser User
_ = json.NewDecoder(r.Body).Decode(&updatedUser)
updatedUser.ID = id
users = append(users, updatedUser)
json.NewEncoder(w).Encode(updatedUser)
return
}
}
http.NotFound(w, r)
}
func deleteUser(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, _ := strconv.Atoi(params["id"])
for index, user := range users {
if user.ID == id {
users = append(users[:index], users[index+1:]...)
break
}
}
json.NewEncoder(w).Encode(users)
}
func main() {
router := mux.NewRouter()
router.HandleFunc("/users", getUsers).Methods("GET")
router.HandleFunc("/users/{id}", getUser).Methods("GET")
router.HandleFunc("/users", createUser).Methods("POST")
router.HandleFunc("/users/{id}", updateUser).Methods("PUT")
router.HandleFunc("/users/{id}", deleteUser).Methods("DELETE")
http.ListenAndServe(":8080", router)
}
Yukarıdaki kod, kullanıcı bilgilerini saklayan ve CRUD işlemlerini gerçekleştiren basit bir RESTful API oluşturur.
CRUD işlemleri, veri tabanında yapılan temel işlemlerdir. Bu işlemler şunlardır:
API’lerinizi yapılandırmak için ortam değişkenlerini kullanabilirsiniz. Bu, API’nizin farklı ortamlarda (geliştirme, test, üretim) çalışmasını kolaylaştırır.
import (
"os"
"log"
)
func main() {
port := os.Getenv("PORT")
if port == "" {
log.Fatal("Port is not set.")
}
http.ListenAndServe(":"+port, router)
}
API’lerde hata yönetimi önemlidir. Kullanıcılara anlamlı hata mesajları döndürmek, API’nizin kullanılabilirliğini artırır.
func getUser(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
id, err := strconv.Atoi(params["id"])
if err != nil {
http.Error(w, "Invalid user ID", http.StatusBadRequest)
return
}
for _, user := range users {
if user.ID == id {
json.NewEncoder(w).Encode(user)
return
}
}
http.NotFound(w, r)
}
Gin, Go dilinde hızlı ve basit bir web framework’tür. Gin, RESTful API’ler oluşturmak için kullanışlıdır.
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/users", getUsers)
r.GET("/users/:id", getUser)
r.POST("/users", createUser)
r.PUT("/users/:id", updateUser)
r.DELETE("/users/:id", deleteUser)
r.Run(":8080")
}