Ontwikkel een RESTful API in Go met JSON Verwerking
description
Met deze prompt kan de gebruiker een RESTful API bouwen die JSON efficiënt verwerkt in Go, waardoor ze moderne webservice-interfaces kunnen maken. Dit lost problemen op rond data-uitwisseling en API-ontwerp in Go, en is handiger dan algemene API prompts doordat het specifiek ingaat op JSON verwerking en web frameworks.
prompt
try_prompt
Help me bij het ontwerpen en implementeren van een RESTful API in Go die JSON-verzoeken kan ontvangen en verwerken. Leg uit hoe ik endpoints definieer, JSON payloads parseer en v ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een overzicht en een voorbeeld van hoe je een RESTful API in Go kunt ontwerpen en implementeren met de standaard `net/http` bibliotheek:
1. Endpoints definiëren:
- Gebruik `http.HandleFunc()` om URL-paden te koppelen aan handler functies.
- Elke handler fungeert als endpoint voor een specifieke resource of actie.
2. JSON payloads parsen en valideren:
- Lees de HTTP request body met `json.NewDecoder()`.
- Decodeer naar een struct die je hebt gedefinieerd.
- Valideer de velden (bijvoorbeeld op leegte of formaat).
3. Antwoorden met JSON:
- Stel de juiste headers in (`Content-Type: application/json`).
- Gebruik `json.NewEncoder(w).Encode()` om JSON te sturen.
### Voorbeeld
```go
package main
import (
"encoding/json"
"log"
"net/http"
)
// Defineer een struct voor de JSON payload
type User struct {
Naam string `json:"naam"`
Email string `json:"email"`
}
// Handler voor het ontvangen van gebruikersgegevens
func userHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method niet toegestaan", http.StatusMethodNotAllowed)
return
}
// Parseer JSON payload
var user User
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&user)
if err != nil {
http.Error(w, "Ongeldige JSON", http.StatusBadRequest)
return
}
// Valideer data
if user.Naam == "" || user.Email == "" {
http.Error(w, "Naam en email zijn verplicht", http.StatusBadRequest)
return
}
// Verwerk data (bijvoorbeeld opslaan in database)
// ...
// Stuur een JSON antwoord terug
w.Header().Set("Content-Type", "application/json")
response := map[string]string{
"status": "success",
"bericht": "Gebruiker ontvangen",
}
json.NewEncoder(w).Encode(response)
}
func main() {
// Defineer endpoint
http.HandleFunc("/api/gebruiker", userHandler)
// Start de server
log.Println("Server gestart op :8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err)
}
}
```
### Samenvatting
- **Endpoints definiëren:** met `http.HandleFunc()` en URL-paden.
- **JSON parsen:** met `json.NewDecoder()` en `Decode()`.
- **Valideren:** controleer verplichte velden en formaat.
- **Antwoord sturen:** met `json.NewEncoder(w).Encode()` en juiste headers.
Wil je hulp bij meer endpoints, authenticatie of geavanceerdere validatie?
provider: deepseek
model: deepseek-chat
Zeker, ik help je stap voor stap met het bouwen van een RESTful API in Go met het `net/http` package.
## 1. Basisopzet en HTTP Server
```go
package main
import (
"encoding/json"
"log"
"net/http"
"strconv"
"github.com/gorilla/mux" // Optioneel: voor routing
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
var users []User
func main() {
// Basis routing met net/http
http.HandleFunc("/users", usersHandler)
http.HandleFunc("/users/", userHandler)
log.Println("Server gestart op poort 8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
```
## 2. Endpoints Definiëren
### Basis endpoints zonder external packages:
```go
func usersHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
switch r.Method {
case "GET":
getUsers(w, r)
case "POST":
createUser(w, r)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
}
func userHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
switch r.Method {
case "GET":
getUser(w, r)
case "PUT":
updateUser(w, r)
case "DELETE":
deleteUser(w, r)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
}
```
### Met gorilla/mux (aanbevolen voor betere routing):
```go
import "github.com/gorilla/mux"
func main() {
router := mux.NewRouter()
router.HandleFunc("/users", getUsers).Methods("GET")
router.HandleFunc("/users", createUser).Methods("POST")
router.HandleFunc("/users/{id}", getUser).Methods("GET")
router.HandleFunc("/users/{id}", updateUser).Methods("PUT")
router.HandleFunc("/users/{id}", deleteUser).Methods("DELETE")
log.Fatal(http.ListenAndServe(":8080", router))
}
```
## 3. JSON Parsen en Valideren
```go
func createUser(w http.ResponseWriter, r *http.Request) {
var user User
// JSON body parsen
decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&user); err != nil {
http.Error(w, "Ongeldig JSON formaat", http.StatusBadRequest)
return
}
defer r.Body.Close()
// Validatie
if user.Name == "" {
http.Error(w, "Naam is verplicht", http.StatusBadRequest)
return
}
if user.Email == "" {
http.Error(w, "Email is verplicht", http.StatusBadRequest)
return
}
// Business logica
user.ID = len(users) + 1
users = append(users, user)
// Response sturen
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(user)
}
```
## 4. Complete CRUD Operations
```go
func getUsers(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(users)
}
func getUser(w http.ResponseWriter, r *http.Request) {
// ID uit URL halen
id, err := strconv.Atoi(mux.Vars(r)["id"])
if err != nil {
http.Error(w, "Ongeldig ID", http.StatusBadRequest)
return
}
// User zoeken
for _, user := range users {
if user.ID == id {
json.NewEncoder(w).Encode(user)
return
}
}
http.Error(w, "User niet gevonden", http.StatusNotFound)
}
func updateUser(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(mux.Vars(r)["id"])
if err != nil {
http.Error(w, "Ongeldig ID", http.StatusBadRequest)
return
}
var updatedUser User
decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&updatedUser); err != nil {
http.Error(w, "Ongeldig JSON formaat", http.StatusBadRequest)
return
}
defer r.Body.Close()
// User zoeken en updaten
for i, user := range users {
if user.ID == id {
users[i].Name = updatedUser.Name
users[i].Email = updatedUser.Email
json.NewEncoder(w).Encode(users[i])
return
}
}
http.Error(w, "User niet gevonden", http.StatusNotFound)
}
func deleteUser(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(mux.Vars(r)["id"])
if err != nil {
http.Error(w, "Ongeldig ID", http.StatusBadRequest)
return
}
for i, user := range users {
if user.ID == id {
users = append(users[:i], users[i+1:]...)
w.WriteHeader(http.StatusNoContent)
return
}
}
http.Error(w, "User niet gevonden", http.StatusNotFound)
}
```
## 5. Verbeterde Validatie met Custom Struct
```go
type CreateUserRequest struct {
Name string `json:"name" validate:"required,min=2"`
Email string `json:"email" validate:"required,email"`
}
func validateUserRequest(w http.ResponseWriter, r *http.Request) (*CreateUserRequest, error) {
var req CreateUserRequest
decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&req); err != nil {
return nil, err
}
defer r.Body.Close()
// Simpele validatie
if req.Name == "" || len(req.Name) < 2 {
return nil, fmt.Errorf("Naam moet minimaal 2 karakters bevatten")
}
if req.Email == "" || !strings.Contains(req.Email, "@") {
return nil, fmt.Errorf("Ongeldig email formaat")
}
return &req, nil
}
```
## 6. Middleware voor Error Handling
```go
func jsonResponse(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
next(w, r)
}
}
func main() {
router := mux.NewRouter()
// Middleware toepassen
router.HandleFunc("/users", jsonResponse(getUsers)).Methods("GET")
router.HandleFunc("/users", jsonResponse(createUser)).Methods("POST")
log.Fatal(http.ListenAndServe(":8080", router))
}
```
## 7. go.mod Bestand
```mod
module mijn-api
go 1.21
require github.com/gorilla/mux v1.8.0
```
## Gebruiksvoorbeeld:
**POST /users**
```json
{
"name": "Jan Jansen",
"email": "jan@voorbeeld.nl"
}
```
**Response:**
```json
{
"id": 1,
"name": "Jan Jansen",
"email": "jan@voorbeeld.nl"
}
```
Dit geeft je een solide basis voor een RESTful API in Go. Voor productie gebruik zou je overwegen:
- Database integratie (PostgreSQL, MySQL)
- JWT authenticatie
- Betere validatie library (zoals go-playground/validator)
- Logging middleware
- Error handling verbeteringen

