云端点和App Engine

时间:2016-03-22 15:15:01

标签: google-app-engine

我刚开始使用Google Cloud,我正在创建一个iOS应用,通过移动后端与Google云服务进行互动。我正在使用Python编写App Engine的后端。我已经完成了基于端点创建API的教程 - 但我有一个问题。

我是否必须创建Cloud Endpoints API,然后在App Engine上创建应用程序?基本上,我希望能够在我的iOS应用程序上注册帐户,调用API,然后使用Google Datastore存储帐户详细信息。从查看教程(云端点一个,然后是留言簿一个),我是否打算在端点api中公开Goog​​le Datastore,云存储等?或者这是否链接到另一个应用程序,这一切都完成了?

对不起,如果这听起来有点傻,但我只是想确定一下!

提前致谢。

1 个答案:

答案 0 :(得分:0)

简而言之,您的Cloud Endpoints API 是您的应用程序。有关云端点的一些文档可能有点令人困惑(或模糊),但在服务器端,它本质上是一堆Python装饰器或Java注释,允许您将应用程序逻辑公开为REST API。

我发现Cloud Endpoints的Java实现比Python更直观,这需要更多的工作来(去)序列化您的对象。您可以查看endpoints_proto_datastore.ndb.EndpointsModel,它可能会将某些样板内容从等式中删除(定义消息)。

基本上,当您编写API时,每个端点都映射到python函数。在这个功能里面,你可以做你喜欢的事,但通常它会是:

  1. 对POSTed JSON进行反序列化,验证它,并将一些实体写入数据存储区(或Cloud SQL,BigTable,无论在哪里)。

  2. 从数据存储中读取一个或多个实体,并将它们序列化为JSON并将它们返回给客户端。

  3. 例如,您可以将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按位置进行搜索,但您可能只需搜索数据存储区的咖啡馆星级评分):

        GEO_RESOURCE = endpoints.ResourceContainer(
            message_types.VoidMessage,
            lat=messages.FloatField(1, required=True),
            lon=messages.FloatField(2, required=True)
        )
    

    并且CafeListResponse只会封装list个CafeResponse对象(使用Cloud Endpoints返回单个对象):

    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)
    

    使用该端点签名,您可以通过GET上的HTTP /cafeApi/v1/cafes/nearby?lat=...&lon=...或通过带有'cafeApi.cafes.nearby(...)的Javascript API客户端访问它。

    就我个人而言,我发现使用Python创建REST API时,Flask更加灵活。