尝试使用URL呈现HTML模板。问题是URL中包含(),并且这些字符被转义。
我尝试使用template.URL("http://myurl.com/(data)/aaa.jpg")
和template.HTML("http://myurl.com/(data)/aaa.jpg")
,但仍然会使用括号。
我正在使用gin gonic。
router.GET("/test", func(c *gin.Context) {
c.HTML(http.StatusOK, "test.tmpl", gin.H{
"url": template.URL("http://myurl.com/(data)/aaa.jpg"),
// "url": template.HTML("http://myurl.com/(data)/aaa.jpg"),
})
模板文件:
<div>
<img src="{{.url}}" />
</div>
最终输出:
<div>
<img src="http://myurl.com/%28data%29/aaa.jpg"/>
</div>
答案 0 :(得分:0)
使用值template.URL
就足够了。
您看到的是不给定网址的HTML编码,您看到的是(data)
部分中的左右括号的网址编码。那是完全可以的。 %28
是'('
的编码(28是左括号字符的六进制代码),%29
是')'
字符。
网址http://myurl.com/(data)/aaa.jpg
和http://myurl.com/%28data%29/aaa.jpg
是同一个。
URL编码的目的是使URL中包含的URL和值(例如表单参数)可以安全地传输。
网址编码
只能使用ASCII字符集通过Internet发送URL。
由于URL通常包含ASCII集之外的字符,因此必须将URL转换为有效的ASCII格式。
URL编码用“%”后跟两个十六进制数字替换不安全的ASCII字符。 网址不能包含空格。 URL编码通常用加号(+)或%20替换空格。
您可以在此处详细了解网址编码:HTML URL Encoding Reference。
测试它:
func rh(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, `<html><body>
<img src="http://localhost:8080/(data)/aaa.jpg">
<img src="http://localhost:8080/%28data%29/aaa.jpg">
</body></htm>`)
}
func imgh(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "aaa.jpg")
}
func main() {
http.HandleFunc("/", rh)
http.HandleFunc("/(data)/aaa.jpg", imgh)
panic(http.ListenAndServe("localhost:8080", nil))
}
现在将您的浏览器定向到http://localhost:8080
。它将显示2张图像。