簡而言之,您的Cloud Endpoints API 是您的應用程序。一些關於雲端點的文檔可能有點混亂(或模糊),但在服務器端,它本質上是一堆Python裝飾器或Java註釋,它們允許您將應用程序邏輯作爲REST API公開。
我發現雲端點的Java實現比Python更直觀,這需要更多的工作來對對象進行序列化。你可以看看endpoints_proto_datastore.ndb.EndpointsModel
這可能會從方程式(定義信息)中拿出一些樣板材料。
基本上,當你編寫你的API時,每個端點映射到一個python函數。內部的功能,你可以做你喜歡的東西,但通常這將是兩種:
Deserialise您發佈的JSON,驗證它,並寫一些實體數據存儲(或雲SQL,BigTable的,別的地方)。
從Datastore讀取一個或多個實體,並將它們序列化爲JSON並將它們返回給客戶端。
例如,你可以定義你的API(端點功能全集合)作爲
@endpoints.api(name='cafeApi', version='v1', description='Cafe API', audiences=[endpoints.API_EXPLORER_CLIENT_ID])
class CafeApi(remote.Service):
# endpoints here
例如,你可能有一個端點,以得到附近的咖啡館:
@endpoints.method(GEO_RESOURCE, CafeListResponse, path='cafes/nearby', http_method='GET', name='cafes.nearby')
def get_nearby_cafes(self, request):
"""Get cafes close to specified lat,long"""
cafes = list()
for c in search.get_nearby_cafes(request.lat, request.lon):
cafes.append(c.response_message())
return CafeListResponse(cafes=cafes)
這裏有幾件事需要強調。使用Python端點實現,您需要定義資源和消息類 - 這些類用於封裝請求數據和響應主體。
所以,在上面的例子中,GEO_RESOURCE
封裝做出GeoPoint
所需的字段(這樣我們就可以使用搜索API的位置進行搜索,但你可能只是搜索數據存儲與一個5星評級咖啡館):
GEO_RESOURCE = endpoints.ResourceContainer(
message_types.VoidMessage,
lat=messages.FloatField(1, required=True),
lon=messages.FloatField(2, required=True)
)
和CafeListResponse
只想封裝CafeResponse對象list
(與雲端點返回一個對象):
class CafeListResponse(messages.Message):
locations = messages.MessageField(CafeResponse, 1, required=False, repeated=True)
其中CafeResponse
是消息,該消息定義您希望如何通過API序列化對象(通常是數據存儲實體)。例如,
class LocationResponse(messages.Message):
id = messages.StringField(1, required=False)
coordinates = messages.MessageField(GeoMessage, 3, required=True)
name = messages.StringField(4, required=False)
隨着該端點的簽名,可以通過HTTP GET
在/cafeApi/v1/cafes/nearby?lat=...&lon=...
或者通過,比如用`cafeApi.cafes.nearby(...)訪問它,JavaScript的API客戶端。
就我個人而言,我發現Flask在使用Python創建REST API方面更加靈活。
Hi @ tx802,非常感謝您的深入分析!我比Python更瞭解Java,但是我已經感到Python中的存儲庫比Java更多(即使我發現後者稍微更直觀一些,表明它有更多支持/受歡迎程度)。使用這兩者中的任何一個有什麼優勢? – neX
這肯定有幫助 - 我想我明白雲端點現在應該做什麼! – neX