发出 HTTP 请求

您可以定义执行 HTTP 调用的工作流步骤,并将调用的响应分配给变量。例如,您可以通过 HTTP 请求调用 Google Cloud 服务(例如 Cloud Functions 或 Cloud Run)

调用 HTTP 端点

这种类型的步骤允许您发出 HTTP 请求。支持 HTTP 和 HTTPS 请求。最常见的 HTTP 请求方法具有调用快捷方式(例如 http.gethttp.post),但您可以发出任何类型的 HTTP 请求,方法是将 call 字段设置为 http.request 并使用 method 字段指定请求类型。

YAML

  - STEP_NAME:
      call: {http.delete|http.get|http.patch|http.post|http.put|http.request}
      args:
          url: URL_VALUE
          [method: REQUEST_METHOD]
          [headers:
              KEY1:VALUE1
              ...]
          [body:
              KEY2:VALUE2
              ...]
          [query:
              KEY3:VALUE3
              ...]
          [auth:
              type:{OIDC|OAuth2}]
          [timeout: VALUE_IN_SECONDS]
      [result: RESPONSE_VALUE]
    

JSON

  [
    {
      "STEP_NAME": {
        "call": "{http.delete|http.get|http.patch|http.post|http.put|http.request}",
        "args": {
          "url": "URL_VALUE",
          ["method": "REQUEST_METHOD",]
          ["headers": {"KEY1":"VALUE1",
          ...
          },]
          ["body": {"KEY2":"VALUE2",
          ...
          },]
          ["query": {"KEY3":"VALUE3",
          ...
          },]
          ["auth": {"type":"{OIDC|OAuth2}"},]
          ["timeout": "VALUE_IN_SECONDS"]
        },
        ["result": "RESPONSE_VALUE"]
      }
    }
  ]
    
  • call-必填。对 HTTP 请求使用下列其中一项:
    • http.delete
    • http.get
    • http.patch
    • http.post
    • http.put
    • http.request
  • url-必填。发送请求的网址。
  • method-如果使用调用类型 http.request,则需要此参数。要使用的 HTTP 请求方法的类型。例如:
    • GET
    • POST
    • PATCH
    • DELETE
  • headers-可选。用于向 API 提供输入的字段。

    如果使用 Content-Type 标头指定请求正文的媒体类型,则仅支持以下类型:

    • application/jsonapplication/type+json - 必须是映射
    • application/x-www-form-urlencoded - 必须是未编码的字符串
    • text/type - 必须是字符串

    如果使用 User-Agent 标头来识别发出请求的用户代理,则以下规则适用:

    • 默认值为 GoogleCloudWorkflows; (+https://cloud.google.com/workflows/docs)
    • 如果指定了值,则会将 GoogleCloudWorkflows; (+https://cloud.google.com/workflows/docs) 附加到该值

      例如,如果指定了 User-Agent: "MY_USER_AGENT_VALUE",则 HTTP 请求标头如下所示(指定值与附加的默认值之间有一个空格):

      MY_USER_AGENT_VALUE GoogleCloudWorkflows; (+https://cloud.google.com/workflows/docs)
  • body-可选。用于向 API 提供输入的字段。
  • query-可选。用于向 API 提供输入的字段。
  • auth-可选。如果调用的 API 需要身份验证,此元素是必需的。如需了解详情,请参阅发出经过身份验证的请求
  • timeout-可选。抛出异常之前,请求可以运行的时长(以秒为单位)。最大值为 1800 秒。
  • result-可选。存储 HTTP 调用步骤的结果的变量名称。

访问保存在变量中的 HTTP 响应数据

application/json 类型的响应存储在变量中时,JSON 响应会转换为作为响应正文访问的映射。Workflows 内置了用于访问这些数据的解析器。要从 HTTP 响应访问这些字段,请使用以下语法:

${VARIABLE_NAME.body|code.PATH_TO_FIELD}
  • VARIABLE_NAME:您保存 JSON 响应的工作流变量的名称。
  • body:使用 body 字段访问 HTTP 响应的正文。
  • code:使用 code 字段访问 HTTP 响应代码。
  • PATH_TO_FIELD:您要访问的 JSON 响应中的字段的路径。可以只是字段名称,如果字段嵌套在对象中,则可以采用 object1.object2.field 形式。

例如,如果 API 返回 {"age":50},并且工作流将该响应存储在名为 age_response 的变量中,则以下示例返回 age 字段的值:在此示例中为 50

age_response.body.age

示例

这些示例演示了语法。

分配来自 API 调用的响应

此示例会调用示例 API。一周的返回日期会传递至 Wikipedia API。系统会返回维基百科上有关本周当前日期的相关文章。

YAML

- getCurrentTime:
    call: http.get
    args:
      url: https://us-central1-workflowsample.cloudfunctions.net/datetime
    result: currentTime
- readWikipedia:
    call: http.get
    args:
      url: https://en.wikipedia.org/w/api.php
      query:
        action: opensearch
        search: ${currentTime.body.dayOfTheWeek}
    result: wikiResult
- returnResult:
    return: ${wikiResult.body[1]}

JSON

[
  {
    "getCurrentTime": {
      "call": "http.get",
      "args": {
        "url": "https://us-central1-workflowsample.cloudfunctions.net/datetime"
      },
      "result": "currentTime"
    }
  },
  {
    "readWikipedia": {
      "call": "http.get",
      "args": {
        "url": "https://en.wikipedia.org/w/api.php",
        "query": {
          "action": "opensearch",
          "search": "${currentTime.body.dayOfTheWeek}"
        }
      },
      "result": "wikiResult"
    }
  },
  {
    "returnResult": {
      "return": "${wikiResult.body[1]}"
    }
  }
]

发出外部 HTTP POST 请求

此示例向外部 HTTP 端点发出 POST 请求。

YAML

- get_message:
    call: http.post
    args:
      url: https://www.example.com/endpoint
      body:
        some_val: "Hello World"
        another_val: 123
    result: the_message
- return_value:
    return: ${the_message.body}

JSON

[
  {
    "get_message": {
      "call": "http.post",
      "args": {
        "url": "https://www.example.com/endpoint",
        "body": {
          "some_val": "Hello World",
          "another_val": 123
        }
      },
      "result": "the_message"
    }
  },
  {
    "return_value": {
      "return": "${the_message.body}"
    }
  }
]

使用标头发出外部 HTTP GET 请求

此示例使用自定义标头发出 HTTP GET 请求。您也可以在发出其他类型的 HTTP 请求时提供自定义标头定义。

YAML

- get_message:
    call: http.get
    args:
      url: https://www.example.com/endpoint
      headers:
        Content-Type: "text/plain"
      query:
        some_val: "Hello World"
        another_val: 123
    result: the_message
- return_value:
    return: ${the_message.body}

JSON

[
  {
    "get_message": {
      "call": "http.get",
      "args": {
        "url": "https://www.example.com/endpoint",
        "headers": {
          "Content-Type": "text/plain"
        },
        "query": {
          "some_val": "Hello World",
          "another_val": 123
        }
      },
      "result": "the_message"
    }
  },
  {
    "return_value": {
      "return": "${the_message.body}"
    }
  }
]

向 Cloud Functions 发出请求时,使用 OIDC 进行身份验证

在指定网址后,通过将 auth 部分添加到工作流定义的 args 部分中,使用 OIDC 发出 HTTP 请求。

YAML

- call_my_function:
    call: http.post
    args:
      url: https://us-central1-myproject123.cloudfunctions.net/myfunc1
      auth:
        type: OIDC
      body:
        some_val: "Hello World"
        another_val: 123
    result: the_message
- return_value:
    return: ${the_message.body}

JSON

[
  {
    "call_my_function": {
      "call": "http.post",
      "args": {
        "url": "https://us-central1-myproject123.cloudfunctions.net/myfunc1",
        "auth": {
          "type": "OIDC"
        },
        "body": {
          "some_val": "Hello World",
          "another_val": 123
        }
      },
      "result": "the_message"
    }
  },
  {
    "return_value": {
      "return": "${the_message.body}"
    }
  }
]

后续步骤