HTTP POST из сценария приложений в функцию Google Cloud RunPython

Программы на Python
Ответить
Anonymous
 HTTP POST из сценария приложений в функцию Google Cloud Run

Сообщение Anonymous »

Я хочу отправить HTTP-запрос POST с данными JSON в функцию Cloud Run с помощью скрипта приложений, но я не вижу такой записи в журналах функции Cloud Run. API Apps Script включен в моем проекте Google Cloud Platform, и я указал номер проекта Google Cloud Platform в настройках проекта.
С моей учетной записью связаны следующие роли: владелец, разработчик Cloud Run Source, пользователь учетной записи службы и потребитель использования службы. Роли, связанные с учетной записью службы, которую я создал для функций Cloud Run, — это разработчик облачных функций, администратор Cloud Run, создатель токена учетной записи службы и пользователь учетной записи службы.
appsscript.json:

Код: Выделить всё

...
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/spreadsheets",
"https://www.googleapis.com/auth/script.container.ui",
"https://www.googleapis.com/auth/cloud-platform",
"openid"
],
...
Параметры запроса и запрос:

Код: Выделить всё

var options = {
"method": "post",
"contentType": "application/json",
"payload": jsonData,
"headers": {
"Authorization": "Bearer "+ScriptApp.getIdentityToken() // gcloud auth print-identity-token
}
};

...

// url: Cloud Run Functions URL
var response = UrlFetchApp.fetch(url, options);
Код Python функций Cloud Run для обработки запроса:

Код: Выделить всё

import functions_framework

@functions_framework.http
def http_function(request):
content_type = request.headers["content-type"]
if content_type == "application/json":
try:
request_json = request.get_json(silent=True)
data = request_json

except Exception as e:
return "No JSON data provided", 400

return f"{data}"
 — это {"name":"developer", а тип контента в параметре запроса – "application/json". заголовок ответа:

Код: Выделить всё

{ Date: 'Fri, 04 Apr 2025 09:20:23 GMT', 'Content-Length': '181', 'Content-Type': 'text/html; charset=utf-8', 'Alt-Svc': 'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000', 'X-Cloud-Trace-Context': 'e85c4f564777ce1ae6d02cd31da8d566;o=1', Server: 'Google Frontend' }
Я создал функцию для проверки запроса с помощью ScriptApp.getIdentityToken() и распечатал ответ:

Код: Выделить всё

HTTP Response Code: 500
Текст ответа HTTP: 500 Внутренняя ошибка сервера: сервер обнаружил внутреннюю ошибку и не смог выполнить ваш запрос. Либо сервер перегружен, либо в приложении произошла ошибка.

Я попробовал Appscript.GetOAuthToken():

Код: Выделить всё

HTTP Response Code: 401
Ошибка: несанкционировано… У вашего клиента нет разрешения на доступ к запрошенному URL

В Google Cloud Shell я попробовал тестовую команду CLI, найденную в разделе «Тестовая служба»:

Код: Выделить всё

curl -X POST https://[service URL] -H "Authorization: bearer $(gcloud auth print-identity-token)" -H "Content-Type: application/json" -d '{"name": "Developer"}'
Это выходные данные, поэтому сама функция работает: {"name":"Developer". Как мне заставить мою функцию принять запрос?

Подробнее здесь: https://stackoverflow.com/questions/795 ... n-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»