具有相对 URI 的 Cloud Tasks App Engine 目标抛出异常 400:需要 HttpRequest.url

Cloud Tasks App Engine target with relative URI throws Exception 400 : HttpRequest.url is required

我正在尝试使用 Python 客户端 google-cloud-tasks==2.1.0 使用 Google Cloud Tasks 创建任务,但我收到一个异常,需要 HttpRequest.url。我正在设置相对 url 这是一个 URL 在我的应用程序中处理任务。

队列存在并使用以下方法创建:

gcloud task create queue notifications

代码:

client = tasks_v2.CloudTasksClient()
parent = client.queue_path(project, location, queue)
task = {                                                                
  'app_engine_http_request': {                                        
    'http_method': tasks_v2.HttpMethod.POST,                        
    'relative_uri': notification_url,
    'body': payload.encode('utf-8')                       
  },                                                                  
  'http_request': {                                                   
    'headers': {"Content-type": "application/json"}                 
  }                                                                   
}
response = client.create_task(parent=parent, task=task)       

我收到的确切错误是:

google.api_core.exceptions.InvalidArgument: 400 HttpRequest.url is required

我正在尝试在我的 App Engine 标准环境中创建任务。

您的任务有两个目标,即 App Engine 和 HTTP。在 HTTP 上,URL 是必需的,如 creating HTTP target tasks 中指定的那样。

URL 必须以 'http://' 或 'https://' 开头。要解决此问题,请更新您的 http_request:

'http_request': {                                                   
  'headers': {"Content-type": "application/json"},
  'url': "https://[SERVICE-URL]" + notification_url              
}

或者,删除 http_request 并在声明您的任务后像这样指定您的 header:

任务["http_request"]["headers"] = {"Content-type": "application/json"}

编辑:指定App Engine headers时,也可以这样写:

task["app_engine_http_request"]["headers"] = {"Content-type": "application/json"}

@Donald 是对的,但我认为他链接的 google 文档中有错字。我将 headers 设置在 app_engine_http_request 内,而不是 http_request

我认为你不能同时提供app_engine_http_requesthttp_request,你只能提供一个。所以像这样:

     client = tasks_v2.CloudTasksClient()
     parent = client.queue_path(project, location, queue)
     task = {                                                                
         'app_engine_http_request': {                                        
             'http_method': tasks_v2.HttpMethod.POST,                        
             'relative_uri': notification_url,
             'headers': {
                 'Content-Type': 'application/json'
             },
             'body': payload.encode('utf-8')                       
         }                                                                 
     }
     response = client.create_task(parent=parent, task=task)

https://googleapis.dev/python/cloudtasks/latest/tasks_v2/types.html#google.cloud.tasks_v2.types.AppEngineHttpRequest.headers