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

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

Сообщение Anonymous »

Я новичок в Google Cloud Platform, и мне хотелось бы решить следующую проблему:
Я хочу отправить HTTP-запрос POST (с данными JSON) в функцию Cloud Run с помощью Apps Script, но я не вижу такой записи в журналах функции Cloud Run. API Apps Script включен в моем проекте GCP, и я также указал номер проекта GCP в настройках проекта.
Роли, связанные с моей учетной записью: Владелец, Разработчик 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"

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

content-type
в параметре запроса: "application/json"

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

response
заголовок:

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

{ 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(), как рекомендовал @TheMaster:

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

HTTP Response Code: 401
, а текст HTTP-ответа:

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

В оболочке gcloud я попробовал следующую «тестовую команду 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»