背景
TencentCloudのAPIをPostmanで利用したい時、どのようにすればいいか悩む方はいらっしゃるかと思いますので、
この記事では、PostmanでTencentCloudのAPIを利用できる環境設定の手順を紹介します。
1.Collection Pre-request Scriptを設定する
目的:
CollectionのPre-request Scriptの中でbuild_request関数を定義します。この関数は、公式のTencent Cloudドキュメントが提供するメソッドに従って、HTTP要求ヘッダーのフィールドを生成するために使用されます。Tencent CloudのID検証がTencent Cloudのさまざまなクラウド製品にアクセスできるように、署名の生成に重点が置かれています。この関数をCollectionに追加するのはCodeの再利用も目的であるため、Collection内の各リクエストはリクエストパラメータを定義するだけで済みます。
Postmanでの設定場所:
新しくCollectionを作るか、既存のCollectionのeditで以下のキャプチャのように設定スクリプトを追加します。
スクリプト:
pm.globals.set("TencentCloudApi", function TencentCloudApi() {
let tencentcloudapi = {};
function sha256_hex(msg) {
var utf8_str = CryptoJS.enc.Utf8.parse(msg);
var sha256_str = CryptoJS.SHA256(utf8_str);
var sha256_hex_str = CryptoJS.enc.Hex.stringify(sha256_str);
return sha256_hex_str;
}
function sign_hmac256(key, msg) {
var utf8_str = CryptoJS.enc.Utf8.parse(msg);
var hash_str = CryptoJS.HmacSHA256(utf8_str, key);
return hash_str;
}
function sign_hmac256_hex(key, msg) {
var utf8_str = CryptoJS.enc.Utf8.parse(msg);
var hash_str = CryptoJS.HmacSHA256(utf8_str, key);
var hex_str = CryptoJS.enc.Hex.stringify(hash_str);
return hex_str;
}
function get_pm_env_or_global(key) {
return (pm.environment.get(key) !== undefined)? pm.environment.get(key): pm.globals.get(key);
}
tencentcloudapi.build_request = function build_request(params) {
var service = pm.environment.get("service");
var host = service + get_pm_env_or_global("tencentcloud_endpoint");
var region = pm.environment.get("region");
var version = pm.environment.get("version");
var action = request.headers["X-TC-Action"];
var algorithm = "TC3-HMAC-SHA256";
var timestamp = Math.round(Date.now() / 1000);
var d = new Date();
var date = d.toISOString().split('T')[0];
// step 1:create canonical_request
var http_request_method = "POST";
var canonical_uri = "/";
var canonical_querystring = "";
// tencentcloud suggests to add charset=utf-8, however postman will set content-type to
// application/json when request data format json is selected. So we don't add charset.
//content_type = "application/json; charset=utf-8";
var content_type = "application/json";
var request_json_payload = JSON.stringify(params);
var canonical_headers = "content-type:" + content_type + "\nhost:" + host + "\n";
var signed_headers = "content-type;host";
var hashed_request_payload = sha256_hex(request_json_payload);
var canonical_request = http_request_method + "\n" +
canonical_uri + "\n" +
canonical_querystring + "\n" +
canonical_headers + "\n" +
signed_headers + "\n" +
hashed_request_payload;
//console.log('canonical_request');
//console.log(canonical_request);
// step 2:create signing_string
var credential_scope = date + "/" + service + "/" + "tc3_request";
var hashed_canonical_request = sha256_hex(canonical_request);
var string_to_sign = algorithm + "\n" +
timestamp.toString() + "\n" +
credential_scope + "\n" +
hashed_canonical_request;
//console.log('string_to_sign');
//console.log(string_to_sign);
// step 3:calculate signature
var secret_id = get_pm_env_or_global("secret_id");
var secret_key = get_pm_env_or_global("secret_key");
var secret_date_key = CryptoJS.enc.Utf8.parse("TC3" + secret_key);
var secret_date = sign_hmac256(secret_date_key, date);
var secret_service = sign_hmac256(secret_date, service);
var secret_signing = sign_hmac256(secret_service, "tc3_request");
var signature = sign_hmac256_hex(secret_signing, string_to_sign);
//console.log("signature");
//console.log(signature);
// step 4:create authorization
var authorization = algorithm + " " +
"Credential=" + secret_id + "/" + credential_scope + ", " +
"SignedHeaders=" + signed_headers + ", " +
"Signature=" + signature;
//console.log("authorization");
//console.log(authorization);
// step 5: add HTTP headers
pm.request.headers.add("X-TC-Region:"+region);
pm.request.headers.add("X-TC-Timestamp:"+timestamp);
pm.request.headers.add("X-TC-Version:"+version);
pm.request.headers.add("Authorization:"+authorization);
pm.request.headers.add("Host:"+host);
// step 6: set environment variables using in request
pm.environment.set("host", host);
pm.environment.set("request_json_payload", request_json_payload);
};
return tencentcloudapi;
} + 'TencentCloudApi();'
);
2.Environmentsを設定する
目的:
APIを利用する際の権限認証等の情報を設定します。
Postmanでの設定場所:
右上にあるEnviroment設定ボタンをクリックします。
Addボタンをクリックします。
CURRENT VALUEに以下のように情報を追加します。
(INITIAL VALUEに情報を記入する必要がありません。キャプチャは既存設定であるため自動的に記入されています。)
追加する情報は以下となります。ここでは、LVBというライブ配信のプロダクトのAPIを例とします。
secret_id:ご自身のIDを記載してください
secret_key:ご自身のKeyを記載してください
region:ap-tokyo
service:live
tencentcloud_endpoint:.tencentcloudapi.com
version:2018-08-01
以下の情報は追加する必要はありません。すべての設定が完了すると、自動追加されます。
host
request_json_payload
これで環境設定は完了しました。次に、実際のAPIリクエストを実行してみます。
3.HTTPのリクエストBodyを設定する
先ほどCollectionのPre-requestでbuild_request関数で、リクエストのデータを環境変数のrequest_json_payloadに書き込むように設定したため、Bodyには{{request_json_payload}}
のみ記載し、フォーマットをJSONに選択するだけでOKです。
4.CreateLiveCallbackTemplateを作成する
Pre-request ScriptでCreateLiveCallbackTemplateを作成します。
※ 上記リンクをクリックすると、TencentCloudのLVBのCreateLiveCallbackTemplateのAPIのドキュメントに飛びます。そこで、APIのリクエストパラメータ及びレスボンスパラメータを確認することができます。
Scrpitの内容は以下となります。
var action = "CreateLiveCallbackTemplate";
pm.request.headers.add("X-TC-Action:"+action);
var params = {
"TemplateName":"test",
"Description":"test",
"RecordNotifyUrl":"http://www.qq.com/api/notify?action=record",
"CallbackKey":"testkey"
};
eval(pm.globals.get('TencentCloudApi')).build_request(params);
あと、APIのURLhttps://live.tencentcloudapi.com/
を記載して実際にAPIを叩くと、以下の様にテンプレートIDが返されますので、問題なくAPIを実行できました。
これで一通りPostmanでのTencentCloud APIの実行環境及びテストが終わりました。
あと少し補足ですが、JSON形式でAPIを実行する場合、HTTP POSTでリクエストする必要があります。