本文介绍如何使用不同语言SDK提供的接口执行HTTP触发器(需要身份认证)函数。
背景信息
函数计算服务会根据请求头部的Authorization字段来校验每一个请求是否合法。
说明 设置了HTTP触发器的允许匿名访问的函数不可以校验。
您须使用与函数计算服务端一致的签名算法才能通过验证。未包含签名字段或者签名错误的请求,函数计算将会返回HTTP 403
错误。具体信息,请参见签名认证。
函数计算提供的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>";
public static void main(final String[] args) throws IOException, InvalidKeyException, IllegalStateException {
String accountId = "XXX";
String accessKey = "XXX";
String accessSecretKey = "XXX";
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
- 执行以下代码安装依赖。
- 代码示例。更多接口信息,请参见SDK源码。
# -*- coding: utf-8 -*-
import fc2
client = fc2.Client(
endpoint='<Your Endpoint>',
accessKeyID='<Your AccessKeyID>',
accessKeySecret='<Your AccessKeySecret>')
req = client.do_http_request( "method", "serviceName", "functionName", "path", headers={}, params=None, body=bytes('hello_world'.encode('utf-8')))
print (req.status_code)
PHP
- 您可以通过以下两种方式安装依赖。
- 运行
composer install——no dev
安装依赖项。安装Composer依赖关系管理器后,在PHP代码中导入依赖关系。require_once __DIR__ . '/vendor/autoload.php';
- 代码示例。更多接口信息,请参见SDK源码。
<?php
require_once __DIR__ . '/vendor/autoload.php';
use AliyunFC\Client;
$fcClient = new Client([
"endpoint" => '<Your Endpoint>',
"accessKeyID" =>'<Your AccessKeyID>',
"accessKeySecret" =>'<Your AccessKeySecret>'
]);
$res = $fcClient->doHttpRequest("method", "serviceName", "functionName", "path", $headers = [], $unescapedQueries = [], $data = null);
$s = $res->getStatusCode();
$data = $res->getBody()->getContents();
var_dump($s);
var_dump($data);
Node.js
- 执行以下代码安装依赖。
npm install @alicloud/fc2 --save
- 代码示例。GET请求调用示例如下,更多接口信息,请参见SDK源码。
'use strict';
var FCClient = require('@alicloud/fc2');
var client = new FCClient('<Your AccountID>', {
accessKeyID: '<Your AccessKeyID>',
accessKeySecret: '<Your AccessKeySecret>',
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)
{
var fcClient = new FCClient("<Your Region>", "<Your AccountID>", "<Your AccessKeyID>", "<Your 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 (
"fmt"
"io"
"net/http"
"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) {
fcClient, _ := fc.NewClient("<Your Endpoint>", "2016-08-15", "<Your AccessKeyID>", "<Your 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)
}