TL; DR
你只提供根HTML頁面,則需要到請求到其他資源過於迴應(你可以通過* http.Request變量的URL變量來查看正在請求的資源)
當提供資源時,您需要編寫Header Content-Type
讓瀏覽器知道什麼是
你在做什麼在你的請求處理程序越來越http://www.meaningfultype.com/
,HTML頁面,然後在瀏覽器發現的資源(如image/png
)
完整的答案的類型像/images/header-logo.png
圖像,並提出請求,但您的localhost服務器不知道如何迴應http://localhost/images/header-logo.png
。
假設你的處理函數是在服務器("/"
)的根處理請求,你可以得到所請求的URL r.URL
,並用它來獲得所需的資源:
url := "http://www.meaningfultype.com/"
if r.URL.Host == "" {
url += r.URL.String()
} else {
url = r.URL.String()
}
res, err := http.Get(url)
的問題是,即使完成此操作後,所有資源將以plain/text
發送,因爲您未設置標題的Content-Type
。這就是爲什麼你需要在寫入之前指定資源的類型。爲了知道什麼資源的類型,只是從在http.Get
響應報頭中的Content-Type
您剛剛收到獲得它:
contentType := res.Header.Get("Content-Type")
w.Header().Set("Content-Type", contentType)
w.Write(robots)
最終結果:
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)
}
由於它的工作爲了我。 –
如果在示例中給出的URL不能修復,如何管理它。我想給任何URL在瀏覽器等給出波紋管: 的http://本地主機:8080/fastor/TTP://www.meaningfultype.com/ –
你只需要到'url'變量設置爲正確的值。變量'r.URL'包含用戶請求的URL(在本例中爲http:// localhost:8080/fastor/http://www.meaningfultype.com/),所以你只需要移除http:// localhost:8080/fastor /',並使用剩餘的字符串作爲url的值,但請記住,雙斜線將被一個斜線替換,因此路徑中的URL將變爲http:/www.meaningfultype。 com'不要將路徑包含在路徑中並手動添加到字符串中可能會更好。 – raulsntos