本文介紹文本審核2.0版PLUS服務SDK接入的方式。
步驟一:開通服務
訪問開通服務頁面,開通文本審核2.0版服務。
開通文本2.0版服務後,預設付費方式是按量後付費,且按照實際用量結算當日費用,不調用服務不收費。介面接入使用後系統會按使用量自動出賬。
步驟二:為RAM使用者授權
在接入SDK或者API之前,您需要為RAM使用者授權。您可以為阿里雲帳號和RAM使用者建立一個存取金鑰(AccessKey)。在調用阿里雲API時您需要使用AccessKey完成身分識別驗證。擷取方式,請參見擷取AccessKey。
操作步驟
使用阿里雲帳號登入RAM控制台。
建立RAM使用者。
具體操作,請參見建立RAM使用者。
向RAM使用者授權系統策略許可權:
AliyunYundunGreenWebFullAccess。具體操作,請參見管理RAM使用者的許可權。
完成以上配置後,您可以使用RAM使用者調用Alibaba Content Security ServiceAPI。
步驟三:安裝並接入SDK
目前支援的接入地區如下:
地區 | 外網接入地址 | 內網接入地址 | 支援服務 |
新加坡 | green-cip.ap-southeast-1.aliyuncs.com | green-cip-vpc.ap-southeast-1.aliyuncs.com | ugc_moderation_byllm_global、text_multilingual_pro_global |
英國(倫敦) | green-cip.eu-west-1.aliyuncs.com | 暫無 | |
美國(維吉尼亞) | green-cip.us-east-1.aliyuncs.com | green-cip-vpc.us-east-1.aliyuncs.com | text_multilingual_pro_global |
美國(矽谷) | green-cip.us-west-1.aliyuncs.com | 暫無 | |
德國(法蘭克福) | green-cip.eu-central-1.aliyuncs.com | green-cip-vpc.eu-central-1.aliyuncs.com |
如果需要其他語言的SDK範例程式碼,您可以通過OpenAPI開發人員門戶線上調試工具調試API介面,該工具會自動產生相應API的SDK調用範例程式碼。
阿里雲SDK代碼通過定義ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數來建立預設的訪問憑證。調用介面時,程式直接存取憑證,讀取您的存取金鑰(即AccessKey)並自動完成鑒權。您在接入SDK程式碼範例之前,請先配置環境變數。具體操作,請參見身分識別驗證配置。
SDK分為兩個版本服務,推薦直接接入本頁面的PLUS服務,如果您之前是接入的泛型服務,請參考文本審核增強版2.0版泛型服務SDK及接入指南。
文本審核增強版PLUS服務
該SDK對應介面為文本審核增強版2.0版多語言PLUS服務。
Java SDK
支援Java 1.8及以上版本。
原始代碼,請參見Java SDK源碼或者Java SDK源碼(OSS路徑)。
在pom.xml中加入相應依賴,就可以在Maven工程中使用SDK。
1、在dependencies中添加如下依賴。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>green20220302</artifactId>
<version>3.2.1</version>
</dependency>2、接入Java SDK 程式碼範例。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.green20220302.Client;
import com.aliyun.green20220302.models.TextModerationPlusRequest;
import com.aliyun.green20220302.models.TextModerationPlusResponse;
import com.aliyun.green20220302.models.TextModerationPlusResponseBody;
import com.aliyun.teaopenapi.models.Config;
public class TextModerationPlusDemo {
public static void main(String[] args) throws Exception {
Config config = new Config();
/**
* 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
* 常見擷取環境變數方式:
* 方式一:
* 擷取RAM使用者AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 擷取RAM使用者AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
* 方式二:
* 擷取RAM使用者AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 擷取RAM使用者AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
*/
config.setAccessKeyId("建議從環境變數中擷取RAM使用者AccessKey ID");
config.setAccessKeySecret("建議從環境變數中擷取RAM使用者AccessKey Secret");
//接入地區和地址請根據實際情況修改
config.setRegionId("ap-southeast-1");
config.setEndpoint("green-cip.ap-southeast-1.aliyuncs.com");
//讀取時逾時時間,單位毫秒(ms)。
config.setReadTimeout(6000);
//串連時逾時時間,單位毫秒(ms)。
config.setConnectTimeout(3000);
//設定http代理。
//config.setHttpProxy("http://xx.xx.xx.xx:xxxx");
//設定https代理。
//config.setHttpsProxy("https://xx.xx.xx.xx:xxxx");
Client client = new Client(config);
JSONObject serviceParameters = new JSONObject();
serviceParameters.put("content", "測試常值內容");
TextModerationPlusRequest textModerationPlusRequest = new TextModerationPlusRequest();
// 檢測類型
textModerationPlusRequest.setService("text_multilingual_pro_global");
textModerationPlusRequest.setServiceParameters(serviceParameters.toJSONString());
try {
TextModerationPlusResponse response = client.textModerationPlus(textModerationPlusRequest);
if (response.getStatusCode() == 200) {
TextModerationPlusResponseBody result = response.getBody();
System.out.println(JSON.toJSONString(result));
System.out.println("requestId = " + result.getRequestId());
System.out.println("code = " + result.getCode());
System.out.println("msg = " + result.getMessage());
Integer code = result.getCode();
if (200 == code) {
TextModerationPlusResponseBody.TextModerationPlusResponseBodyData data = result.getData();
System.out.println(JSON.toJSONString(data, true));
} else {
System.out.println("text moderation not success. code:" + code);
}
} else {
System.out.println("response not success. status:" + response.getStatusCode());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}Python SDK
支援Python 3.6及以上版本。
原始代碼,請參見Python SDK源碼。
1、執行如下命令引入相關依賴。
pip install alibabacloud_green20220302==3.2.12、接入Python SDK 程式碼範例。
# coding=utf-8
# python version >= 3.6
from alibabacloud_green20220302.client import Client
from alibabacloud_green20220302 import models
from alibabacloud_tea_openapi.models import Config
import json
config = Config(
# 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
# 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
# 常見擷取環境變數方式:
# 擷取RAM使用者AccessKey ID:os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID']
# 擷取RAM使用者AccessKey Secret:os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET']
access_key_id='建議從環境變數中擷取RAM使用者AccessKey ID',
access_key_secret='建議從環境變數中擷取RAM使用者AccessKey Secret',
# 連線逾時時間 單位毫秒(ms)
connect_timeout=10000,
# 讀逾時時間 單位毫秒(ms)
read_timeout=3000,
region_id='ap-southeast-1',
endpoint='green-cip.ap-southeast-1.aliyuncs.com'
)
clt = Client(config)
serviceParameters = {
'content': '測試常值內容'
}
textModerationPlusRequest = models.TextModerationPlusRequest(
# 檢測類型
service='text_multilingual_pro_global',
service_parameters=json.dumps(serviceParameters)
)
try:
response = clt.text_moderation_plus(textModerationPlusRequest)
if response.status_code == 200:
# 調用成功
result = response.body
print('response success. result:{}'.format(result))
else:
print('response not success. status:{} ,result:{}'.format(response.status_code, response))
except Exception as err:
print(err)PHP SDK
支援PHP 5.6及以上版本。
原始代碼,請參見PHP SDK源碼。
1、執行如下命令引入相關依賴。
composer require alibabacloud/green-20220302 3.2.12、接入PHP SDK 程式碼範例。
<?php
require('vendor/autoload.php');
use AlibabaCloud\SDK\Green\V20220302\Models\TextModerationPlusRequest;
use AlibabaCloud\Tea\Exception\TeaUnableRetryError;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use AlibabaCloud\SDK\Green\V20220302\Green;
$config = new Config([
/**
* 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
* 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
* 常見擷取環境變數方式:
* 擷取RAM使用者AccessKey ID:getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 擷取RAM使用者AccessKey Secret:getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
*/
"accessKeyId" => '建議從環境變數中擷取RAM使用者AccessKey ID',
"accessKeySecret" => '建議從環境變數中擷取RAM使用者AccessKey Secret',
// 設定HTTP代理。
// "httpProxy" => "http://10.10.xx.xx:xxxx",
// 設定HTTPS代理。
// "httpsProxy" => "https://10.10.xx.xx:xxxx",
"endpoint" => "green-cip.ap-southeast-1.aliyuncs.com",
"regionId" => "ap-southeast-1"
]);
// 注意,此處執行個體化的client請儘可能重複使用,避免重複建立串連,提升檢測效能。
$client = new Green($config);
$request = new TextModerationPlusRequest();
$request->service = "text_multilingual_pro_global";
$serviceParameters = array("content" => "測試內容");
$request->serviceParameters = json_encode($serviceParameters);
$runtime = new RuntimeOptions();
$runtime->readTimeout = 6000;
$runtime->connectTimeout = 3000;
try {
$response = $client->textModerationPlusWithOptions($request, $runtime);
print_r($response->body);
if (200 != $response->statusCode) {
print_r("response not success. code:" . $response->statusCode);
return;
}
$body = $response->body;
print_r("requestId = " . $body->requestId . "\n");
print_r("code = " . $body->code . "\n");
print_r("message = " . $body->message . "\n");
if (200 != $body->code) {
print_r("text moderation not success. code:" . $body->code);
}
$data = $body->data;
print_r("data = " . json_encode($data));
} catch (TeaUnableRetryError $e) {
var_dump($e->getMessage());
var_dump($e->getErrorInfo());
var_dump($e->getLastException());
var_dump($e->getLastRequest());
}Go SDK
1、執行如下命令引入相關依賴。
go get github.com/alibabacloud-go/green-20220302/v32、接入Go SDK 程式碼範例。
package main
import (
"encoding/json"
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
green20220302 "github.com/alibabacloud-go/green-20220302/v3/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"net/http"
)
func main() {
// 工程代碼泄露可能會導致AccessKey泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考,建議使用更安全的STS方式。
config := &openapi.Config{
/**
* 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
* 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
* 常見擷取環境變數方式:
* 擷取RAM使用者AccessKey ID:os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
* 擷取RAM使用者AccessKey Secret:os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
*/
AccessKeyId: tea.String("建議從環境變數中擷取RAM使用者AccessKey ID"),
AccessKeySecret: tea.String("建議從環境變數中擷取RAM使用者AccessKey Secret"),
// 設定HTTP代理。
// HttpProxy: tea.String("http://xx.xx.xx.xx:xxxx"),
// 設定HTTPS代理。
// HttpsProxy: tea.String("https://username:password@xxx.xxx.xxx.xxx:9999"),
RegionId: tea.String("ap-southeast-1"),
Endpoint: tea.String("green-cip.ap-southeast-1.aliyuncs.com"),
/**
* 請設定逾時時間。服務端全鏈路處理逾時時間為10秒,請做相應設定。
* 如果您設定的ReadTimeout小於服務端處理的時間,程式中會獲得一個ReadTimeout異常。
*/
ConnectTimeout: tea.Int(3000),
ReadTimeout: tea.Int(6000),
}
client, _err := green20220302.NewClient(config)
if _err != nil {
panic(_err)
}
// 建立RuntimeObject執行個體並設定運行參數。
runtime := &util.RuntimeOptions{}
runtime.ReadTimeout = tea.Int(10000)
runtime.ConnectTimeout = tea.Int(10000)
serviceParameters, _ := json.Marshal(
map[string]interface{}{
"content": "測試內容",
},
)
request := green20220302.TextModerationPlusRequest{
Service: tea.String("text_multilingual_pro_global"),
ServiceParameters: tea.String(string(serviceParameters)),
}
result, _err := client.TextModerationPlusWithOptions(&request, runtime)
if _err != nil {
panic(_err)
}
if *result.StatusCode != http.StatusOK {
fmt.Printf("response not success. status:%d\n", *result.StatusCode)
return
}
body := result.Body
fmt.Printf("response success. requestId:%s, code:%d, msg:%s\n", *body.RequestId, *body.Code, *body.Message)
if *body.Code != http.StatusOK {
fmt.Printf("text moderation not success. code:%d\n", *body.Code)
return
}
data := body.Data
fmt.Printf("text moderation data:%s\n", *data)
}Node.js SDK
原始代碼,請參見Node.js SDK源碼。
1、執行如下命令引入相關依賴。
npm install @alicloud/green20220302@3.2.12、接入Node.js SDK 程式碼範例。
const Green20220302 = require('@alicloud/green20220302');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
// 注意:此處執行個體化的client儘可能重複使用,提升檢測效能。避免重複建立串連。
// 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。
class Client {
static createClient() {
const config = new OpenApi.Config({
// 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。
accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
// 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
endpoint: `green-cip.ap-southeast-1.aliyuncs.com`,
});
return new Green20220302.default(config);
}
static async main() {
const client = Client.createClient();
// 構造請求對象
const textModerationPlusRequest = new Green20220302.TextModerationPlusRequest({
// 文本增強版plus檢測service,參考:https://www.alibabacloud.com/help/document_detail/2684669.html#p-t7m-66g-cv6。
"service": "text_multilingual_pro_global",
"serviceParameters": JSON.stringify({
// 待檢測文本。
"content": "測試文本"})
});
// 建立運行時設定物件
const runtime = new Util.RuntimeOptions();
try {
// 發起請求並擷取響應
const response = await client.textModerationPlusWithOptions(textModerationPlusRequest, runtime);
console.log(JSON.stringify(response.body));
} catch (error) {
// 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
// 錯誤 message
console.log('Error occurred:', error.message);
}
}
}
Client.main();C# SDK
原始代碼,請參見C# SDK源碼。
1、執行如下命令引入相關依賴。
dotnet add package AlibabaCloud.SDK.Green20220302 --version 3.2.12、接入C# SDK 程式碼範例。
// This file is auto-generated, don't edit it. Thanks.
using Newtonsoft.Json;
namespace AlibabaCloud.SDK.Green20220302
{
public class TextModerationPlusAutoRoute
{
public static void Main(string[] args)
{
/**
* 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
* 強烈建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
* 常見擷取環境變數方式:
* 擷取RAM使用者AccessKey ID:Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID")
* 擷取RAM使用者AccessKey Secret:Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
*/
String accessKeyId = "建議從環境變數中擷取RAM使用者AccessKey ID";
String accessKeySecret = "建議從環境變數中擷取RAM使用者AccessKey Secret";
// 接入地區和地址請根據實際情況修改
String endpoint = "green-cip.ap-southeast-1.aliyuncs.com";
//注意,此處執行個體化的client請儘可能重複使用,避免重複建立串連,提升檢測效能。
Client client = createClient(accessKeyId, accessKeySecret, endpoint);
// 運行時參數設定,僅對使用了該運行時參數執行個體的請求有效
AlibabaCloud.TeaUtil.Models.RuntimeOptions runtimeOptions =
new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
//構建文本檢測請求。
Models.TextModerationPlusRequest textModerationPlusRequest =
new Models.TextModerationPlusRequest();
//文本Plus檢測service樣本:nickname_detection_pro
//支援service請參考:https://www.alibabacloud.com/help/document_detail/2684669.html#p-t7m-66g-cv6
textModerationPlusRequest.Service = "text_multilingual_pro_global";
Dictionary<string, object> task = new Dictionary<string, object>();
task.Add(
"content",
"測試文本"
);
textModerationPlusRequest.ServiceParameters = JsonConvert.SerializeObject(task);
try
{
//調用API擷取檢測結果。
Models.TextModerationPlusResponse response = client.TextModerationPlusWithOptions(
textModerationPlusRequest,
runtimeOptions
);
Console.WriteLine(response.Body.RequestId);
Console.WriteLine(JsonConvert.SerializeObject(response.Body));
}
catch (Exception _err)
{
Console.WriteLine(_err);
}
}
//建立請求用戶端
public static Client createClient(
String accessKeyId,
String accessKeySecret,
String endpoint
)
{
AlibabaCloud.OpenApiClient.Models.Config config =
new AlibabaCloud.OpenApiClient.Models.Config
{
AccessKeyId = accessKeyId,
AccessKeySecret = accessKeySecret,
//設定HTTP代理。
//HttpProxy = "http://10.10.xx.xx:xxxx",
//設定HTTPS代理。
//HttpsProxy = "https://username:password@xxx.xxx.xxx.xxx:9999",
//訪問的網域名稱。
Endpoint = endpoint,
};
return new Client(config);
}
}
}HTTPS原生調用
Alibaba Content Security Service2.0版API服務也支援HTTPS原生調用,原生方式需要使用者自行封裝加解簽、拼裝請求(URL、Body、header、parameters)。通常必須使用HTTPS原生方式調用的僅有兩種情形,如非下述兩種特殊情境,建議使用SDK方式調用。
直接在App中使用,對用戶端大小有高要求。
對個別的依賴lib包有指定,不方便升級。
調用方式
服務要求地址:https://green-cip.{region}.aliyuncs.com
協議:HTTPS
方式:POST
公用請求參數
文本審核2.0版API介面的入參包含公用請求參數和具體介面請求參數,公用請求參數是指每一個介面都需要使用到的參數,以下表格是公用請求參數的詳細介紹。
名稱
類型
是否必須
描述
Format
String
是
返回訊息的格式。取值:
JSON (預設值)
XML
Version
String
是
API版本號碼,使用YYYY-MM-DD日期格式,本版本對應為2022-03-02。
AccessKeyId
String
是
阿里雲頒發給使用者的訪問服務所用的密鑰ID。
Signature
String
是
簽名結果串,關於簽名的計算方法,請參見下方簽名方式。
SignatureMethod
String
是
簽名方式,目前支援HMAC-SHA1。
Timestamp
String
是
請求的時間戳記。日期格式按照ISO8601標準表示,並需要使用UTC時間。格式為:yyyy-MM-ddTHH:mm:ssZ。例如,北京時間2022年12月12日09點13分14秒錶示為2022-12-12T01:13:14Z。
SignatureVersion
String
是
簽名演算法版本,取值為1.0。
SignatureNonce
String
是
唯一隨機數,用於防止網路重放攻擊。不同請求要使用不同的隨機數值。
Action
String
是
文本增強版Plus介面:TextModerationPlus
公用返回參數
您發送的每次介面調用請求,無論成功與否,系統都會返回唯一識別碼RequestId。其他返回參數包含label(標籤)、confidence(置信分值),服務不同返回的參數不同,詳見具體服務對應的文檔。
程式碼範例
以下返回樣本為了便於閱讀,做了格式化處理,實際返回結果沒有進行換行、縮排等格式化處理。
以下是文本審核2.0版-國際業務多語言偵測的請求樣本,其他介面請參考具體介面文檔擷取業務入參:
https://green-cip.ap-southeast-1.aliyuncs.com/ ?Format=JSON &Version=2022-03-02 &Signature=vpEEL0zFHfxXYzSFV0n7%2FZiFL9o%3D &SignatureMethod=Hmac-SHA1 &SignatureNonce=15215528852396 &SignatureVersion=1.0 &Action=TextModerationPlus &AccessKeyId=123****cip &Timestamp=2022-12-12T12:00:00Z &Service=text_multilingual_pro_global &ServiceParameters={"content": "測試文本"}以下是文本審核2.0版-國際業務多語言偵測返回參數的JSON程式碼範例:
{ "Code": 200, "Data": { "Result": [ { "Label": "political_entity", "Description":"疑似政治實體", "Confidence": 100.0, "RiskWords": "詞A,詞B,詞C" }, { "Label": "political_figure", "Description":"疑似政治人物", "Confidence": 100.0, "RiskWords": "詞A,詞B,詞C" } ], "RiskLevel": "high" }, "Message": "OK", "RequestId": "AAAAAA-BBBB-CCCCC-DDDD-EEEEEEEE****" }簽名方式
文本審核2.0版服務會對每個訪問的請求進行身分識別驗證,因此,需要在請求中包含簽名(Signature)資訊。文本審核2.0版服務通過使用AccessKey ID和AccessKey Secret進行對稱式加密的方法來驗證請求的寄件者身份。
AccessKey ID和AccessKey Secret由阿里雲官方頒發給訪問者(可以通過阿里雲官方網站申請和管理),其中AccessKey ID用於標識訪問者身份;AccessKey Secret是用於加密簽名字串和伺服器端驗證簽名字串的密鑰,必須嚴格保密,只有阿里雲和使用者知道。
使用者在訪問時,按照下面的方法對請求進行簽名處理:
使用請求參數構造正常化的請求字串(Canonicalized Query String)。
按照參數名稱的字典順序對請求中所有的請求參數(包括公用請求參數和給定了的請求介面的自訂參數,但不能包括公用請求參數中提到的Signature參數本身)進行排序。
對相關請求參數的名稱和值進行編碼。名稱和值要使用UTF-8字元集進行URL編碼。
說明一般支援URL編碼的庫(比如Java中的java.net.URLEncoder)都是按照application/x-www-form-urlencoded的MIME類型的規則進行編碼的。實現時可以直接使用這類方式進行編碼,把編碼後的字串中加號(+)替換成%20、星號(*)替換成%2A、%7E替換回波浪號(~),即可得到上述規則描述的編碼字串。
URL編碼的編碼規則如下:
對於字元A-Z、a-z、0-9以及字元中劃線(-)、底線(_)、半形句號(.)、波浪線(~)不編碼。
對於其它字元編碼成
%XY的格式,其中XY是字元對應ASCII碼的16進位表示。比如英文的雙引號(")對應的編碼就是%22。對於擴充的UTF-8字元,編碼成
%XY%ZA…的格式。需要說明的是英文空格( )要被編碼是
%20,而不是加號(+)。
對編碼後的參數名稱和值使用英文等號(=)進行串連。
將英文等號串連得到字串按參數名稱的字典順序依次使用&符號串連,即得到正常化請求字串。
使用a.i構造的正常化字串按照下面的規則構造用於計算簽名的字串。
StringToSign= HTTPMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString)說明其中HTTPMethod是提交請求用的HTTP方法,比如POST。percentEncode(/)是按照a.ii中描述的URL編碼規則對字元(/)進行編碼得到的值,即
%2F。percentEncode(CanonicalizedQueryString)是對a.i中構造的正常化請求字串按a.ii中描述的URL編碼規則編碼後得到的字串。按照RFC2104的定義,使用上面的用於簽名的字串計算簽名HMAC值。
說明注意計算簽名時使用的Key就是使用者持有的AccessKey Secret並加上一個
&字元(ASCII:38),使用的雜湊演算法是SHA1。按照Base64編碼規則把上面的HMAC值編碼成字串,即得到簽名值(Signature)。
將得到的簽名值作為Signature參數添加到請求參數中,即完成對請求籤名的過程。
說明得到的簽名值在作為最後的請求參數值提交給Alibaba Content Security Service伺服器時,要和其他參數一樣,按照RFC3986的規則進行URL編碼。