В настоящее время я работаю над небольшим проектом, в котором мне нужно написать обработчик 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






Любые поля в ResourceContainer, не используемые в значении path, должны стать параметрами запроса.
Если ваш 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&leadingDigits=5, trailingDigits работает, но leadDigits, похоже, не фиксирует значение.
Полагаю, это ошибка. Если вы не против зарегистрировать ошибку на github.com/cloudendpoints/endpoints-python, это было бы здорово.
Я чувствую, что с большей вероятностью в моем коде что-то не так из-за того, что это очень простая вещь, которая раньше должна была стать ошибкой, если она не будет решена, я опубликую отчет об ошибке , но я не решаюсь сделать это, пока не узнаю, является ли это ошибкой или сейчас. Я отредактировал основной пост, чтобы показать изменения, которые я сделал, и прогресс с момента первого поста.
Чтобы изменить параметры, вам необходимо настроить файл 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 и получил проблему, я редактирую сообщение, чтобы показать, что я сейчас сделал
Привет @ AnthonyO'Brien, я только что отредактировал ответ в соответствии с вашим последним обновлением
Этот ответ с форумов 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-адрес форума к своему сообщению. Так что другие пользователи могут следить.
Но как тогда мне получить доступ к параметру запроса? Итак, у меня есть путь getEmails? value1 = someValue, но как мне получить доступ к значению value1 из моего метода? Я не могу найти информацию об этом в документации