CloudEndpointsのResourceContainerについて
https://cloud.google.com/endpoints/docs/frameworks/python/create_api
に従ってCloudEndpointsでAPIの作成を試みております。
サンプルで提示されている
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
python-docs-samples/appengine/standard/endpoints-frameworks-v2/echo
を使用して色々試しておりますが、パラメータの定義でわからない点があります。
パスパラメータのみでボディパラメータが不要なAPI、echo_path_parameterを定義すべく以下の様に書いたのですが
# [START messages]
class EchoRequest(messages.Message):
fuga = messages.StringField(1)
hoge = messages.StringField(2)
#sampleそのまま
ECHO_RESOURCE = endpoints.ResourceContainer(
EchoRequest,
n=messages.IntegerField(3, default=1))
#echo_path_parameter用
TEST_RESOURCE = endpoints.ResourceContainer(
message_types.VoidMessage,
test=messages.IntegerField(2, default=1))
# [END messages]
...
#sampleそのまま
@endpoints.method(
# This method takes a ResourceContainer defined above.
ECHO_RESOURCE,
# This method returns an Echo message.
EchoResponse,
path='echo',
http_method='POST',
name='echo')
def echo(self, request):
output_content = ' '.join([request.content] * request.n)
return EchoResponse(content=output_content)
#パスパラメータのみボディパラメータなし
@endpoints.method(
# This method takes a ResourceContainer defined above.
TEST_RESOURCE,
# This method returns an Echo message.
EchoResponse,
path='echo/{test}',
http_method='POST',
name='echo_path_parameter')
def echo_path_parameter(self, request):
output_content = ' '.join([request.content] * request.test)
return EchoResponse(content=output_content)
これを
python lib/endpoints/endpointscfg.py get_openapi_spec main.EchoApi --hostname xxxxx
コマンドにかけると
"definitions": {
"MainEchoResponse": {
"properties": {
"content": {
"type": "string"
}
},
"type": "object"
},
"ProtorpcMessagesCombinedContainer": { ★ECHO_RESOURCEの定義
"properties": {
"fuga": {
"type": "string"
},
"hoge": {
"type": "string"
},
"n": {
"format": "int64",
"type": "string"
}
},
"type": "object"
}
},
...
"/echo/v1/echo/{test}": {
"post": {
"operationId": "EchoApi_echoPathParameter",
"parameters": [
{
"format": "int64",
"in": "path",
"name": "test",
"required": true,
"type": "string"
},
{
"in": "body",
"name": "body",
"schema": {
"$ref": "#/definitions/ProtorpcMessagesCombinedContainer" ★ECHO_RESOURCEが参照されてしまう
}
}
],
というように、echo_path_parameter()で定義しているTEST_RESOURCEは無視されECHO_RESOURCE側が$refに入ってしまいます。
sample実装で先に書いてあるecho()内のアノテーションECHO_RESOURCEを外すと、TEST_RESOURCEが読まれるようになります。
また関数定義の順番を逆にするとecho()側がTEST_RESOURCEが$refに設定されます。
この動作は仕様動作となりますでしょうか?
一つのAPIにResourceContainerは一つしか定義できないのでしょうか?