Cloud Endpoints自定义域解决方法

时间:2014-02-11 16:25:45

标签: java google-app-engine google-cloud-endpoints

我们有一个AppEngine应用程序,我们希望与Google端点一起使用。我们需要支持Web客户端和移动客户端,这使得Endpoints对我们很有吸引力,因为我们可以轻松生成Android和iOS客户端API。

问题是云端点当前为don't support custom domains,因此我们的Web客户端无法直接与端点通信(移动客户端没有此问题)。

以下是我们已经尝试过的内容:

  • 从客户端到appspot.com域的CORS请求。这个问题是因为我们的请求不符合简单CORS(自定义标头,cookie等)的要求,每次请求都必须发送预检请求,这会减慢所有内容

  • 客户端向我们的自定义域发出请求,而后者又向appspot端点发出请求。同样,额外请求对性能不利

  • 我们还尝试为Web客户端设置重复的Jersey REST API。我们对所有方法进行双重注释(一次针对Cloud Endpoints,一次针对Jersey),Web客户端访问Jersey API,移动客户端访问Endpoints API。这很好用,除了Jersey和Endpoints使用不同的例外。因此,如果我们想要抛出一个404端点异常,那将会破坏Jersey响应,反之亦然。

还有其他选择吗?我们希望利用端点的强大功能来生成移动客户端,同时也可以绕过Web客户端的自定义域限制。

3 个答案:

答案 0 :(得分:9)

我们最终完全放弃了Cloud Endpoints,而是选择了纯粹的Jersey REST API。

为了满足我们为API生成移动客户端的需求,我们使用Swagger注释了我们的API。作为额外的奖励,Swagger似乎支持比Cloud Endpoints更多的客户端生成,并且如果不直接支持目标语言,也可以相对容易地从模板设置自己的客户端。

Jersey + Swagger并不像Cloud Endpoints那样容易设置,但它更具可定制性,并且允许我们绕过Cloud Endpoints强加的自定义域限制。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

最简单的解决方案是使用反向代理。 例如,如果您的应用是http://myapp.appspot.com,请在http://myapp.com上创建简单的html页面,然后使用javascript重定向到http://myapp.appspot.com

http://myapp.com上的Index.html。

<html>
   <head>
      <script>
          windows.location = http://myapp.appspot.com;
      </script> 
  </head>
  <body></body>
</html>  

它还有一个优点:如果您将代理页面放在另一个托管(不是appspot.com)上,您的应用程序(http://myapp.appspot.com)将可以从中国访问。