TL; DR
Sie werden nur dazu dienen, die Root-HTML-Seite, müssen Sie auch auf Anfragen zu anderen Ressourcen reagieren (Sie können Sehen Sie, welche Ressource mit der URL-Variablen der * http.Request-Variable angefordert wird.
Wenn Sie die Ressourcen bereitstellen, müssen Sie die Headers schreiben Content-Type
der Browser wissen zu lassen, was die Art der Ressource ist (wie image/png
)
Voll Antwort
Was Sie in Ihrer Anfrage-Handler tun http://www.meaningfultype.com/
wird immer, die HTML-Seite, dann wird der Browser eine findet Bild wie /images/header-logo.png
und macht die Anfrage, es zu bekommen, aber Ihr Server in localhost weiß nicht, wie man auf http://localhost/images/header-logo.png
reagiert.
Angenommen, Ihre Handler Funktionsanforderungen an die Wurzel des Servers ("/"
) ist der Umgang, könnten Sie die angeforderte URL r.URL
bekommen und es verwenden, um die erforderliche Ressource zu erhalten:
url := "http://www.meaningfultype.com/"
if r.URL.Host == "" {
url += r.URL.String()
} else {
url = r.URL.String()
}
res, err := http.Get(url)
Das Problem ist, dass selbst Danach werden alle Ressourcen als plain/text
gesendet, da Sie nicht die des Headers festlegen. Aus diesem Grund müssen Sie vor dem Schreiben den Typ der Ressource angeben.Um zu wissen, was die Art der Ressource ist, ist es nur bekommen vom Content-Type
Sie nur in der Kopfzeile der Antwort von http.Get
erhalten:
contentType := res.Header.Get("Content-Type")
w.Header().Set("Content-Type", contentType)
w.Write(robots)
Das Endergebnis:
package main
import (
"io/ioutil"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", factHandler)
http.ListenAndServe(":8080", nil)
}
func factHandler(w http.ResponseWriter, r *http.Request) {
url := "http://www.meaningfultype.com/"
if r.URL.Host == "" {
url += r.URL.String()
} else {
url = r.URL.String()
}
res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
robots, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
log.Fatal(err)
}
contentType := res.Header.Get("Content-Type")
w.Header().Set("Content-Type", contentType)
w.Write(robots)
}
Dank es funktionierte für mich. –
wie man es verwaltet, wenn url gegeben in dem Beispiel nicht fix.e.g. Ich möchte jede URL im Browser geben wie unten angegeben: http: // localhost: 8080/fastor/ttp: //www.meaningfultype.com/ –
Sie müssen nur die 'url' Variable auf den richtigen Wert setzen. Die Variable "r.URL" enthält die URL, die der Benutzer angefordert hat (in diesem Fall http: // localhost: 8080/fastor/http: //www.meaningfultype.com/). Sie müssen also einfach "http: //" entfernen. localhost: 8080/fastor/'und benutze den Rest des Strings als Wert für' url', aber beachte, dass doppelte Schrägstriche durch einen Schrägstrich ersetzt werden, so dass die URL im Pfad 'http: /www.meaningfultype' wird. com es ist besser, das Schema nicht in den Pfad aufzunehmen und es manuell zur Zeichenkette hinzuzufügen. – raulsntos