Fazer uma solicitação HTTP

É possível definir uma etapa de fluxo de trabalho que faça uma chamada HTTP e atribuir a resposta da chamada a uma variável. Por exemplo, é possível invocar um serviço do Google Cloud como o Cloud Functions ou o Cloud Run por uma solicitação HTTP.

Invocar um endpoint HTTP

Esse tipo de etapa permite fazer uma solicitação HTTP. Tanto solicitações HTTP como HTTPS são compatíveis. Os métodos de solicitação HTTP mais comuns têm um atalho de chamada (como http.get e http.post), mas é possível fazer qualquer tipo de solicitação HTTP definindo o campo call como http.request e especificando o tipo de solicitação usando o campo method.

YAML

  - STEP_NAME:
      call: HTTP_REQUEST
      args:
          url: URL_VALUE
          method: REQUEST_METHOD
          headers:
              HEADER_KEY:HEADER_VALUE
              ...
          body:
              BODY_KEY:BODY_VALUE
              ...
          query:
              QUERY_KEY:QUERY_VALUE
              ...
          auth:
              type: AUTH_TYPE
              scope: SCOPE
              audience: AUDIENCE
          timeout: TIMEOUT_IN_SECONDS
      result: RESULT_VALUE
    

JSON

  [
    {
      "STEP_NAME": {
        "call": "HTTP_REQUEST",
        "args": {
          "url": "URL_VALUE",
          "method": "REQUEST_METHOD",
          "headers": {"HEADER_KEY":"HEADER_VALUE",
          ...
          },
          "body": {"BODY_KEY":"BODY_VALUE",
          ...
          },
          "query": {"QUERY_KEY":"QUERY_VALUE",
          ...
          },
          "auth": {
            "type":"AUTH_TYPE",
            "scope":"SCOPE",
            "audience":"AUDIENCE"
          },
          "timeout": "TIMEOUT_IN_SECONDS"
        },
        "result": "RESULT_VALUE"
      }
    }
  ]
    

Substitua:

  • HTTP_REQUEST: obrigatório. Use um dos seguintes itens para solicitações HTTP:
    • http.delete
    • http.get
    • http.patch
    • http.post
    • http.put
    • http.request
  • URL_VALUE: obrigatório. URL para onde a solicitação é enviada.
  • REQUEST_METHOD: obrigatório se o tipo de chamada for http.request. O tipo de método de solicitação HTTP a ser usado. Por exemplo:
    • GET
    • POST
    • PATCH
    • DELETE
  • HEADER_KEY:HEADER_VALUE: opcional. Campos do cabeçalho para fornecer entrada à API.

    Se você usar um cabeçalho Content-Type para especificar o tipo de mídia do corpo da solicitação, somente os tipos a seguir serão compatíveis:

    • application/json ou application/type+json: precisa ser um mapa
    • application/x-www-form-urlencoded: precisa ser uma string não codificada
    • É preciso que text/type seja uma string.

    Se você estiver usando um cabeçalho User-Agent para identificar o user agent solicitante, as seguintes condições serão aplicadas:

    • O padrão é GoogleCloudWorkflows; (+https://cloud.google.com/workflows/docs)
    • Se um valor for especificado, GoogleCloudWorkflows; (+https://cloud.google.com/workflows/docs) será anexado a esse valor.

      Por exemplo, se User-Agent: "MY_USER_AGENT_VALUE" for especificado, o cabeçalho da solicitação HTTP será o seguinte (com um espaço entre o valor especificado e o padrão anexado):

      MY_USER_AGENT_VALUE GoogleCloudWorkflows; (+https://cloud.google.com/workflows/docs)
  • BODY_KEY:BODY_VALUE: opcional. Campos do corpo para fornecer a entrada à API. A estrutura pode ser equivalente a um payload JSON. Exemplo:

    YAML

          body:
            requests:
            - image:
                source:
                  gcsImageUri: ${gsUri}
              features:
              - type: LABEL_DETECTION
              - type: SAFE_SEARCH_DETECTION
              - type: IMAGE_PROPERTIES
        result: imageAnalysisResponse
        

    JSON

    {
      "requests":[
        {
          "image": {
            "source": {
                "gcsUri": "img.png"
            }
          },
          "features": [
            { "type":"LABEL_DETECTION" },
            { "type":"SAFE_SEARCH_DETECTION" },
            { "type":"IMAGE_PROPERTIES" },
          ]
        }
      ]
    }
          
  • QUERY_KEY:QUERY_VALUE: opcional. Campos de consulta para fornecer a entrada à API.
  • AUTH_TYPE: opcional. Obrigatório se a API que está sendo chamada exige autenticação. Use OIDC ou OAuth2. Consulte Fazer solicitações autenticadas para mais informações.
    • SCOPE: opcional. Limita o acesso de um aplicativo à conta de um usuário. Pode ser uma string ou uma lista de strings.

      Exemplo:

      "https://www.googleapis.com/auth/cloud-platform"

      ou

      ["https://www.googleapis.com/auth/cloud-platform", "scope2", "scope3"]

      Consulte Escopos do OAuth 2.0 para APIs do Google.

    • AUDIENCE: opcional. Especifica o público-alvo do token OIDC. Por padrão, ele é definido como o mesmo valor de url. No entanto, ele precisa ser definido como o URL raiz do serviço. Exemplo: https://region-project.cloudfunctions.net/hello_world.
  • TIMEOUT_IN_SECONDS: opcional. Quanto tempo (em segundos) uma solicitação pode ser executada antes de gerar uma exceção. O máximo é 1.800 segundos.
  • RESULT_VALUE: opcional. Nome da variável em que o resultado de uma etapa de invocação HTTP é armazenado.

Acessar dados de resposta HTTP salvos em uma variável

Quando uma resposta do tipo application/json é armazenada em uma variável, a resposta JSON é convertida em um mapa que você acessa como um corpo de resposta. O Workflows tem um analisador integrado para acessar esses dados. Para acessar os campos da resposta HTTP, use a seguinte sintaxe:

${VARIABLE_NAME.body|code.PATH_TO_FIELD}

Substitua:

  • VARIABLE_NAME: o nome da variável de fluxo de trabalho em que você salvou uma resposta JSON.
  • body: use o campo body para acessar o corpo da resposta HTTP.
  • code: use o campo code para acessar o código de resposta HTTP.
  • PATH_TO_FIELD: o caminho para o campo na resposta JSON que você quer acessar. Pode ser simplesmente o nome do campo ou, se o campo estiver aninhado em um objeto, pode assumir a forma de object1.object2.field.

Por exemplo, se uma API retorna {"age":50} e um fluxo de trabalho armazena essa resposta em uma variável chamada age_response, o exemplo a seguir retorna o valor do campo age. Nesse caso, 50:

age_response.body.age

Amostras

Estas amostras demonstram a sintaxe.

Atribuir a resposta de uma chamada de API

Este exemplo faz uma chamada para uma API de amostra. O dia retornado da semana é transmitido para a API Wikipedia. Os artigos relevantes na Wikipédia sobre o dia atual da semana são retornados.

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

Fazer uma solicitação POST HTTP externa

Este exemplo faz uma solicitação POST para um endpoint HTTP externo.

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

Fazer uma solicitação HTTP GET externa com cabeçalhos

Este exemplo faz uma solicitação HTTP GET com um cabeçalho personalizado. Também é possível fornecer definições personalizadas de cabeçalho ao fazer outros tipos de solicitações 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}"
    }
  }
]

Usar o OIDC para autenticar ao fazer uma solicitação ao Cloud Functions

Neste exemplo, fazemos uma solicitação HTTP usando o OIDC adicionando uma seção auth à seção args da definição do fluxo de trabalho, depois de especificar o URL.

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

A seguir