Maison développement back-end Golang Comment l'API RESTful est-elle implémentée dans le langage Go ?

Comment l'API RESTful est-elle implémentée dans le langage Go ?

Jun 10, 2023 pm 06:40 PM
go语言 实现方式 restful api

Avec le développement d'Internet et des applications mobiles, l'API RESTful est devenue un style de conception d'interface populaire. Parce qu'elle est simple, évolutive et efficace, de plus en plus d'entreprises et de développeurs choisissent l'API RESTful comme interface pour leurs applications. Dans le langage Go, il est très courant d'implémenter des API RESTful. Cet article présentera l'implémentation de l'API RESTful en langage Go et quelques bonnes pratiques.

1. Qu'est-ce que l'API RESTful ?

L'API RESTful est une interface de service Web basée sur l'architecture REST (Representational State Transfer). Il utilise le protocole HTTP pour la communication et implémente les opérations CRUD (créer, lire, mettre à jour, supprimer) sur les ressources du serveur via diverses méthodes HTTP. Ces méthodes HTTP incluent GET, POST, PUT, DELETE, etc. L'API RESTful met l'accent sur l'identification des ressources et la conversion d'état. Chaque ressource possède un URI (Uniform Resource Identifier) ​​​​​​unique pour identifier la ressource et utilise des méthodes HTTP pour convertir son état.

2. Étapes de base pour implémenter l'API RESTful en langage Go

1. Installez les bibliothèques nécessaires

L'implémentation de l'API RESTful en langage Go nécessite l'utilisation de certains packages courants, tels que net/http, encoding/json, etc. L'installation de ces bibliothèques est très simple, il suffit d'exécuter la commande suivante dans le terminal :

go get -u github.com/gorilla/mux
go get -u github.com/rs/cors
Copier après la connexion

Parmi elles, la bibliothèque gorilla/mux est l'un des routeurs de requêtes HTTP les plus populaires dans le langage Go, qui fournit de puissantes fonctions de routage HTTP. La bibliothèque rs/cors vous permet de gérer facilement le partage de ressources cross-origin (CORS).

2. Créer des routes API RESTful

En langage Go, nous pouvons utiliser le package mux pour créer des routes API RESTful. Tout d’abord, nous devons importer le package mux, puis définir un nouveau routeur. Ensuite, nous pouvons utiliser la méthode HandleFunc du routeur pour mapper différentes méthodes HTTP et chemins de routage aux fonctions du gestionnaire. Par exemple, voici un exemple simple d'implémentation d'une API RESTful :

package main

import (
 "encoding/json"
 "log"
 "net/http"
 "github.com/gorilla/mux"
 "github.com/rs/cors"
)

type Book struct {
 ID    string  `json:"id"`
 Title string  `json:"title"`
}

var books []Book

func main() {
 router := mux.NewRouter()

 // Get all books
 router.HandleFunc("/books", getBooks).Methods("GET")

 // Get a book by ID
 router.HandleFunc("/books/{id}", getBook).Methods("GET")

 // Add a book
 router.HandleFunc("/books", addBook).Methods("POST")

 // Update a book
 router.HandleFunc("/books/{id}", updateBook).Methods("PUT")

 // Delete a book
 router.HandleFunc("/books/{id}", deleteBook).Methods("DELETE")

 handler := cors.Default().Handler(router)

 log.Fatal(http.ListenAndServe(":8080", handler))
}

func getBooks(w http.ResponseWriter, r *http.Request) {
 json.NewEncoder(w).Encode(books)
}

func getBook(w http.ResponseWriter, r *http.Request) {
 params := mux.Vars(r)
 for _, item := range books {
  if item.ID == params["id"] {
   json.NewEncoder(w).Encode(item)
   return
  }
 }
 json.NewEncoder(w).Encode(&Book{})
}

func addBook(w http.ResponseWriter, r *http.Request) {
 var book Book
 _ = json.NewDecoder(r.Body).Decode(&book)
 books = append(books, book)
 json.NewEncoder(w).Encode(book)
}

func updateBook(w http.ResponseWriter, r *http.Request) {
 params := mux.Vars(r)
 for index, item := range books {
  if item.ID == params["id"] {
   books[index].Title = params["title"]
   json.NewEncoder(w).Encode(books[index])
   return
  }
 }
 json.NewEncoder(w).Encode(books)
}

func deleteBook(w http.ResponseWriter, r *http.Request) {
 params := mux.Vars(r)
 for index, item := range books {
  if item.ID == params["id"] {
   books = append(books[:index], books[index+1:]...)
   break
  }
 }
 json.NewEncoder(w).Encode(books)
}
Copier après la connexion

Dans le code ci-dessus, nous définissons une structure Book et un tableau books. Nous utilisons mux.NewRouter() pour créer un nouveau routeur et utilisons la méthode router.HandleFunc() pour mapper les méthodes HTTP et les chemins de routage aux fonctions du gestionnaire d'API RESTful. Par exemple, la fonction getBooks() gère la requête GET /books et encode le tableau books via json.NewEncoder() et l'écrit dans ResponseWriter.

Dans la fonction main(), nous utilisons également la méthode cors.Default().Handler() pour créer un nouveau gestionnaire CORS, et utilisons la méthode http.ListenAndServe() pour démarrer le service API RESTful, en écoutant par défaut port 8080.

3. Utilisez le modèle d'objet de transfert (DTO)

Dans la conception de l'API RESTful, nous devons définir un objet de transfert (DTO), qui est une structure de données simple utilisée pour transférer des données entre le client et le serveur. En langage Go, nous pouvons utiliser la structure (struct) comme DTO. Chaque structure représente un type de données et contient des champs à envoyer au client. Par exemple, le code suivant définit une structure Utilisateur :

type User struct {
 ID       int    `json:"id"`
 Name     string `json:"name"`
 Email    string `json:"email"`
 Password string `json:"-"`
}
Copier après la connexion

Dans le code ci-dessus, nous définissons une structure Utilisateur, qui contient les champs ID, Nom, Email et Mot de passe. Nous utilisons la balise json pour convertir les champs de structure au format JSON. Notez que nous utilisons l'indicateur "-" pour ignorer le champ Mot de passe et éviter de transmettre le mot de passe en texte clair au client.

4. Utilisez HTTPS pour protéger l'API RESTful

Étant donné que l'API RESTful communique via le protocole HTTP, sa sécurité peut être affectée. Afin d'assurer la sécurité de l'API RESTful, nous pouvons utiliser le protocole HTTPS (HTTP Secure) pour protéger le contenu de la communication. Le protocole HTTPS utilise la technologie de cryptage SSL (Secure Socket Layer) ou TLS (Transport Layer Security) pour assurer la sécurité des requêtes et réponses HTTP.

En langage Go, nous pouvons utiliser le package net/http et le package crypto/tls pour prendre en charge HTTPS. Par exemple, le code ci-dessous montre comment créer un serveur HTTPS avec un certificat auto-signé :

package main

import (
 "log"
 "net/http"
 "crypto/tls"
)

func main() {
 mux := http.NewServeMux()

 // Define HTTP routes

 // Create self-signed certificate
 cert, err := tls.LoadX509KeyPair("cert.pem", "key.pem")
 if err != nil {
  log.Fatal(err)
 }

 // Create HTTPS server
 server := &http.Server{
  Addr: ":8443",
  TLSConfig: &tls.Config{
   Certificates: []tls.Certificate{cert},
  },
 }

 // Start HTTPS server
 log.Fatal(server.ListenAndServeTLS("", ""))
}
Copier après la connexion

Dans le code ci-dessus, nous créons un nouveau routeur HTTP en utilisant http.NewServeMux() puis chargeons le certificat auto-signé en utilisant tls .LoadX509KeyPair() . Enfin, nous démarrons le serveur HTTPS à l'aide de la méthode http.Server.ListenAndServeTLS() et transmettons la configuration du certificat à TLSConfig.

5. Utilisez JWT pour protéger l'API RESTful

Lors du développement d'une API RESTful, nous devons également protéger l'API pour garantir que seuls les utilisateurs autorisés peuvent y accéder. Une approche courante consiste à utiliser JWT (JSON Web Token) pour l'authentification et l'autorisation.

En langage Go, nous pouvons utiliser le package jwt-go pour générer et vérifier JWT. Par exemple, le code suivant montre comment créer et valider un JWT à l'aide du package jwt-go :

package main

import (
 "fmt"
 "time"
 "github.com/dgrijalva/jwt-go"
)

func main() {
 // Define a claim
 claim := jwt.MapClaims{
  "user_id": 1234,
  "iss": "myapp",
  "exp": time.Now().Add(time.Hour * 24).Unix(),
 }

 // Create a new JWT
 token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)

 // Sign the JWT using a secret key
 secret := []byte("mysecret")
 signedToken, err := token.SignedString(secret)
 if err != nil {
  fmt.Println(err)
 }

 fmt.Println("JWT:", signedToken)

 // Verify the JWT
 token, err = jwt.Parse(signedToken, func(token *jwt.Token) (interface{}, error) {
  if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
   return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
  }

  return secret, nil
 })

 if err != nil {
  fmt.Println(err)
 }

 if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
  fmt.Println("JWT claims:", claims)
 } else {
  fmt.Println("Invalid JWT")
 }
}
Copier après la connexion

Dans le code ci-dessus, nous avons défini une variable MapClaims sous forme de déclaration. Cela correspond à la charge utile JSON du JWT, qui peut contenir des paires clé-valeur arbitraires. Nous fixons le délai d'expiration du JWT à 24 heures. Nous créons ensuite un nouveau JWT à l'aide de la méthode jwt.NewWithClaims() et spécifions l'algorithme de signature à l'aide de jwt.SigningMethodHS256. Ensuite, nous signons le JWT avec la clé secrète en utilisant la méthode jwt.Token.SignedString().

Lors de la vérification du JWT, nous utilisons la méthode jwt.Parse() pour analyser le JWT et spécifions une fonction de rappel pour vérifier la signature du JWT. La fonction de rappel doit renvoyer une valeur de type interface{} qui représente la clé utilisée pour signer le JWT. Dans le code ci-dessus, nous utilisons une clé codée en dur, mais nous stockons généralement la clé dans un emplacement sûr et la définissons via une variable d'environnement ou un fichier de configuration.

6.Conclusion

Dans cet article, nous présentons les étapes de base pour implémenter l'API RESTful en langage Go. Nous utilisons le package mux pour créer un routeur et mapper les méthodes HTTP et les chemins de routage aux gestionnaires d'API RESTful. Nous couvrons également les mesures de sécurité telles que JWT et HTTPS pour protéger les API RESTful. Enfin, nous soulignons également l’importance d’utiliser le modèle d’objet de transport pour simplifier la conception et la mise en œuvre des API RESTful.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Quelle est la différence entre la structure de définition des mots clés `var` et« type »dans le langage Go? Apr 02, 2025 pm 12:57 PM

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Apr 02, 2025 pm 02:03 PM

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Pourquoi est-il nécessaire de passer des pointeurs lors de l'utilisation de bibliothèques Go et Viper? Pourquoi est-il nécessaire de passer des pointeurs lors de l'utilisation de bibliothèques Go et Viper? Apr 02, 2025 pm 04:00 PM

GO POINTER SYNTAXE ET ATTENDRE DES PROBLÈMES DANS LA BIBLIOTHÈQUE VIPER Lors de la programmation en langage Go, il est crucial de comprendre la syntaxe et l'utilisation des pointeurs, en particulier dans ...

See all articles