HTTP-POST von Apps Script zur Google Cloud Run-FunktionPython

Python-Programme
Anonymous
 HTTP-POST von Apps Script zur Google Cloud Run-Funktion

Post by Anonymous »

Ich bin ein ziemlicher Anfänger in der Google Cloud Platform und möchte Folgendes lösen:
Ich möchte mithilfe von Apps Script eine HTTP-POST-Anfrage (mit JSON-Daten) an eine Cloud Run Function senden, sehe aber keinen solchen Eintrag in den Cloud Run Function-Protokollen. Die Apps Script API ist in meinem GCP-Projekt aktiviert und ich habe auch die GCP-Projektnummer in den Projekteinstellungen angegeben.
Die mit meinem Konto verknüpften Rollen: Besitzer, Cloud Run-Quellentwickler, Dienstkontobenutzer, Dienstnutzungskonsument
Die mit dem Dienstkonto verknüpften Rollen, die ich speziell für Cloud Run Functions erstellt habe: Cloud Functions-Entwickler, Cloud Run-Administrator, Dienstkonto-Token-Ersteller, Dienstkonto Benutzer
Einige Informationen aus meinem Code:
appsscript.json:

Code: Select all

...
"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"
],
...
Die Anfrageparameter und die Anfrage:

Code: Select all

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);
Mein einfacher Cloud Run Functions-Python-Code, der die Anfrage verarbeiten würde:

Code: Select all

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}"

Code: Select all

request
Nutzlast: {"name": "Entwickler"

Code: Select all

content-type
im Anforderungsparameter: „application/json“

Code: Select all

response
Header:

Code: Select all

{ 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' }
Ich habe eine Funktion erstellt, um die Anfrage zu testen (mit ScriptApp.getIdentityToken()) und die Antwort auszudrucken:

Code: Select all

HTTP Response Code: 500
HTTP-Antworttext: 500 Interner Serverfehler: Der Server ist auf einen internen Fehler gestoßen und konnte Ihre Anfrage nicht abschließen. Entweder ist der Server überlastet oder es liegt ein Fehler in der Anwendung vor.

Tatsächlich habe ich auch versucht, Appscript.GetOAuthToken() zu verwenden, wie von @TheMaster empfohlen:

Code: Select all

HTTP Response Code: 401
und der HTTP-Antworttext lautet:

Fehler: Nicht autorisiert … Ihr Client hat keine Berechtigung für die angeforderte URL

In der gcloud-Shell habe ich den folgenden „CLI-Testbefehl“ ausprobiert, den ich im Abschnitt „Testdienst“ gefunden habe:

Code: Select all

curl -X POST https://[service URL] -H "Authorization: bearer $(gcloud auth print-identity-token)" -H "Content-Type: application/json" -d '{"name": "Developer"}'
Dies ist die Ausgabe, sodass die Funktion selbst ordnungsgemäß funktioniert: {"name": "Entwickler"
Kann mir jemand helfen, meine Funktion endlich dazu zu bringen, die Anfrage anzunehmen?
Wenn ich wichtige Informationen nicht geteilt habe, lassen Sie es mich bitte wissen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post