Вызов созданной функции

Если вы хотите использовать разработанную и опубликованную функцию в своем смартапе, вам понадобится настроить вызов этой функции. Вы можете воспользоваться одним из следующих методов.

Вызов через SmartMarket Graph

Самый простой метод для вызова вашей функции - добавить ее как блок сценария в визуальном редакторе смартапов Graph. Для этого вам понадобится создать новый смартап в Пространстве смартапов и перейти на экран Разработка (либо открыть этот экран в уже существующем смартапе).

Чтобы добавить блок вызова функции, щелкните по элементу Выполнить Functions в разделе Действия меню элементов сценария.

В открывшемся окне вы сможете задать метод вызова (POST, GET, и т.п.), выбрать функцию из доступных вам, которая будет вызываться, и заполнить объект запроса.

Обратите внимание, если вы планируете вызывать функцию, которая находится в недоступном вам пространстве, то вам понадобится указать endpoint, APP_KEY и APP_SECRET этой функции вручную. Чтобы получить доступ к ручному вводу параметров, переключите кнопку Задать вручную во включенное положение.

После добавления блока с вызовом функции в Graph, вы можете вызывать ее через запуск смартапа.

Вызов в коде приложения, сервиса или функции

Кроме вызова через смартап, вы также можете настроить вызов опубликованной функции в коде вашего приложения, сервиса или функции. Для этого вам понадобится создать подписанный вызов.

Чтобы подписать вызов, вам понадобится SDK, соответствующий языку, на котором вы разрабатываете. Получить SDK можно из центра поддержки SberCloud. После получения SDK, распакуйте архив в каталог вашего проекта. Функции Functions создаются с уже подключенным SDK (signer.py и signer.js соответственно).

Давайте рассмотрим шаги создания подписанного вызова для функций на JavaScript и Python. Инструкции для всех остальных доступных языков вы можете получить в центре поддержки SberCloud (на английском).

Вызов через cURL

Чтобы сделать подписанный вызов через утилиту cURL, вам потребуется сгенерировать команду через JavaScript SDK.

  1. Скачайте JavaScript SDK в репозитории SberDevices.

    SDK содержит файы с примером вызова с помощью браузера — demo.html.

  2. Откройте файл demo.html в браузере.

    Откроется следующая форма:

  3. Укажите в соответствующих полях APP_KEY, APP_SECRET, метод вызова и полный адрес endpoint функции, которую хотите вызвать.
  4. Заполните поле Headers параметрами запроса и заголовками в формате JSON, а также укажите в поле Body тело запроса.
  5. Нажмите на кнопку Send Request, чтобы сгенерировать команду для curl.
Генерируемая curl команда не соответствует требованиям Windows к формату. Используйте Git Bash для запуска команды из CLI.

Вызов DataSpace

DataSpace вызывается в коде как любая другая функция. Для упрощения построения запросов в функциях Functions также используются дополнительные библиотеки - Apollo и gql. Ознакомиться с примером вызова вы можете в любой созданной по умолчанию функции.

Пример вызова DataSpace на Python

Вызов DataSpace в файле handler.py.

import os
import requests.auth
from gql import Client, gql
from gql.transport.requests import RequestsHTTPTransport
from .apig_sdk import signer

dataspace_url = os.environ.get('DATASPACE_URL')
api_key = os.environ.get('API_KEY')
api_secret = os.environ.get('API_SECRET')

# Аутентификация запроса
class DataspaceAuth(requests.auth.AuthBase):
    def __call__(self, r):
        if api_key is None or api_secret is None:
            print("API_SECRET or API_KEY is undefined. Request will not be signed")
            return r

        sig = signer.Signer()
        sig.Key = api_key
        sig.Secret = api_secret
        request = signer.HttpRequest(r.method, r.url, r.headers, r.body.decode('utf-8'))
        sig.Sign(request)
        r.headers = request.headers
        return r


# Инициализация GraphQl клиента
if dataspace_url is not None:
    transport = RequestsHTTPTransport(url=dataspace_url, auth=DataspaceAuth(), verify=False)
    client = Client(transport=transport, fetch_schema_from_transport=True)
    graphql_status = "Dataspace URL: " + dataspace_url
else:
    client = None
    graphql_status = "DATASPACE_URL environment variable is not set. GraphQL client disabled"


# Пример вызова DataSpace с подписью
def call_dataspace():
    # Запрос
    query = gql("query ($paramId: ID!) { some_operation( id: $paramId) { some_field } }")
    variable_values = {
        "paramId": "paramValue"
    }
    # Вызов Dataspace
    return client.execute(query, variable_values=variable_values)

Пример вызова DataSpace на JavaScript

Для вызова из JavaScript требуется дополнительная библиотека для GraphQL. В функции это реализовано в файле apolloClient.js, который импортируется в handler.js.

const {ApolloClient, gql, InMemoryCache, HttpLink} = require('@apollo/client/core')
const {fetch} = require('cross-fetch')
const signer = require('./signer-sdk/signer.js')

// Отключаем проверку сертификата
const https = require("https");
https.globalAgent.options.rejectUnauthorized = false

let dataspaceUrl = process.env.DATASPACE_URL
let graphQLStatus

if (!dataspaceUrl) {
    graphQLStatus = 'DATASPACE_URL environment variable is not set. GraphQL client disabled'
} else {
    graphQLStatus = `Dataspace URL: ${dataspaceUrl}`
}

// Инициализация Apollo клиента
// Вы можете экспортировать его и совершать операции: client.mutate(...), client.query(...).
// Исходящие запросы подписываются ключом и секретом(APP_KEY и APP_SECRET из переменных среды)
const client = (() => {
    // Подпись запроса
    const authFetch = (uri, options) => {
        let appKey = process.env.APP_KEY
        let appSecret = process.env.APP_SECRET

        if (!appKey || !appSecret) {
            console.log("API_SECRET or API_KEY is undefined. Request will not be signed")
        } else {
            let sig = new signer.Signer()
            sig.Key = appKey
            sig.Secret = appSecret
            let request = new signer.HttpRequest(options.method, uri, options.headers, options.body)
            sig.Sign(request)
        }

        return fetch(uri, options);
    };

    return new ApolloClient({
        cache: new InMemoryCache(),
        link: new HttpLink({uri: dataspaceUrl, fetch: authFetch})
    })
})()

// Пример вызова DataSpace с подписью
const callDataspace = async () => {
    const query = "query ($paramId: ID!) { some_operation( id: $paramId) { some_field } }"
    const variables = {"paramId": "paramValue"}
    return await client.query({query: gql`${query}`, variables: variables})
}

module.exports = {client, graphQLStatus, callDataspace}

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней