本文介紹如何使用不同語言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列表。