我有一个gomobile
嵌入到webview
. 这个设置效果很好,我什至设法使用了 gorilla mux 路由器,但我pongo2
也想使用模板引擎,当我尝试解析我的模板 html 文件时遇到了问题。
我的./app/build.gradle
文件中有以下行:
android {
sourceSets {
main {
assets.srcDirs = ['assets']
}
}
}
我把我的 html 文件放在这里,我尝试在 index route: 上解析它./app/src/main/assets/views/index.html
。
func index(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
//res, err := http.Get("https://google.com")
res, err := http.Get("file:///android_asset/views/index.html")
if err != nil {
fmt.Fprintf(w, "could not execute: %v\n", err)
}
text, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
fmt.Fprintf(w, "could not execute: %v\n", err)
}
fmt.Fprintf(w, "%s", text)
}
此设置没有pongo2
渲染,仅用于更简单的示例。当我打开它时,从谷歌解析 html 文件并显示在应用程序中。但是当我尝试解析file:///android_asset/views/index.html
文件时,出现以下错误:
编辑:
我在 godoc 中发现了asset.Open,所以我修改了我的代码:
func index(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
a, err := asset.Open("views/index.html")
if err != nil {
fmt.Fprintf(w, "could not execute: %v\n", err)
}
defer a.Close()
fmt.Fprintf(w, "File contents: %s\n", a)
}
我仍然手动将我的模板文件复制到./app/src/main/assets/views/index.html
文件夹,但最终结果是一样的。
编辑2:
我意识到问题是当我将模板文件复制到./app/src/main/assets/views
文件夹中时,文件夹中没有任何文件./app/src/main/assets
(只有views
子文件夹),因此这些资产没有复制到 apk 中。所以现在我将我的文件直接复制到 assets 文件夹中,我的 index.html 位置是./app/src/main/assets/index.html
. 这样我的模板就会被复制到 apk 中......现在我得到了以下屏幕。我想我应该以某种方式解码文本:
嵌入单个html文件的解决方案:
我不得不使用ioutil.ReadAll
,因为asset.File
实现为以下接口:
type File interface {
io.ReadSeeker
io.Closer
}
所以我解析html文件的最终代码:
func index(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/html; charset=utf-8")
a, err := asset.Open("index.html")
if err != nil {
fmt.Fprintf(w, "could not execute: %v\n", err)
}
defer a.Close()
b, err := ioutil.ReadAll(a)
if err != nil {
fmt.Fprintf(w, "could not execute: %v\n", err)
}
fmt.Fprintf(w, "File contents: %s\n", b)
}
结果:
但是,这仍然没有解决为什么引用文件file:///android_asset/views/index.html
不起作用,这对于像 css/js 这样的静态文件是必需的,所以问题仍然存在。也许从java代码提供资产?