如何在Google AppEngine Web App(Java)上设置/.well-known/assetlinks.json

时间:2016-10-12 16:05:07

标签: android google-app-engine web-applications applinks

我需要在AppEngine Web App中包含 .well-known / assetlinks.json 文件。必须按照此处https://developer.android.com/training/app-links/index.html

所述为我的Android应用启用应用链接

我在appengine-web.xml文件中添加了这一行

<static-files>
    <include path=".well-known/assetlinks.json"/>
</static-files>

问题在于它适用于本地

http://localhost:8384/.well-known/assetlinks.json

但不是在部署网络应用时,它返回 404错误

http://www.example.com/.well-known/assetlinks.json

我想这可能是一个安全限制,但我在Google云端平台控制台的任何地方都看了一眼,但我没有找到任何相关信息。

有人能解决这个问题吗? 谢谢

5 个答案:

答案 0 :(得分:1)

<static-files><mime-mapping>需要进入 appengine-web.xml ,而不是web.xml。请参阅文档&#39; appengine-web.xml Reference&#39;详情。

答案 1 :(得分:0)

在过去,我遇到过类似的东西,尽管有python运行时。

这通常发生在上传/部署应用引擎应用的过程中,无法准确猜出正确的MIME类型。该文件最终被部署为常规二进制文件application/octect(或根本没有?)。您可以从部署日志中确认是否属于这种情况。

如果是这样,您必须在json文件中为web.xml提供MIME type

<mime-mapping>
  <extension>json</extension>
  <mime-type>application/json</mime-type>
</mime-mapping>

答案 2 :(得分:0)

仍然,如所提到的页面所述,在“HTML.xml静态文件的类型”段落中,在web.xml中设置MIME类型关联:“默认情况下,静态文件使用基于文件扩展名。您可以使用元素将自定义MIME类型与web.xml中的静态文件的文件扩展名相关联。“

答案 3 :(得分:0)

AppEngine不喜欢目录名开头的.(我尝试在 appengine-web.xml 文件中使用几种组合,甚至使用<include path="**assetlinks.json" expiration="365d" />没有运气)。有趣的是,在开发服务器(Eclipse + Windows 10)上运行时,它运行良好。只有在部署它时,它才会失败。

解决方案是从目录中删除.,并创建一个读取它的servlet。然后在您的 web.xml 中,将servlet与.映射。如此处所述:https://stackoverflow.com/a/44023751/418057

答案 4 :(得分:-1)

好我自己找到了解决方案!

appengine-web.xml中的

使用此配置

<servlet>
    <servlet-name>Assetlinks</servlet-name>
    <servlet-class>api.servlets.WorkAroundHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Assetlinks</servlet-name>
    <url-pattern>/.well-known/assetlinks.json</url-pattern>
</servlet-mapping>

并创建一个扩展HttpServlet的类WorkAroundHttpServlet

public class WorkAroundHttpServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {

        if (!req.getRequestURI().startsWith("/.well-known/assetlinks.json"))
        {
            resp.sendError(404);
            return;
        }

            File file= new File(getServletContext().getRealPath("/") +  "/assetlinks.json");

            resp.setContentType("application/json");
            resp.getOutputStream().print(FileUtils.readFileToString(file, "utf-8")); 
    }
}