使用SDK執(zhí)行HTTP函數(shù)
本文介紹如何使用不同語言SDK提供的接口,執(zhí)行HTTP觸發(fā)器函數(shù)。
背景信息
函數(shù)計算根據(jù)請求頭部的Authorization字段校驗每一個請求是否合法。只有使用與函數(shù)計算一致的簽名算法才能通過驗證,未包含簽名字段或者簽名錯誤的請求,函數(shù)計算將返回HTTP 403
錯誤。關于簽名算法的更多信息,請參見簽名認證。
函數(shù)計算的SDK已經(jīng)提供接口執(zhí)行HTTP函數(shù),且SDK已經(jīng)實現(xiàn)簽名算法,支持對該接口進行簽名,無需您手動計算簽名。更多信息,請參見SDK列表。
如果HTTP觸發(fā)器設置了允許匿名訪問函數(shù),即觸發(fā)器配置中參數(shù)是否需要認證選擇為否,則無需校驗,也無需計算簽名。
使用場景
函數(shù)計算的Golang,Python和Java語言支持HTTP觸發(fā)器的簽名調(diào)用。您可以在以下三種場景,使用函數(shù)計算的SDK。
簽名場景下調(diào)用HTTP觸發(fā)器。推薦在測試場景中使用。
匿名場景下調(diào)用HTTP觸發(fā)器。推薦在測試場景中使用。
集成場景下對HTTP Request進行簽名,然后使用自定義HTTP Client處理簽名后的請求,以達到最優(yōu)的性能以及最佳的擴展性。推薦在生產(chǎn)環(huán)境中使用。
使用示例
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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 本示例以將AccessKey和AccessSecretKey保存在環(huán)境變量中來實現(xiàn)身份驗證為例。 運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會被自動設置。 */ 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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 本示例以將AccessKey和AccessSecretKey保存在環(huán)境變量中來實現(xiàn)身份驗證為例。 運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會自動被設置。 */ 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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 本示例以將AccessKey和AccessSecretKey保存在環(huán)境變量中來實現(xiàn)身份驗證為例。 運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會自動被設置。 */ 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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 # 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 # 本示例以將AccessKeyID和AccessKeySecret保存在環(huán)境變量中實現(xiàn)身份驗證為例。 # 運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 # 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會自動被設置。 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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 # 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 # 本示例以將AccessKeyID和AccessKeySecret保存在環(huán)境變量中實現(xiàn)身份驗證為例。 # 運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 # 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會自動被設置。 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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 # 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 # 本示例以將AccessKeyID和AccessKeySecret保存在環(huán)境變量中實現(xiàn)身份驗證為例。 # 運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 # 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會自動被設置。 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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 本示例以將AccessKey和AccessSecretKey保存在環(huán)境變量中來實現(xiàn)身份驗證為例。 運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會自動被設置。 */ 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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 本示例以將AccessKey和AccessSecretKey保存在環(huán)境變量中來實現(xiàn)身份驗證為例。 在運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會自動被設置。 */ 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的訪問權(quán)限,建議您使用RAM用戶進行API訪問或日常運維。 建議不要把AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。 本示例以將AccessKey和AccessSecretKey保存在環(huán)境變量中實現(xiàn)身份驗證為例。 運行本示例前請先在本地環(huán)境中設置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 在FC Runtime運行環(huán)境下,配置執(zhí)行權(quán)限后,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環(huán)境變量會自動被設置。 */ 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()); } } }
常見問題
在執(zhí)行HTTP函數(shù)時,出現(xiàn)方法不存在等報錯信息,要怎么處理?
問題現(xiàn)象:在執(zhí)行HTTP函數(shù)時,出現(xiàn)報錯信息為
AttributeError: 'Client' object has no attribute 'sign_request'
。問題原因:可能的原因是代碼中使用了舊版本的函數(shù)計算SDK。
解決方案:建議升級函數(shù)計算SDK到最新版本。更多信息,請參見SDK列表。