本文介紹如何使用不同語言SDK提供的介面執行HTTP觸發器(需要身份認證)函數。
背景資訊
Function Compute服務會根據要求標頭部的Authorization欄位來校正每一個請求是否合法。
說明 設定了HTTP觸發器的允許匿名訪問的函數不可以校正。
您必須使用與Function Compute服務端一致的簽名演算法才能通過驗證。未包含簽名欄位或者簽名錯誤的請求,Function Compute將會返回HTTP 403錯誤。具體資訊,請參見簽名認證。
Function Compute提供的SDK中已經提供了介面執行HTTP觸發器函數,無需您手動計算。具體資訊,請參見SDK列表。
Java
- 執行以下代碼,將Maven依賴項添加到pom.xml中。
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-fc</artifactId> <version>1.8.32</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.20</version> </dependency> - 程式碼範例。更多介面資訊,請參見SDK源碼。
import com.alibaba.fastjson.JSONObject; import com.aliyuncs.fc.client.FunctionComputeClient; import com.aliyuncs.fc.model.HttpAuthType; import com.aliyuncs.fc.model.HttpMethod; import com.aliyuncs.fc.request.*; import com.aliyuncs.fc.response.*; import java.io.IOException; import java.security.InvalidKeyException; public class testJavaSDK { private static final String REGION = "cn-hangzhou"; private static final String SERVICE_NAME = "<Your serviceName>"; private static final String FUNCTION_NAME = "<Your functionName>"; /* 阿里雲帳號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環境變數會自動被設定。 */ public static void main(final String[] args) throws IOException, InvalidKeyException, IllegalStateException { String accountId = "XXX"; String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); String accessSecretKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); FunctionComputeClient fcClient = new FunctionComputeClient(REGION, accountId, accessKey, accessSecretKey); HttpInvokeFunctionRequest request = new HttpInvokeFunctionRequest(SERVICE_NAME,FUNCTION_NAME, HttpAuthType.FUNCTION, HttpMethod.POST, null); JSONObject object = new JSONObject(); object.put("string","string"); object.put("int","123"); String payload = object.toJSONString(); request.setPayload(payload.getBytes()); request.setHeader("Content-Type", "application/json"); InvokeFunctionResponse invkResp = fcClient.invokeFunction(request); System.out.println(new String(invkResp.getContent())); } }
Python
- 執行以下代碼安裝依賴。
pip install aliyun-fc2 - 程式碼範例。更多介面資訊,請參見SDK源碼。
# -*- coding: utf-8 -*- import fc2 import os # 阿里雲帳號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環境變數會自動被設定。 accessKeyID=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID') accessKeySecret=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET') endpoint='<Your Endpoint>' client = fc2.Client( endpoint=endpoint, accessKeyID=accessKeyID, accessKeySecret=accessKeySecret) req = client.do_http_request( "method", "serviceName", "functionName", "path", headers={}, params=None, body=bytes('hello_world'.encode('utf-8'))) print (req.status_code)關於Endpoint的設定,請參見服務接入地址。
PHP
- 您可以通過以下兩種方式安裝依賴。
- 執行Composer命令安裝依賴。
composer require aliyunfc/fc-php-sdk - 在composer.json檔案中聲明對Alibaba Cloud FC SDK for PHP的依賴關係。
"require":{ "aliyunfc/fc-php-sdk": "~1.2" }
- 執行Composer命令安裝依賴。
- 運行
composer install安裝依賴項。安裝Composer依賴關係管理器後,在PHP代碼中匯入依賴關係。require_once __DIR__ . '/vendor/autoload.php'; - 程式碼範例。更多介面資訊,請參見SDK源碼。
<?php require_once __DIR__ . '/vendor/autoload.php'; use AliyunFC\Client; # 阿里雲帳號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環境變數會自動被設定。 $fcClient = new Client([ "endpoint" => '<Your Endpoint>', "accessKeyID" => getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), "accessKeySecret" => getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET') ]); $res = $fcClient->doHttpRequest("method", "serviceName", "functionName", "path", $headers = [], $unescapedQueries = [], $data = null); $s = $res->getStatusCode(); $data = $res->getBody()->getContents(); var_dump($s); var_dump($data);關於Endpoint的設定,請參見服務接入地址。
Node.js
- 執行以下代碼安裝依賴。
npm install @alicloud/fc2 --save - 程式碼範例。GET請求調用樣本如下,更多介面資訊,請參見SDK源碼。
'use strict'; var FCClient = require('@alicloud/fc2'); /* 阿里雲帳號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環境變數會自動被設定。 */ var client = new FCClient('<Your AccountID>', { accessKeyID: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'], accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'], region: '<Your Region>', }); async function test () { try { var headers ={} var resp = await client.get('/proxy/${serviceName}/${functionName}/${path}',null,headers ) console.log('invoke function: %j', resp); } catch (err) { console.error(err); } } test().then();
.NET Core
- 執行以下代碼,在.csproj檔案中添加如下
package安裝依賴。<ItemGroup> <PackageReference Include="Aliyun.FC.SDK.NetCore" Version="1.0.0" /> </ItemGroup> - 程式碼範例。更多介面資訊,請參見SDK源碼。
using System; using System.Collections.Generic; using Aliyun.FunctionCompute.SDK.Client; using Aliyun.FunctionCompute.SDK.Request; namespace mynetcore{ class Program { static void Main(string[] args) { /* 阿里雲帳號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環境變數會自動被設定。 */ var accessKeyID = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"); var accessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); var fcClient = new FCClient("<Your Region>", "<Your AccountID>", accessKeyID, accessKeySecret); var customHeaders = new Dictionary<string, string> { }; Dictionary<string, string[]> unescapedQueries = new Dictionary<string, string[]> { }; byte[] payload = new byte[]{ }; var resposnse = fcClient.InvokeHttpFunction(new HttpInvokeFunctionRequest("serviceName", "functionName", "method", "path", "qualifier", payload, unescapedQueries ,customHeaders)); Console.WriteLine(resposnse.StatusCode); } } }
Go
- 執行以下代碼安裝依賴。
go get -u github.com/aliyun/fc-go-sdk - 程式碼範例。更多介面資訊,請參見SDK源碼。
import ( "io" "net/http" "os" "time" fc "github.com/aliyun/fc-go-sdk" ) func doPost(serviceName, functionName, qualifier, path string, headers http.Header, queries map[string][]string, bodyReader io.Reader) (*http.Response, error) { /* 阿里雲帳號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環境變數會自動被設定。 */ accessKeyID := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") accessKeySecret := os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") fcClient, _ := fc.NewClient("<Your AccountID>", "2016-08-15", accessKeyID, accessKeySecret) method := http.MethodPost expires := time.Now().Add(5 * time.Minute) input := fc.NewSignURLInput(method, serviceName, functionName, expires) input.WithQualifier(qualifier).WithHeader(headers).WithQueries(queries).WithEscapedPath(path) url, err := fcClient.SignURL(input) if err != nil { return nil, err } req, err := http.NewRequest(method, url, bodyReader) for k, values := range headers { for _, v := range values { req.Header.Add(k, v) } } c := &http.Client{} return c.Do(req) }