Golang HTTP (Webserver) erstellen

B

BloodSteam

Guest
Hallo,
Ich hab Probleme einen Webserver zu erstellen (Windows10 Lokal).

So sehen meine Folder aus:
Code:
/
  app.go
  /public
    index.html
    favicon.ico
    /js
      script.js 
    /css
      style.css

Es ladet die index.html aber nicht die CSS oder JS Dateien und in der Console (Chrome) steht dann:
Code:
Uncaught SyntaxError: Unexpected token <

Code:
package main

import (
    "io/ioutil"
    "net/http"
)


func main() {
    http.Handle("/", new(MyHandler))
    http.ListenAndServe(":3000", nil)
}


type MyHandler struct {
    http.Handler
}


func (this *MyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    path := "public/index.html" // + req.URL.Path
    data, err := ioutil.ReadFile(string(path))


    if err == nil {
        w.Write(data)
    } else {
        w.WriteHeader(404)
        w.Write([]byte("404 - " + http.StatusText(404)))
    }
}
 
Manche denken dass Ich hier sofort schreibe ohne irgendwas zu suchen. Gestern 13h in google verbracht, heute seit 10 Uhr (jetzt ist es 14Uhr) und weiß immer noch nicht wieso CSS und JS nicht funktioniert. Es ladet die HTML aber keine CSS oder JS.
Die 3 Seiten in google unter "Server static css javascript files" hab Ich schon durch und nichts.
 
Das liegt daran, das du auch nur die index.html lädst. Du linkst die Datei in der ersten Zeile der Funktion ServeHTTP statisch. Dadurch kann der Server auch nur eine Datei ausliefern. Du musst schon die Ressource, die angefragt wird, über die HTTP Header Parameter ermitteln. Wird keine Datei direkt angefragt, dann lieferst du die index.html aus. Ansonsten lieferst du die Datei aus, die angefragt wurde. Wenn du eine CSS-Datei oder eine JS-Datei auf deiner Seite einbindest, macht der Browser nichts anderes damit, als würdest du die Adresse dieser Dateien selbst direkt aufrufen.

Ein normaler Webserver wie Apache, NGinx oder Lighttpd arbeiten da alle gleich. Jedes HTML, jedes Script, jedes CSS und jedes Bild wird über eigene Requests angefordert. Der Server wertet die Kopfdaten der Anfrage aus und ermittelt darüber den Pfad zur angefragten Ressource. Und dann kann der Server zurückliefern. Du lieferst aber nur die index.html statisch aus.

Aber wie das mit Go funktioniert, kann ich dir nicht sagen. Aber die Webserver machen im Grunde immer das gleiche.

Kleiner Hinweis: Dadurch, das du den Server selbst programmierst, musst du dich auch um die SSL/TLS Geschichten kümmern. Da solltest du dir auch Gedanken machen. Ich empfehle das Vorschalten eines etablierten Servers als Reverse-Proxy.
 
Kleiner Hinweis: Dadurch, das du den Server selbst programmierst, musst du dich auch um die SSL/TLS Geschichten kümmern..
Nicht nur darum. Das ganze Fehlerhandling, Header incl. Cookies, Komprimierung ... Die Liste ist unendlich. Und das Ganze noch getestet, bugfrei und nicht angreifbar. Oder Kurz: lass es.
Ich würde es so machen, wie DataDino es beschriben hast: nginx als reverse Proxy vorschalten, der sich um die statischen Assets, Verschlüsselung etc. kümmert und meine Go Anwendung, die sich um die dynamischen Inhalte kümmert. Wenn umbedingt es in Go sein muss, dann wenigstens eine robuste Bibliothek.
 
Zurück