这个问题只是为了确认我对这个概念很清楚。
据我了解,Google Cloud Endpoints是 Google 对REST服务的一种实现,因此它们无法在内存中保留任何“会话”数据,因此:
- 用户必须在每个请求中发送身份验证数据。
- 我以后要使用的所有数据都必须持久化,也就是说,对于我收到的每个 API 请求,我都必须访问 Datastore,做一些事情并再次存储数据。
它是否正确?如果是这样,这在性能方面真的好吗?
这个问题只是为了确认我对这个概念很清楚。
据我了解,Google Cloud Endpoints是 Google 对REST服务的一种实现,因此它们无法在内存中保留任何“会话”数据,因此:
它是否正确?如果是这样,这在性能方面真的好吗?
是的,您可以使用会话,只需使用 HttpServlet 在您的 API 方法中添加另一个参数:
@ApiMethod
public MyResponse getResponse( HttpServletRequest req, @Named("infoId") String infoId ) {
// Use 'req' as you would in a servlet, e.g.
String ipAddress = req.getRemoteAddr();
...
}
数据存储非常快,特别是如果您进行键查找(与查询相反)。如果您使用 NDB,那么您将受益于自动 memache 您的查找。
是的,您的 Cloud Endpoints API 后端代码(Java 或 Python)仍在 App Engine 上运行,因此您对 App Engine 上的所有资源拥有相同的访问权限。
尽管您无法为会话设置客户端 cookie,但您仍然可以获取用户的请求并将用户特定的数据存储在数据存储中。正如@Shay Erlichmen 提到的,如果您将数据存储与memcache和上下文缓存(如ndb一样)结合起来,您可以非常快速地进行这些查找。
要在 Python 或 Java 中执行此操作,需要在 API 和/或方法上的注释/装饰器中指定allowed_client_ids
或audiences
将需要指定。有关更多信息,请参阅文档。
如果您想在 Python 中获取用户,请调用
endpoints.get_current_user()
从使用allowed_client_ids
或注释的请求中audiences
。如果返回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 令牌。