此问题仅用于确认我清楚了解此概念。与Google云端点的“会话”
据我了解,谷歌云端点是一种谷歌的执行REST的服务,使他们不能保留任何“会话”数据在内存中,因此:
- 用户每个请求必须发送验证数据。
- 我想在以后使用的所有数据必须被持久保存,也就是说,对于我收到的每个API请求,我必须访问数据存储区,执行某些操作并再次存储数据。
这是正确的吗?如果是这样,这在性能方面确实很好吗?
此问题仅用于确认我清楚了解此概念。与Google云端点的“会话”
据我了解,谷歌云端点是一种谷歌的执行REST的服务,使他们不能保留任何“会话”数据在内存中,因此:
这是正确的吗?如果是这样,这在性能方面确实很好吗?
数据存储非常快,特别是如果您执行密钥查找(如同查询一样)。如果您使用NDB,那么您将拥有自动查找您的查找的好处。
是的,您的Cloud Endpoints API后端代码(Java或Python)仍在App Engine上运行,因此您可以对App Engine上拥有的所有资源拥有相同的访问权限。
尽管无法为会话设置客户端cookie,但您仍可以获取用户请求并将用户特定的数据存储在数据存储中。正如@Shay Erlichmen所提到的,如果您将数据存储与memcache和上下文缓存(如ndb所做的那样)耦合在一起,则可以快速进行这些查找。
要在Python或Java中执行此操作,需要在API和/或方法的注释/装饰器中指定allowed_client_ids
或audiences
。有关更多信息,请参阅docs。
如果你想在Python用户,从已标注了allowed_client_ids
或audiences
请求中调用
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令牌。
是的,你可以使用会话,只放另一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();
...
}
我从这个问题得到它:[链接](http://stackoverflow.com/questions/15056830/getting-raw-http-data-headers-cookies-etc-in-google-cloud-endpoints) – 2013-04-08 05:24:40
这真的很有趣,但这是不正确的......你可以传递HttpRequest参数的事实并不意味着你可以使用会话...正如在你从中复制你的响应的链接中所解释的,这对于获取请求信息。但端点不会转发请求(如Servlet所做的那样),但它只是返回一个对象MyResponse,因此会话将丢失... – MikO 2013-04-08 11:18:58
请查看此链接 https://cloud.google.com/appengine/docs/java/config/appconfig 并搜索'启用会话'。有了这个,你的服务器将会有一个MaxInactiveInterval等于-1的会话,这表明会话永远不会超时。 – user3081007 2015-11-17 00:57:11
感谢@Shay!请原谅我的无知,但是当你说“键查找”时,你的意思是直接使用'getObjectById'而不是查询,对吧?什么是NDB? – MikO 2013-03-20 12:09:54
因此,你的Java人,NDB是为Python。 – 2013-03-20 12:12:01
是的:键查找使用getObjectById – 2013-03-20 12:12:32