使用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_ids
或audiences
。 有关详细信息,请参阅文档 。
python:
如果你想用Python获取用户,请致电
endpoints.get_current_user()
来自已使用allowed_client_ids
或audiences
注释的请求中。 如果返回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令牌。