

<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を定義すべく以下の様に書いたのですが

[code]

    # [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)
    
[/code]

これを  
python lib/endpoints/endpointscfg.py get_openapi_spec main.EchoApi --hostname
xxxxx  
コマンドにかけると

[code]

    "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が参照されてしまう
             }
           }
         ],
    
[/code]

というように、echo_path_parameter()で定義しているTEST_RESOURCEは無視されECHO_RESOURCE側が$refに入ってしまいます。

sample実装で先に書いてあるecho()内のアノテーションECHO_RESOURCEを外すと、TEST_RESOURCEが読まれるようになります。  
また関数定義の順番を逆にするとecho()側がTEST_RESOURCEが$refに設定されます。

この動作は仕様動作となりますでしょうか？  
一つのAPIにResourceContainerは一つしか定義できないのでしょうか？


CC BY-SA 3.0
2017-10-24T13:35:01.107
39005
2017-10-24T13:35:01.107
23189
question
python google-app-engine google-cloud
CloudEndpointsのResourceContainerについて