defmodule TencentCloud do
@moduledoc """
Call TencentCloud Services in Elixir
全局配置 AK :
config :tencent_cloud,
access_key_id: "your_key",
access_key_secret: "your_secret"
调用时提供:
call(
%{
host: "nlp.tencentcloudapi.com",
action: "ChatBot",
version: "2019-04-08",
region: "ap-guangzhou",
access_key_id: "your_key",
access_key_secret: "your_secret"
},
%{"Query" => "hello"}
)
"""
alias TencentCloud.Core
@doc """
调用 TencentCloud 服务
## Example
call(
%{
host: "nlp.tencentcloudapi.com",
action: "ChatBot",
version: "2019-04-08",
region: "ap-guangzhou"
},
%{"Query" => "hello"}
)
"""
@spec call(common :: map, data :: Enumerable.t()) :: Tesla.Env.result()
def call(common, data) do
call(common, data, [
Tesla.Middleware.Logger,
Tesla.Middleware.Retry,
{Tesla.Middleware.Timeout, timeout: 30_000},
Tesla.Middleware.DecodeJson
])
end
@spec call(common :: map, data :: Enumerable.t(), [Tesla.Client.middleware()]) ::
Tesla.Env.result()
def call(common, data, middlewares) do
url = Map.get_lazy(common, :url, fn -> "https://" <> common.host end)
body = Jason.encode!(data)
headers =
common
|> Map.put_new_lazy(:access_key_id, fn ->
Application.fetch_env!(:tencent_cloud, :access_key_id)
end)
|> Map.put_new_lazy(:access_key_secret, fn ->
Application.fetch_env!(:tencent_cloud, :access_key_secret)
end)
|> Core.common_headers(body)
Tesla.client(
[{Tesla.Middleware.Headers, headers} | middlewares],
{Tesla.Adapter.Finch, name: TencentCloud.Finch, pool_timeout: 5_000, receive_timeout: 5_000}
)
|> Tesla.post(url, body)
end
end