我有一个嵌入gomobile
的{{1}}原生Android应用。这个设置工作得很好,我甚至设法使用gorilla mux路由器,但我也想使用webview
模板引擎,当我尝试解析模板html文件时遇到问题。
我的pongo2
文件中有以下行:
./app/build.gradle
我将我的html文件放在这里,我尝试在索引路径上解析:android {
sourceSets {
main {
assets.srcDirs = ['assets']
}
}
}
。
./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)
}
渲染,仅用于更简单的示例。从谷歌解析html文件工作,并在我打开它时显示在应用程序中。但是当我尝试解析pongo2
文件时,我收到以下错误:
修改
我在godoc中发现asset.Open,所以我修改了我的代码:
file:///android_asset/views/index.html
我仍然手动将我的模板文件复制到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)
}
文件夹,但最终结果是一样的。
EDIT2:
我意识到问题是当我将模板文件复制到./app/src/main/assets/views/index.html
文件夹时,./app/src/main/assets/views
文件夹中没有任何文件(只有./app/src/main/assets
子文件夹),因此这些由于资产没有复制到apk中。所以现在我直接在assets文件夹中复制我的文件,我的index.html位置是views
。这样我的模板就会被复制到apk中......现在我得到了以下屏幕。我想我应该以某种方式解码文本:
嵌入单个html文件的解决方案:
我必须使用./app/src/main/assets/index.html
,因为ioutil.ReadAll
已实现为以下界面:
asset.File
所以解析html文件的最终代码是:
type File interface {
io.ReadSeeker
io.Closer
}
由此产生的结果:
但是,这仍然无法解决为什么引用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)
}
无法正常工作的文件,这对于像css / js这样的静态文件是必需的,所以问题仍然存在。也许从java代码服务资产?