使用Google Cloud Endpoints的“会话”

这个问题只是为了证实我对这个概念很清楚。

据我了解, Google Cloud Endpoints是Google实施的REST服务,因此无法将任何“会话”数据保留在内存中,因此:

  • 用户必须随每个请求发送身份validation数据
  • 我以后想要使用的所有数据都必须保持不变 ,即,对于我收到的每个API请求,我必须访问数据存储区,执行某些操作并再次存储数据。

它是否正确? 如果是这样,这在性能方面是否真的很好?

数据存储区非常快,特别是如果您进行密钥查找(与查询相关)。 如果您使用NDB,那么您将获得自动memache查找的好处。

是的,你可以使用session,只在你的API方法中使用HttpServlet放入另一个Paramether:

 @ApiMethod public MyResponse getResponse( HttpServletRequest req, @Named("infoId") String infoId ) { // Use 'req' as you would in a servlet, eg String ipAddress = req.getRemoteAddr(); ... } 

是的,您的Cloud Endpoints API后端代码(Java或Python)仍在App Engine上运行,因此您可以访问App Engine上的所有资源。

虽然您无法为会话设置客户端cookie,但仍可以获取请求的用户并在数据存储中存储特定于用户的数据。 正如@Shay Erlichmen所提到的,如果你将数据存储区与memcache和一个上下文缓存(如ndb一样)耦合,你可以非常快速地进行这些查找。

要在Python或Java中执行此操作,需要在API上的注释/装饰器和/或方法中指定allowed_client_idsaudiences 。 有关详细信息,请参阅文档 。

python:

如果你想用Python获取用户,请致电

 endpoints.get_current_user() 

来自已使用allowed_client_idsaudiences注释的请求中。 如果返回None ,则没有有效用户(并且应该返回401)。

Java的:

要获取用户,请在带注释的方法(或带注释的API中包含的方法)上,在请求中指定用户对象:

 import com.google.appengine.api.users.User; ... public Model insert(Model model, User user) throws OAuthRequestException, IOException { 

和在Python中一样,检查user是否为null以确定是否随请求一起发送了有效的OAuth 2.0令牌。