1

我有一个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代码提供资产?

4

0 回答 0