使用Google Cloud Endpoints的“会话”

时间:2013-03-20 11:27:49

标签: java google-app-engine rest session google-cloud-endpoints

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

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

  • 用户必须在每次请求时发送身份验证数据
  • 我希望稍后在上使用的所有数据都必须保留,即,对于我收到的每个API请求,我必须访问数据存储区,执行某些操作并再次存储数据。

这是对的吗?如果是这样,这在性能方面是否真的很好?

3 个答案:

答案 0 :(得分:4)

是的,你可以使用session,只在你的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();
    ...
}

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

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

的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令牌。