AppEngine端点中的MessageField的GET请求参数为None

时间:2013-04-28 10:35:44

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

由于某种原因,当使用http_method = GET而不是POST时,我无法读取请求参数。

@endpoints.method(RequestMessage,
                  ResponseMessage,
                  name='get',
                  path='mypath',
                  http_method='GET')
def get_challenge(self, request):
    # This is None in http_method=GET but works on POST
    print request.my_message_field

我的消息类是这样的:

class MyMessage(messages.Message):
    id = messages.StringField(1)
    name = messages.StringField(2)

class RequestMessage(messages.Message):
    my_message_field = messages.MessageField(MyMessage, 1)

我正在通过API Explorer测试API。不知道我做错了什么或什么?

由于

1 个答案:

答案 0 :(得分:1)

参数应显示为my_message_field.idmy_message_field.name

根本区别在于GET没有有效负载而POST没有负载。因此,您的参数名称空间必须是“平面”而不是嵌套的JSON。因此,为了适应这一点,我们将参数展平,如上所述。

更新:

对于未正确移植到devappserver的内容,这一定是个问题。我向endpoints.apiserving添加了一个记录器,以确定从API前端传递到App Engine后端的内容:

在制作中

'{"my_message_field":{"id":"x","name":"y"}}'

devappserver2

'{"my_message_field.name": ["y"], "my_message_field.id": ["x"]}'

尝试通过

解析时
from protorpc import remote
protocols = remote.Protocols.get_default()
json_protocol = protocols.lookup_by_content_type('application/json')
json_protocol.decode_message(RequestMessage, payload)

这是api_server所做的,这就是发生的事情

在制作中

<RequestMessage
 my_message_field: <MyMessage
 id: u'x'
 name: u'y'>>

devappserver2

<RequestMessage>