2 votes

Une page REST api sur le serveur de go pour retourner l'adresse MAC du système.

J'ai une application web basée sur PHP. Sur la page de connexion, elle fait un appel AJAX à un serveur Go (situé sur la machine du client) pour obtenir son adresse MAC. Voici le code du serveur Go :

paquet principal

import (
  "net"
  "net/http"
  "encoding/json"
)

//define struct for mac address json
type MacAddress struct {
    Id string
}

/**
 * Get device mac address
 */
func GetMacAddress(w http.ResponseWriter, r *http.Request) {

   w.Header().Set("Access-Control-Allow-Origin", "*")

   mac := &MacAddress{Id: ""}
   ifas, err := net.Interfaces()
   if err != nil {
       json.NewEncoder(w).Encode(mac)
       return
   }

   for _, ifa := range ifas {
       a := ifa.HardwareAddr.String()
       if a != "" {
           mac := &MacAddress{Id: a}
           json.NewEncoder(w).Encode(mac)
           break
       }
   }
   return
}

/**
 * Main function
 */
func main() {

  http.HandleFunc("/", GetMacAddress)
  if err := http.ListenAndServe(":8000", nil); err != nil {
    panic(err)
  }
}

Résultat :

{Id: "8c:16:45:5h:1e:0e"}

J'ai deux questions à vous poser.

Parfois, je reçois l'erreur

panic: listen tcp :8000: bind: address already in use

et je tue manuellement le processus. Alors, que peut-on améliorer dans mon code pour éviter cette erreur et fermer le serveur en cours d'exécution ?

Est-ce qu'un fichier Go compilé et autonome (créé sur ubuntu) peut être exécuté sur d'autres systèmes comme Windows ou linux ou mac sans avoir toutes les librairies Go et leur configuration ?

0voto

Daniel Schütte Points 369

Vous trouverez des informations sur la façon de compiler un programme Go pour différents systèmes d'exploitation. aquí . En bref, au lieu d'exécuter go build main.go , cours :

env GOARCH=amd64 GOOS=<target_OS> CGO_ENABLED=1 go build -v main.go

J'ai généralement un Makefile pour simplifier le processus de compilation croisée pour linux, Windows et macOS.

En ce qui concerne votre deuxième question, je ne peux reproduire votre erreur sur ma machine que lorsque j'essaie de ListenAndServe deux fois. Je soupçonne que pendant vos cycles de débogage, vous avez oublié de fermer un serveur en cours d'exécution tout en essayant de démarrer une nouvelle instance dans une autre fenêtre de terminal. Assurez-vous d'interrompre votre programme Go avec ctrl + c avant de l'exécuter à nouveau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X