2013-03-20 33 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