全部產品
Search
文件中心

Function Compute:使用SDK執行HTTP函數

更新時間:Jul 06, 2024

本文介紹如何使用不同語言SDK提供的介面,執行HTTP觸發器函數。

背景資訊

Function Compute根據要求標頭部的Authorization欄位校正每一個請求是否合法。只有使用與Function Compute一致的簽名演算法才能通過驗證,未包含簽名欄位或者簽名錯誤的請求,Function Compute將返回HTTP 403錯誤。關於簽名演算法的更多資訊,請參見簽名認證

Function Compute的SDK已經提供介面執行HTTP函數,且SDK已經實現簽名演算法,支援對該介面進行簽名,無需您手動計算簽名。更多資訊,請參見SDK列表

說明

如果HTTP觸發器設定了允許匿名訪問函數,即觸發器配置中參數是否需要認證選擇為,則無需校正,也無需計算簽名。

使用情境

Function Compute的Golang,Python和Java語言支援HTTP觸發器的簽名調用。您可以在以下三種情境,使用Function Compute的SDK。

  • 簽名情境下調用HTTP觸發器。推薦在測試情境中使用。

  • 匿名情境下調用HTTP觸發器。推薦在測試情境中使用。

  • 整合情境下對HTTP Request進行簽名,然後使用自訂HTTP Client處理簽名後的請求,以達到最優的效能以及最佳的擴充性。推薦在生產環境中使用。

使用樣本

Golang

更多資訊,請參見Golang

安裝

使用go mod工具安裝。

# install alibabacloud_fc_open20210406
go get -u github.com/alibabacloud-go/fc-open-20210406

使用

  • 簽名情境

    package main
    
    import (
        "fmt"
        "net/http"
        "net/http/httputil"
        "os"
    
        openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
        client "github.com/alibabacloud-go/fc-open-20210406/client"
    )
    
    func main() {
        config := &openapi.Config{}
        /*
            阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
            建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
            本樣本以將AccessKey和AccessSecretKey儲存在環境變數中來實現身分識別驗證為例。
            運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會被自動化佈建。
      */
        ak := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
        sk := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
        url := os.Getenv("url")
    
        config.SetAccessKeyId(ak)
        config.SetAccessKeySecret(sk)
        config.SetRegionId("cn-hangzhou")
        c, err := client.NewClient(config)
        if err != nil {
            panic(err)
        }
        method := "POST"
        headers := &http.Header{}
        headers.Add("k1", "v1")
        resp, err := c.InvokeHTTPTrigger(&url, &method, []byte("abc"), headers)
        if err != nil {
            panic(err)
        }
        str, _ := httputil.DumpResponse(resp, true)
        fmt.Printf("response: %+v\n", string(str))
    }
  • 匿名情境

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"net/http/httputil"
    	"os"
    
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	client "github.com/alibabacloud-go/fc-open-20210406/client"
    )
    
    func main() {
    	config := &openapi.Config{}
    	/*
    		阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
    		建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
    		本樣本以將AccessKey和AccessSecretKey儲存在環境變數中來實現身分識別驗證為例。
    		運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    		在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
          */
    	ak := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
    	sk := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    	url := os.Getenv("url")
    
    	config.SetAccessKeyId(ak)
    	config.SetAccessKeySecret(sk)
    	config.SetRegionId("cn-hangzhou")
    	c, err := client.NewClient(config)
    	if err != nil {
    		panic(err)
    	}
    	method := "POST"
    	headers := &http.Header{}
    	headers.Add("k1", "v1")
    	resp, err := c.InvokeAnonymousHTTPTrigger(&url, &method, []byte("abc"), headers)
    	if err != nil {
    		panic(err)
    	}
    	str, _ := httputil.DumpResponse(resp, true)
    	fmt.Printf("response: %+v\n", string(str))
    }
  • 整合情境

    package main
    
    import (
    	"fmt"
    	"net/http"
    	"net/http/httputil"
    	"os"
    
    	openapi "github.com/alibabacloud-go/darabonba-openapi/client"
    	client "github.com/alibabacloud-go/fc-open-20210406/v2/client"
    )
    
    func main() {
    	config := &openapi.Config{}
    	/*
    	阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
    	建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
    	本樣本以將AccessKey和AccessSecretKey儲存在環境變數中來實現身分識別驗證為例。
    	運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
           */
    	ak := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
    	sk := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
    	url := os.Getenv("url")
    
    	config.SetAccessKeyId(ak)
    	config.SetAccessKeySecret(sk)
    	config.SetRegionId("cn-hangzhou")
    	c, err := client.NewClient(config)
    	if err != nil {
    		panic(err)
    	}
    	method := "GET"
    	request, err := http.NewRequest(method, url, nil)
    	if err != nil {
    		panic(err)
    	}
    	request, err = c.SignRequest(request)
    	if err != nil {
    		panic(err)
    	}
    	resp, err := http.DefaultClient.Do(request)
    	if err != nil {
    		panic(err)
    	}
    	str, _ := httputil.DumpResponse(resp, true)
    	fmt.Printf("response: %+v\n", string(str))
    }                  

Python

更多資訊,請參見Python

安裝

使用pip工具安裝。

# install alibabacloud_fc_open20210406
pip install -U alibabacloud_fc_open20210406

使用

  • 簽名情境

    # -*- coding: utf-8 -*-
    import os
    
    from alibabacloud_fc_open20210406.client import Client
    from alibabacloud_tea_openapi import models as open_api_models
    
    # 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
    # 建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
    # 本樣本以將AccessKeyID和AccessKeySecret儲存在環境變數中實現身分識別驗證為例。
    # 運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    # 在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
    ak = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID')
    sk = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
    url = os.getenv('url')
    
    client = Client(config=open_api_models.Config(access_key_id=ak,
                                                  access_key_secret=sk,
                                                  region_id='cn-hangzhou'))
    
    resp = client.invoke_httptrigger(url=url,
                                     method="GET",
                                     body="anything".encode(encoding='utf-8'),
                                     headers={"k1": "v1", "k2": "v2"})
  • 匿名情境

    import os
    
    from alibabacloud_fc_open20210406.client import Client
    from alibabacloud_tea_openapi import models as open_api_models
    
    # 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
    # 建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
    # 本樣本以將AccessKeyID和AccessKeySecret儲存在環境變數中實現身分識別驗證為例。
    # 運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    # 在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
    ak = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID')
    sk = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
    url = os.getenv('url')
    
    client = Client(config=open_api_models.Config(access_key_id=ak,
                                                  access_key_secret=sk,
                                                  region_id='cn-hangzhou'))
    
    resp = client.invoke_anonymous_httptrigger(url=url,
                                     method="GET",
                                     body="anything".encode(encoding='utf-8'),
                                     headers={"k1": "v1", "k2": "v2"})
  • 整合情境

    import requests
    import os
    
    from alibabacloud_fc_open20210406.client import Client
    from alibabacloud_tea_openapi import models as open_api_models
    
    # 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
    # 建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
    # 本樣本以將AccessKeyID和AccessKeySecret儲存在環境變數中實現身分識別驗證為例。
    # 運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
    # 在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
    ak = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID')
    sk = os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
    url = os.getenv('url')
    
    client = Client(config=open_api_models.Config(access_key_id=ak,
                                                  access_key_secret=sk,
                                                  region_id='cn-hangzhou'))
    
    # build your own request
    req = requests.Request(
        url=url,
        method='GET'
    )
    req = client.sign_request(req)
    with requests.Session() as s:
        prep=s.prepare_request(req)
        resp = s.send(prep)

Java

更多資訊,請參見Java

安裝

使用Maven工具或Gradle工具管理依賴,Maven依賴座標如下。

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>fc_open20210406</artifactId>
  <!-- use the latest version instead -->
  <version>2.0.4</version>
</dependency>

使用

  • 簽名情境

    package com.aliyun.example;
    
    import com.aliyun.fc_open20210406.Client;
    import com.aliyun.teaopenapi.models.Config;
    import okhttp3.Headers;
    import okhttp3.Response;
    
    import java.nio.charset.StandardCharsets;
    
    
    public class Main {
        public static void main(String[] args) throws Exception {
            /*
            阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
            建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
            本樣本以將AccessKey和AccessSecretKey儲存在環境變數中來實現身分識別驗證為例。
            運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
         	 	*/
            String ak = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String sk = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            String url = System.getenv("url");
            Config config = new Config().setAccessKeyId(ak).setAccessKeySecret(sk).setRegionId("cn-hangzhou");
    
            Client client = new Client(config);
            try (Response res = client.InvokeHTTPTrigger(url, "POST", "mybodystring".getBytes(StandardCharsets.UTF_8), new Headers.Builder().build())) {
                System.out.println(res.toString());
                System.out.println(res.body().string());
            }
        }
    }
  • 匿名情境

    package com.aliyun.example;
    
    import com.aliyun.fc_open20210406.Client;
    import com.aliyun.teaopenapi.models.Config;
    import okhttp3.Headers;
    import okhttp3.Response;
    
    import java.nio.charset.StandardCharsets;
    
    public class Main {
        public static void main(String[] args) throws Exception {
            /*
            阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
            建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
            本樣本以將AccessKey和AccessSecretKey儲存在環境變數中來實現身分識別驗證為例。
            在運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
         	*/
            String ak = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String sk = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            String url = System.getenv("url");
            Config config = new Config().setAccessKeyId(ak).setAccessKeySecret(sk).setRegionId("cn-hangzhou");
    
            Client client = new Client(config);
            try (Response res = client.InvokeAnonymousHTTPTrigger(url, "POST", "mybodystring".getBytes(StandardCharsets.UTF_8), new Headers.Builder().build())) {
                System.out.println(res.toString());
                System.out.println(res.body().string());
            }
        }
    }
  • 整合情境

    package com.aliyun.example;
    
    import com.aliyun.fc_open20210406.Client;
    import com.aliyun.tea.okhttp.OkHttpClientBuilder;
    import com.aliyun.teaopenapi.models.Config;
    import okhttp3.*;
    
    import java.nio.charset.StandardCharsets;
    
    
    public class Main {
        public static void main(String[] args) throws Exception {
            /*
            阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
            建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
            本樣本以將AccessKey和AccessSecretKey儲存在環境變數中實現身分識別驗證為例。
            運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
            在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
         	*/
            String ak = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            String sk = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            String url = System.getenv("url");
            Config config = new Config().setAccessKeyId(ak).setAccessKeySecret(sk).setRegionId("cn-hangzhou");
    
            Client client = new Client(config);
            OkHttpClient okHttpClient = new OkHttpClientBuilder().buildOkHttpClient();
    
            Request request = new Request.Builder()
                    .url(url)
                    .post(RequestBody.create(MediaType.parse("application/json"),
                            "mybodystring".getBytes(StandardCharsets.UTF_8)))
                    .build();
    
            // sign your request
            request = client.SignRequest(request);
            try (Response res = okHttpClient.newCall(request).execute()) {
                System.out.println(res.toString());
                System.out.println(res.body().string());
            }
        }
    }

常見問題

在執行HTTP函數時,出現方法不存在等報錯資訊,要怎麼處理?

  • 問題現象:在執行HTTP函數時,出現報錯資訊為AttributeError: 'Client' object has no attribute 'sign_request'

  • 問題原因:可能的原因是代碼中使用了舊版本的Function ComputeSDK。

  • 解決方案:建議升級Function ComputeSDK到最新版本。更多資訊,請參見SDK列表