我们有一个AppEngine应用程序,我们希望与Google端点一起使用。我们需要支持Web客户端以及移动客户端,这使得Endpoints对我们很有吸引力,因为我们可以轻松生成Android和iOS客户端API。
问题是目前的云端点 不支持自定义域,因此我们的Web客户端无法直接与端点通信(移动客户端没有此问题)。
这是我们已经尝试过的:
CORS请求从客户端到appspot.com域。这个问题是因为我们的请求不符合简单CORS(自定义标头,cookie等)的要求,每次请求都必须发送预检请求,这会减慢一切
客户端向我们的自定义域发出请求,而后者又向appspot端点发出请求。同样,额外的请求对性能不利
我们还尝试为Web客户端设置一个重复的Jersey REST API。我们对所有方法进行双重注释(一次针对Cloud Endpoints,一次针对Jersey),Web客户端访问Jersey API,移动客户端访问Endpoints API。这很好用,除了Jersey和Endpoints使用不同的例外。因此,如果我们想抛出一个404端点异常,那将会破坏Jersey响应,反之亦然。
还有其他选择吗?我们希望利用端点的强大功能来生成移动客户端,同时也可以绕过Web客户端的自定义域限制。
Google Cloud Endpoints 2.0现在支持自定义域。如果您使用的是Google Cloud Endpoints 1.0,则可以执行以下操作进行迁移:
更新您的依赖项以使用新工件。在Maven,这看起来
如下所示:
com.google.endpoints endpoints-framework 2.0.0-beta.8
删除遗留依赖项,即appengine-endpoints工件。
更新项目web.xml文件中的API入口点:
- 将所有出现的SystemServiceServlet重命名为EndpointsServlet。
- 将路径/ _ah / spi / *的所有出现替换为新的所需路径/ _ah / api / *
看到:
https://cloud.google.com/appengine/docs/java/endpoints/migrating
https://code.google.com/p/googleappengine/issues/detail?id=9384
我们最终完全放弃了Cloud Endpoints,而是选择了纯粹的Jersey REST API。
为了满足我们为API生成移动客户端的需求,我们用API注释了我们的API 昂首阔步。作为额外的奖励,Swagger似乎支持比Cloud Endpoints更多的客户端生成,并且如果不直接支持目标语言,也可以相对容易地从模板设置自己的客户端生成。
Jersey + Swagger并不像Cloud Endpoints那样容易设置,但它更易于定制,并且允许我们绕过Cloud Endpoints强加的自定义域限制。
最简单的解决方案是使用反向代理。
例如,如果您的应用程序是 http://myapp.appspot.com,创建简单的html页面 http://myapp.com 并重定向到 http://myapp.appspot.com 使用javascript。
Index.html上 http://myapp.com。
<html>
<head>
<script>
windows.location = http://myapp.appspot.com;
</script>
</head>
<body></body>
</html>
它还有一个优点:如果您将代理页面放在另一个托管(而不是appspot.com)您的应用程序上( http://myapp.appspot.com )将从中国访问。