例如,我为堆栈溢出创建API客户端。我需要将access_token
传递给每个端点。
我可能会这样:
StackClient.answers(access_token, params)
StackClient.badges(access_token, params)
但是我不希望将access_token
传递给每个请求。而且我通过将访问令牌存储在Agent中来改进了逻辑。
def start(access_token) do
Agent.start_link(fn -> %{access_token: access_token} end, name: __MODULE__)
end
然后我像这样使用ApiClient:
StackClient.start(access_token)
StackClient.answers(params)
StackClient.badges(params)
但是这种方法有一个大问题,因为代理具有服务器的全局可见性范围。并且两个用户可能会遇到与access_token的冲突。
伙计们!是否可以在一个http请求中设置代理可见性?
还是减少参数数量的另一种方法?
答案 0 :(得分:1)
从那里开始,有两种前进的方式。
Agent.start_link
返回{:ok, pid}
,并带有新生成的进程的标识符,因此您可以使用它:
{:ok, pid} = StackClient.start(access_token)
StackClient.answers(pid, params)
StackClient.badges(pid, params)
或者您可以为流程指定其他名称:
def start(name, access_token) do
Agent.start_link(fn -> %{access_token: access_token} end, name: name)
end
并在引用过程时使用它:
{:ok, _} = StackClient.start(:my_stack_client, access_token)
StackClient.answers(:my_stack_client, params)
StackClient.badges(:my_stack_client, params)