Параметры URL-адреса запроса GET для конечных точек Google [Python]

В настоящее время я работаю над небольшим проектом, в котором мне нужно написать обработчик 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" http: // локальный: 8080 / _ah / api / echo / v1 / echo / getEmails? trailingDigits = 2 & leadDigits = 2

Я возвращаю содержимое trailingDigits, но значение по умолчанию для leadDigits

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
903
3

Ответы 3

Любые поля в ResourceContainer, не используемые в значении path, должны стать параметрами запроса.

Но как тогда мне получить доступ к параметру запроса? Итак, у меня есть путь getEmails? value1 = someValue, но как мне получить доступ к значению value1 из моего метода? Я не могу найти информацию об этом в документации

Anthony O'Brien 12.04.2018 01:20

Если ваш ResourceContainer имеет value1 = messages.StringField(1), ваш обработчик просто сделает request.value1.

saiyr 12.04.2018 02:01

У меня это работает нормально, но как насчет нескольких значений? например, в моем ResourceContainer у меня есть trailingDigits = messages.IntegerField(1, default = 1, required=True), leadingDigits = messages.IntegerField(2, default = 1, required=True), и когда я запускаю запрос getEmail?trailingDigits=7&leadingDigits=5, trailingDigits работает, но leadDigits, похоже, не фиксирует значение.

Anthony O'Brien 12.04.2018 12:21

Полагаю, это ошибка. Если вы не против зарегистрировать ошибку на github.com/cloudendpoints/endpoints-python, это было бы здорово.

saiyr 12.04.2018 20:37

Я чувствую, что с большей вероятностью в моем коде что-то не так из-за того, что это очень простая вещь, которая раньше должна была стать ошибкой, если она не будет решена, я опубликую отчет об ошибке , но я не решаюсь сделать это, пока не узнаю, является ли это ошибкой или сейчас. Я отредактировал основной пост, чтобы показать изменения, которые я сделал, и прогресс с момента первого поста.

Anthony O'Brien 13.04.2018 13:52

Чтобы изменить параметры, вам необходимо настроить файл 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",
          }
         ]

Полезная документация от Здесь.

РЕДАКТИРОВАТЬ 1:

После того, как вы отредактировали параметры в файле openapi.json, вам необходимо адаптировать код Python для использования этих новых параметров.

В этом случае вам нужно адаптировать ResourceContainer, чтобы он принимал второй аргумент.

Вот пример:

YOUR_RESOURCE_CONTAINER = endpoints.ResourceContainer(
message_types.VoidMessage,
parameter1=messages.IntegerField(1, default=1),
parameter2=messages.IntegerField(2, default=2))

Следует иметь в виду одну вещь: при использовании curl не забудьте добавить "" к URL-адресу. Если его не использовать, вызов может выйти из строя.

Я установил это в своем openapi.json и получил проблему, я редактирую сообщение, чтобы показать, что я сейчас сделал

Anthony O'Brien 13.04.2018 13:43

Привет @ AnthonyO'Brien, я только что отредактировал ответ в соответствии с вашим последним обновлением

Federico Panunzio 13.04.2018 16:25

Этот ответ с форумов Google устранил для меня проблему:

Are you using quotes around the URL in your curl command? Because if not, and you're in a bash shell (which is pretty likely if you're using curl), you might not actually be sending the &ends_at=THEEND part, because & is a shell metacharacter to put the command in the background.

Редактировать

Ссылка на ответ в форуме https://groups.google.com/forum/#!msg/google-cloud-endpoints/uzFcUS_uNz0/xyG2qVxbBQAJ

Вы можете добавить URL-адрес форума к своему сообщению. Так что другие пользователи могут следить.

O_o 04.06.2018 10:14

Другие вопросы по теме