Google端点获取请求URL参数[Python]

Google端点获取请求URL参数[Python],python,python-2.7,google-app-engine,google-cloud-endpoints,google-cloud-endpoints-v2,Python,Python 2.7,Google App Engine,Google Cloud Endpoints,Google Cloud Endpoints V2,我目前正在做一个小项目,需要编写一个GET处理程序。我是从端点文档中提供的Echo示例开始工作的 我有我的资源容器: GET_EMAIL_RESOURCE = endpoints.ResourceContainer( message_types.VoidMessage, i = messages.IntegerField(1, default = 1) ) 我有我的经纪人: @endpoints.method( GET_EMAIL_RESOURCE, EchoR

我目前正在做一个小项目,需要编写一个GET处理程序。我是从端点文档中提供的Echo示例开始工作的

我有我的资源容器:

GET_EMAIL_RESOURCE = endpoints.ResourceContainer(
    message_types.VoidMessage,
    i = messages.IntegerField(1, default = 1)
)
我有我的经纪人:

@endpoints.method(
    GET_EMAIL_RESOURCE,
    EchoResponse,
    path='echo/getEmails/{i}',
    http_method='GET',
    name='echo_get_emails'
)
def echo_get_emails(self, request):
    if (request.i == 1):
        out = "default"
    else:
        out = "a"*request.i
    return EchoResponse(content=out)
为了访问这个,我使用了curl:

curl --request GET --header "Content-Type: application/json" http://localhost:8080/_ah/api/echo/v1/echo/getEmails/3
现在,它可以正常工作并返回您期望的结果,但是如果我需要将更多信息编码到我的URL中,例如:

getEmails/value1=someValue&value2=someOtherValue
我不知道如何做到这一点,也无法在文档中找到解释或示例

任何帮助都将不胜感激

编辑1:

我的代码现在看起来是这样的:

# main.py

GET_EMAIL_RESOURCE = endpoints.ResourceContainer(
    message_types.VoidMessage,
    i = messages.IntegerField(1, default = 1)
)

@endpoints.method(
    GET_EMAIL_RESOURCE,
    EchoResponse,
    path='echo/getEmails',
    http_method='GET',
    name='echo_get_emails'
)
def echo_get_emails(self, request):
    out = str(request.trailingDigits) + " : " +str(request.leadingDigits)
    return EchoResponse(content = out)
在我的openapi.json路径下,我有:

"/echo/v1/echo/getEmails" : {
  "get": {
    "operationId": "EchoApi_getEmails",
    "parameters" : [
      {
        "name": "trailingDigits",
        "in": "query",
        "description": "Trailing digits",
        "required": true,
        "type": "string"
      },
      {
        "name": "leadingDigits",
        "in": "query",
        "description": "Leading digits",
        "required": true,
        "type": "string"
      }
    ]
  }
}
但是当我运行请求时 curl--request GET--header“Content-Type:application/json”


我得到了trailingDigits的内容,但是leadingDigits的默认值是
资源容器中
路径
值中未使用的任何字段都应该成为查询参数。

为了修改参数,需要为所需路径配置openapi.json文件。下面是一个例子:

"/echo/v1/echo/test": {
      "get": {
        "operationId": "test",
        "parameters": [
          {
            "name": "paramOne",
            "in": "query",
            "description": "First parameter test",
            "required": true,
            "type": "string",
          },
          {
            "name": "paramTwo",
            "in": "query",
            "description": "Second parameter test",
            "required": true,
            "type": "string",
          }
         ]
YOUR_RESOURCE_CONTAINER = endpoints.ResourceContainer(
message_types.VoidMessage,
parameter1=messages.IntegerField(1, default=1),
parameter2=messages.IntegerField(2, default=2))
这是一些有用的文档

编辑1:

一旦在openapi.json文件中编辑了参数,就需要修改Python代码以使用这些新参数

在这种情况下,您需要调整ResourceContainer以接受第二个参数

下面是一个例子:

"/echo/v1/echo/test": {
      "get": {
        "operationId": "test",
        "parameters": [
          {
            "name": "paramOne",
            "in": "query",
            "description": "First parameter test",
            "required": true,
            "type": "string",
          },
          {
            "name": "paramTwo",
            "in": "query",
            "description": "Second parameter test",
            "required": true,
            "type": "string",
          }
         ]
YOUR_RESOURCE_CONTAINER = endpoints.ResourceContainer(
message_types.VoidMessage,
parameter1=messages.IntegerField(1, default=1),
parameter2=messages.IntegerField(2, default=2))

要记住一件事:使用curl时,请记住在url中添加“”。不使用它可能会导致呼叫故障

这个来自谷歌论坛的答案为我解决了这个问题:

在curl命令中是否在URL周围使用引号?因为如果 不是,而且你在一个bash shell中(如果你是 使用curl),您可能实际上没有在=THEEND处发送&ends\u part,因为&是一个shell元字符,用于将命令放入 背景

编辑

链接到论坛中的答案

那么我该如何访问查询参数呢?所以我有路径getEmails?value1=someValue,但是我如何从我的方法访问value1?我在文档中找不到有关此的任何信息如果您的
ResourceContainer
具有
value1=messages.StringField(1)
,那么您的处理程序只需执行
request.value1
。我可以正常工作,但是多个值呢?例如,在我的
ResourceContainer
中,我有
trailingDigits=messages.IntegerField(1,default=1,required=True),leadingDigits=messages.IntegerField(2,default=1,required=True)
当我运行查询
getEmail?trailingDigits=7&leadingdights=5
时,trailingDigits可以工作,但leadingdights似乎没有捕获值。我想这是一个bug。如果你不介意提交一个bug,那就太好了。我觉得我的代码更有可能出错,因为这是一个非常简单的问题,以前应该是一个bug,如果这个问题没有得到解决,我会发布一个bug报告,但在我知道它是bug还是现在之前,我很犹豫是否要这样做。我编辑了主要帖子,以显示我所做的更改和自第一篇帖子以来的进展。我在我的openapi.json中设置了这些内容,并发现了问题,我编辑帖子是为了显示我现在所做的事情hi@AnthonyO'Brien我刚刚根据您上次的更新编辑了答案。您可能会将论坛的url添加到您的帖子中。所以其他用户可以跟进。