PostmanでTencentCloudのAPIを利用するについて

# 背景
[TencentCloud](https://intl.cloud.tencent.com/jp)の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で以下のキャプチャのように設定スクリプトを追加します。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253379/9415d7a8-a4b9-a930-3c5e-bb6e8624dad2.png)
スクリプト：
 
```javascript

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設定ボタンをクリックします。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253379/b2e17bd5-056c-027b-95ea-d10b0c50f044.png)
Addボタンをクリックします。
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253379/24a4b950-ecd1-371d-436e-183d73555233.png)
CURRENT VALUEに以下のように情報を追加します。
（INITIAL VALUEに情報を記入する必要がありません。キャプチャは既存設定であるため自動的に記入されています。）
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253379/d71c6473-c6f4-9ff0-9435-8166a2867535.png)
追加する情報は以下となります。ここでは、[LVB](https://intl.cloud.tencent.com/jp/product/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です。

以下のキャプチャをご確認ください。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253379/77136b6a-e2cf-a6aa-ee91-bec5b0d64976.png)
# 4．CreateLiveCallbackTemplateを作成する

　Pre-request Scriptで[CreateLiveCallbackTemplate](https://intl.cloud.tencent.com/jp/document/api/267/30815)を作成します。
※ 上記リンクをクリックすると、TencentCloudのLVBのCreateLiveCallbackTemplateのAPIのドキュメントに飛びます。そこで、APIのリクエストパラメータ及びレスボンスパラメータを確認することができます。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253379/c91bc936-19fd-bef3-5d98-fcd543725db8.png)

Scrpitの内容は以下となります。

 
```javascript

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のURL`https://live.tencentcloudapi.com/`を記載して実際にAPIを叩くと、以下の様にテンプレートIDが返されますので、問題なくAPIを実行できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253379/0248dc8e-006a-5c01-765c-e0f6a05cb2b4.png)

これで一通りPostmanでのTencentCloud APIの実行環境及びテストが終わりました。
あと少し補足ですが、JSON形式でAPIを実行する場合、HTTP POSTでリクエストする必要があります。