我正在为C#WinForm应用程序编写一个简单的REST客户端。我使用RestSharp来发送请求并让响应更容易。关于如何设计我的客户,我有几个问题。
用户仅与客户端进行一次交互。他推送Button
并实例化客户端并传递给private
方法以在后台执行某些逻辑。它从服务器访问对象并将它们与用户内部数据库中的对象同步。
关键是客户端的方法是通过GUI中用户单个操作调用的private
方法访问的。他无法控制调用哪个客户端方法,以及按哪种顺序。
所以我的问题是:
我可以在实例化客户端时向服务器询问一次令牌,然后将其存储在客户端实例中,以便将来在客户端的请求中引用吗?令牌是用户名和密码的哈希值,因此它不应随时间变化。当然,一旦我创建了客户端的新实例,它将再次向服务器请求令牌。
在我的客户端中保留一个Request
对象实例是否可以?然后,我只能设置一次请求标头,访问API的所有方法只需要更改请求的资源URL和HTTP方法。它会减少我的代码中的重复性。
例如:
public PriceListItem[] GetPriceListItems()
{
string requestUrl = Resources.PriceListItemsUrl;
var request = new RestRequest(requestUrl, Method.GET);
request.AddHeader("SecureToken", _token);
var response = Client.Execute(request) as RestResponse;
JObject jObject = JObject.Parse(response.Content);
var priceListItems = jObject["Data"].ToObject<PriceListItem[]>();
return priceListItems;
}
我有很多方法可以使用不同的资源网址,但都有相同的标头。如果我在客户端只保留一个Request
实例,我只能设置一次标头。这种方法可以吗?我想避免任何代表和事件。
答案 0 :(得分:0)
您必须使用ParameterType.HttpHeader parameter
:
request.AddParameter("Authorization", "data", ParameterType.HttpHeader);
答案 1 :(得分:0)
在客户端上保存身份验证令牌是完全正常的,只要它加密并且过期时间就可以了。 您可以使用REST API上的实现会话来改进它,因此您只需检查身份验证令牌是否仍然有效,并在身份验证无效时进行身份验证。
显然,您需要管理您对REST API的请求方式,我建议您以这种方式使用IDisposable Pattern,您可以使用一些惰性实现或Singelton。