使用Python中的Google Cloud Endpoints Framework将JSON数组作为响应返回

时间:2017-10-12 11:31:12

标签: python google-app-engine google-cloud-platform google-cloud-endpoints google-cloud-endpoints-v2

我正在使用带有Python的Google端点框架(https://cloud.google.com/endpoints/docs/frameworks/python/get-started-frameworks-python),并且已经使用它构建REST API。

我能够在响应中返回JSON对象(字典),如:

{
    "items":[
        {
            "id": "brand_1_id",
            "name": "Brand 1"
        },
        {
            "id": "brand_2_id",
            "name": "Brand 2"
        }
    ]
}

但是,我无法将JSON数组(列表)作为响应返回,如:

[     {         " id":" brand_1_id",         "名称":"品牌1"     },     {         " id":" brand_2_id",         "名称":"品牌2"     } ]

以下是我一直用来返回回复的代码片段

以下是为发送回复而创建的类:

class BrandResponse(messages.Message):
    id=messages.StringField(1, required=True)
    brandName = messages.StringField(2, required=True)
    brandEmail=messages.StringField(3, required=True)
    brandPhone=messages.StringField(4,required=True)
    brandAddress=messages.StringField(5,required=True)
    brandCity=messages.StringField(6,required=True)
    brandState=messages.StringField(7,required=True)
    brandCountry=messages.StringField(8,required=True)
    brandPostalCode=messages.StringField(9,required=True)

class MultipleBrandResponse(messages.Message):
    items=messages.MessageField(BrandResponse,1,repeated=True)

以下是处理请求的方法:

@endpoints.method(
        MULTIPLE_BRAND_PAGINATED_CONTAINER,
        MultipleBrandResponse,
        path='brand',
        http_method='GET',
        name='Get Brands',
        audiences=firebaseAudience
    )
    def getBrands(self,request):
        brandResponse=[]

        query = BrandDB.query()
        brands = query.fetch(request.limit, offset=request.start)
        for brand in brands:
            brandResponse.append(BrandResponse(
            id=brand.key.urlsafe(),
            brandName=brand.name,
            brandAddress=brand.address,
            brandCity=brand.city,
            brandState=brand.state,
            brandCountry=brand.country,
            brandPostalCode=brand.postalCode,
            brandPhone=brand.phone,
            brandEmail=brand.email))

        print("Brand count: "+str(brandResponse.count))

        if len(brandResponse) == 0:
            raise endpoints.NotFoundException("No brands")

        return MultipleBrandResponse(items=brandResponse)

任何想法如何直接返回JSON数组,而不是在JSON对象中包装一个键。

2 个答案:

答案 0 :(得分:1)

该框架是围绕返回协议缓冲区消息而非JSON而设计的。你可能已经指定了一个dict结构匹配的消息;很难说没有看到你的代码。

答案 1 :(得分:1)

class Car(messages.Message):
    brand = messages.StringFeild(1)
    color = messages.StringFeild(2)

class ResponseCars(messages.Message):
    cars = messages.MessageField(Car,1, repeated = True)

@endpoints.api(name='mycar', version='v1')
class MyCar(remote.Service):
    @endpoints.method(
        message_types.VoidMessage,
        ResponseCars,
        path='getCars',
        http_method='GET',
        name='get_cars')
    def get_cars(self, request):
        cars = [Car(brand='bmw', color = 'black'), Car(brand='toyota', color='white')]
        return ResponseCars(cars = cars)

#ref : https://cloud.google.com/appengine/docs/standard/python/tools/protorpc/messages/messagefieldclass