本文介绍如何使用不同语言SDK提供的接口,执行HTTP触发器函数。
背景信息
函数计算根据请求头部的Authorization字段校验每一个请求是否合法。只有使用与函数计算一致的签名算法才能通过验证,未包含签名字段或者签名错误的请求,函数计算将返回HTTP 403
错误。关于签名算法的更多信息,请参见签名认证。
函数计算的SDK已经提供接口执行HTTP函数,且SDK已经实现签名算法,支持对该接口进行签名,无需您手动计算签名。更多信息,请参见SDK列表。
如果HTTP触发器设置了允许匿名访问函数,即触发器配置中参数是否需要认证选择为否,则无需校验,也无需计算签名。
使用场景
函数计算的Golang,Python和Java语言支持HTTP触发器的签名调用。您可以在以下三种场景,使用函数计算的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'
。问题原因:可能的原因是代码中使用了旧版本的函数计算SDK。
解决方案:建议升级函数计算SDK到最新版本。更多信息,请参见SDK列表。