Şuayb'in BloguŞuayb'in Blogu
Ana Sayfa
Kategoriler
Oyunlar
MediumHakkındaİletişim
Dil
Tema
    1. Blog
    2. Programlama
    3. REST API’lerde Girdi Doğrulama

REST API’lerde Girdi Doğrulama

İlk yayın15 Aralık 2024
Son güncelleme16 Aralık 2024
Okuma süresi3 dk okuma
JavaKotlinGoSpring BootGinDoğrulama
XLinkedInFacebook
REST API’lerde Girdi Doğrulama

Beğeni yükleniyor...

REST API’lerde girdi doğrulama, güvenli ve sağlam web servisleri oluşturmak için çok önemlidir. Bu makalede, Spring Boot kullanarak Java ve Kotlin’de, Gin framework’ü ile Go’da doğrulamanın nasıl yapılacağını adım adım inceleyeceğiz.


Son güncelleme16 Aralık 2024

Toplam görüntülenmeGörüntülenme yükleniyor...

Önceki makaleSpring GraphQL ile API OluşturmaSonraki makaleObject-Relational Mapping
Şuayb Şimşek

Yazan

Şuayb Şimşek

Spring Boot, güvenlik, mikroservis ve cloud-native mimari konularında pratik teknik notlar paylaşan backend odaklı fullstack geliştirici.

Uzmanlık

  • Spring Boot
  • Go
  • Mikroservis
  • Next.js
  • Cloud Native

Bağlantılar

GitHubLinkedInMedium

Benzer yazılar

Object-Relational Mapping
Programlama

Object-Relational Mapping

Spring Boot kullanarak Java, Kotlin ve Go (Gin) ile PostgreSQL entegrasyonu ve temel CRUD işlemlerini içeren bir ORM tabanlı uygulamanın nasıl kurulacağını öğrenin.

16 Aralık 20243 dk okuma
JavaKotlinGoSpring BootGinORM
Gin - İlk Uygulama
Programlama

Gin - İlk Uygulama

Sıfırdan ilk Golang Gin uygulamanızı oluşturmanıza yardımcı olacak, yeni başlayanlar için rehber. Temelleri öğrenin ve Gin ile yolculuğunuza başlayın.

14 Aralık 20243 dk okuma
GoGinBaşlangıç Rehberi
Spring Boot Configuration Properties
Programlama

Spring Boot Configuration Properties

@ConfigurationProperties ile tip-güvenli yapılandırma tanımlamayı, @Validated ile ayarları doğrulamayı ve profile-specific application-{profile}.yml dosyalarıyla ortama göre değer yönetimini öğrenin.

4 Şubat 20263 dk okuma
JavaKotlinSpring BootYapılandırma

Hakkımda

Spring Boot, mikroservis, güvenlik ve daha fazlası hakkında yazılar.

İletişimYeni başladıysan

Son yazılar

  • Captain Tsubasa 2: World Fighters
  • Captain Tsubasa: Rise of New Champions
  • Spring Boot Configuration Properties
  • Spring Boot GraphQL JWE Kimlik Doğrulama
  • Spring Boot JPA ile JWE Kimlik Doğrulaması

Popüler konular

JavaKotlinSpring BootGüvenlikJWEJWT

Abone ol

Yeni yazılar yayınlandığında pratik backend ve fullstack notlarını al.

Sosyal

© 2024-2026 Şuayb'in Blogu. Tüm hakları saklıdır.

🌟 Girdi Doğrulama Neden Önemlidir?

Doğrulama, API’nıza gönderilen verilerin beklenen formatlara uygun olmasını sağlayarak SQL Enjeksiyonu, XSS ve hatalı veri girişi gibi potansiyel güvenlik açıklarını engeller.


📋 Gereksinimler

Doğrulama katmanını uygulamadan önce şunların hazır olduğundan emin olun:

  • Spring Boot örnekleri için Java 17+
  • Gin örnekleri için Go 1.21+
  • Çalışan bir Spring Boot veya Gin başlangıç projesi
  • DTO, JSON payload ve HTTP durum kodları hakkında temel bilgi

🧪 Adım 1: Doğrulama Bağımlılıklarını Ekleyin

Bu bölümde Adım 1: Doğrulama Bağımlılıklarını Ekleyin konusunu netleştirip uygulamada kullanacağınız temel noktaları özetliyoruz.

Spring Boot Projeleri için:

Önce validation starter bağımlılığını ekleyerek anotasyon tabanlı doğrulama altyapısını aktif hale getirin.

  • Maven:
XMLpom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
  • Gradle:
GROOVYbuild.gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'

Gin Framework (Go) için:

Aşağıdaki örnek, Gin Framework (Go) için için pratik bir bağlam sunar ve doğrudan uygulanabilir.

BASH
# Gin frameworkünü yükleyin
go get -u github.com/gin-gonic/gin

# Doğrulama paketi ekleyin
go get -u github.com/go-playground/validator/v10

🧪 Adım 2: Doğrulama Kuralları ile Bir DTO Tanımlayın

Alanlara doğrulama kurallarını tanımlamak için anotasyonlar kullanın. Örnekler: @NotNull, @Size, @Pattern.


🧪 Adım 3: Doğrulama ile Bir Controller Oluşturun

Doğrulamayı REST endpoint’lerinize entegre edin.


🛠️ Adım 4: Hata Mesajlarını Yönetin

Hata mesajlarını daha kullanıcı dostu olacak şekilde düzelleyin.


main.go Örneği

Gin uygulaması için main.go dosyasının bir örneği:

GOmain.go
package main

import (
	"controller"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	r.POST("/api/todos", controller.CreateTodoHandler)

	r.Run() // Sunucu: http://localhost:8080
}

▶️ Adım 5: Uygulamayı Çalıştırın

Bu bölümde Adım 5: Uygulamayı Çalıştırın konusunu netleştirip uygulamada kullanacağınız temel noktaları özetliyoruz.

Spring Boot (Java/Kotlin): Spring Boot uygulamasını terminal veya IDE’nizden çalıştırın:

BASH
./mvnw spring-boot:run # Maven projeleri için
./gradlew bootRun       # Gradle projeleri için

API adresi: http://localhost:8080/api/todos

Gin (Go)

Go uygulamasını çalıştırın:

BASH
go run main.go

API adresi: http://localhost:8080/api/todos


🧪 cURL ile Test Etme

API’yı test etmek için cURL komutları:

  • Yeni Bir Görev Ekleme:
BASH
curl -X POST http://localhost:8080/api/todos \
-H "Content-Type: application/json" \
-d '{"title": "Yeni Görev", "completed": false}'
  • Tüm Görevleri Getirme:
BASH
curl -X GET http://localhost:8080/api/todos
  • Doğrulama Hatalarını Test Etme:

Geçersiz bir istek gönderin:

BASH
curl -X POST http://localhost:8080/api/todos \
-H "Content-Type: application/json" \
-d '{"title": ""}'

🏁 Sonuç

Artık REST API’lerde Girdi Doğrulama için üretim odaklı bir Spring Boot temeliniz var. Sonraki adımda ayarları kendi domainine uyarlayıp test ve gözlemlenebilirlik katmanını ekleyerek gerçek trafik altında doğrulayın.

JAVATodoRequest.java
package com.example.demo.dto;

import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;

@Data
public class TodoRequest {

    @NotNull(message = "Başlık zorunludur")
    @Size(min = 3, max = 50, message = "Başlık 3 ile 50 karakter arasında olmalıdır")
    private String title;

    private boolean completed;
}
KOTLINTodoRequest.kt
package com.example.demo.dto

import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size

data class TodoRequest(
    @field:NotNull(message = "Başlık zorunludur")
    @field:Size(min = 3, max = 50, message = "Başlık 3 ile 50 karakter arasında olmalıdır")
    val title: String?,

    val completed: Boolean = false
)
GOapp.go
package dto

import (
    "github.com/go-playground/validator/v10"
)

type TodoRequest struct {
    Title     string `validate:"required,min=3,max=50"`
    Completed bool   `validate:""`
}

var validate = validator.New()

func ValidateTodoRequest(todo TodoRequest) error {
    return validate.Struct(todo)
}
JAVATodoController.java
package com.example.demo.controller;

import com.example.demo.dto.TodoRequest;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/todos")
public class TodoController {

    @PostMapping
    public String createTodo(@Validated @RequestBody TodoRequest request) {
        return "Oluşturulan görev: " + request.getTitle();
    }
}
KOTLINTodoController.kt
package com.example.demo.controller

import com.example.demo.dto.TodoRequest
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/api/todos")
class TodoController {

    @PostMapping
    fun createTodo(@Validated @RequestBody request: TodoRequest): String {
        return "Oluşturulan görev: ${request.title}"
    }
}
GOapp.go
package controller

import (
    "dto"
    "github.com/gin-gonic/gin"
    "net/http"
)

func CreateTodoHandler(c *gin.Context) {
    var todo dto.TodoRequest

    if err := c.ShouldBindJSON(&todo); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    if err := dto.ValidateTodoRequest(todo); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    c.JSON(http.StatusOK, gin.H{"message": "Oluşturulan görev", "title": todo.Title})
}
JAVAGlobalExceptionHandler.java
package com.example.demo.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.MethodArgumentNotValidException;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> errors.put(error.getField(), error.getDefaultMessage()));
        return errors;
    }
}
KOTLINGlobalExceptionHandler.kt
package com.example.demo.exception

import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.RestControllerAdvice
import org.springframework.web.bind.MethodArgumentNotValidException

@RestControllerAdvice
class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException::class)
    fun handleValidationExceptions(ex: MethodArgumentNotValidException): Map<String, String> {
        return ex.bindingResult.fieldErrors.associate { it.field to it.defaultMessage.orEmpty() }
    }
}
GOapp.go
package middleware

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func ErrorHandler() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Next()

        if len(c.Errors) > 0 {
            c.JSON(http.StatusBadRequest, gin.H{"errors": c.Errors.JSON()})
        }
    }
}