在POST中将阵列/ dicts传递到Cloud Endpoint

时间:2014-11-04 07:44:39

标签: google-app-engine google-cloud-endpoints

我试图找到一种方法,允许用户使用Python将一组结构化信息作为POST到云端点的一部分传入。

示例帖子如下。这取自Google Tracks API,但正好说明了我想要实现的目标

  {
    "entities": [
      {
        "name": "Ford Fiesta 001",
        "type": "AUTOMOBILE"
      },
      {
        "name": "Chevrolet Volt 001",
        "type": "AUTOMOBILE"
      },
      {
        "name": "Chevrolet Volt 002",
      }
    ]
  }

从阅读Python云端点文档来看,它是不可能的,除非我可能允许在请求体中发送自由形式的JSON片段,这听起来不是一个好主意 - 不是我已经尝试过了。

1 个答案:

答案 0 :(得分:5)

这很容易实现。在repeated=True - 继承类中构造messages.MessageField时,您需要使用messages.Message值,该类定义为端点函数的参数格式。示例代码:

import endpoints
from protorpc import messages
from protorpc import message_types
from protorpc import remote

# represents a car with a name and a type
class Car(messages.Message):
    name = messages.StringField(1)
    type = messages.StringField(2)

# represents a collection of Cars
class MultiCars (messages.Message):
    cars = messages.MessageField(Car, 1, repeated=True)

# class to return a simple string message
class ResponseMessage (messages.Message):
    value = messages.StringField(1)

# api code
@endpoints.api(name='gmerrallApi',version='v1',
               description='Example API for gmerrall')
class ExampleApi(remote.Service):
    # endpoints method to insert a MultiCars
    @endpoints.method(MultiCars,
                      ResponseMessage,
                      name='cars.insertMulti',
                      path='/insertMultiCars/{entities},
                      http_method='POST')
        def insertMultiCars(self, request):
            for car in request.entities:
                print "got car (%s, %s)" % (car.name, car.type)
            return ResponseMessage (value="The endpoints function ran to the end")

花点时间查看此示例,并注意注释和消息类与您编写的端点代码交互的方式。此API方法接收的参数的JSON格式与您使用的问题完全一样。 @endpoints.method注释中提供的类型信息告诉方法如何根据这些类定义中的消息字段解释JSON blob。