2013-03-20 47 views
9

此问题仅用于确认我清楚了解此概念。与Google云端点的“会话”

据我了解,谷歌云端点是一种谷歌的执行REST的服务,使他们不能保留任何“会话”数据在内存中,因此:

  • 用户每个请求必须发送验证数据
  • 我想在以后使用的所有数据必须被持久保存,也就是说,对于我收到的每个API请求,我必须访问数据存储区,执行某些操作并再次存储数据。

这是正确的吗?如果是这样,这在性能方面确实很好吗?

回答

3

数据存储非常快,特别是如果您执行密钥查找(如同查询一样)。如果您使用NDB,那么您将拥有自动查找您的查找的好处。

+0

感谢@Shay!请原谅我的无知,但是当你说“键查找”时,你的意思是直接使用'getObjectById'而不是查询,对吧?什么是NDB? – MikO 2013-03-20 12:09:54

+0

因此,你的Java人,NDB是为Python。 – 2013-03-20 12:12:01

+0

是的:键查找使用getObjectById – 2013-03-20 12:12:32

2

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

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

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

的Python:

如果你想在Python用户,从已标注了allowed_client_idsaudiences请求中调用

endpoints.get_current_user() 

。如果这返回None,那么没有有效的用户(并且你应该返回一个401)。

爪哇:

为了得到一个用户,在一个注解的方法(或包含一个带注释的API中的方法),只需在请求中指定的一个用户对象:

import com.google.appengine.api.users.User; 

... 

    public Model insert(Model model, User user) throws 
     OAuthRequestException, IOException { 

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

4

是的,你可以使用会话,只放另一Paramether在您的API法的HttpServlet:

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

我从这个问题得到它:[链接](http://stackoverflow.com/questions/15056830/getting-raw-http-data-headers-cookies-etc-in-google-cloud-endpoints) – 2013-04-08 05:24:40

+4

这真的很有趣,但这是不正确的......你可以传递HttpRequest参数的事实并不意味着你可以使用会话...正如在你从中复制你的响应的链接中所解释的,这对于获取请求信息。但端点不会转发请求(如Servlet所做的那样),但它只是返回一个对象MyResponse,因此会话将丢失... – MikO 2013-04-08 11:18:58

+0

请查看此链接 https://cloud.google.com/appengine/docs/java/config/appconfig 并搜索'启用会话'。有了这个,你的服务器将会有一个MaxInactiveInterval等于-1的会话,这表明会话永远不会超时。 – user3081007 2015-11-17 00:57:11