我在.NET Http客户端上使用Furl.Http包装器。对于每个请求,我的API都需要发送User-Agent和Authorization标头。
我想把它设置一次,而不是每次都说出来。
我认为我能够做的是创建一个FlurlClient实例并在其上设置标题,然后在每个请求之前设置ResetToRoot,如下面的示例代码所示:
var fc = new FlurlClient();
fc.WithHeader("User-Agent", "Keep/1.0");
var tokenModel = await
"https://app.tempuri.com".AppendPathSegment("auth")
.WithClient(fc)
.PostUrlEncodedAsync(new { username = "you", password = "secret"})
.ReceiveJson<TokenModel>();
fc.WithHeader("Authorization",
string.Format("Token {0}",tokenModel.Token));
fc.Url.ResetToRoot();
var userModel = await fc.Url
.AppendPathSegment("auth").GetJsonAsync<UserModel>();
Console.WriteLine(userModel.Username);
然而,在RestToRoot()
不再发送标题后,似乎会出现。
这是设计的吗?是否有更好的方法来确保在每个请求上发送这些标头?
答案 0 :(得分:1)
问题是倒数第二行。
fc.Url...GetJsonAsync
FlurlClient
有Url
对象的引用,但反之亦然,所以当你调用fc.Url
时,你实际上已经丢失了该引用和一个新的{{当你致电FlurlClient
时,会在幕后创建1}}。这是设计的,GetJsonAsync
是核心Flurl库中的一个简单的构建器类,可以独立于Flurl.Http使用。
我是这样做的:
Flurl.Url
一对夫妇注意到:
var url = "https://app.tempuri.com";
using (var fc = new FlurlClient().WithHeader("User-Agent", "Keep/1.0")) {
var tokenModel = await url
.AppendPathSegment("...")
.WithClient(fc)
.PostUrlEncodedAsync(new { username = "you", password = "secret"})
.ReceiveJson<TokenModel>();
fc.WithHeader("Authorization",
string.Format("Token {0}",tokenModel.Token));
var userModel = await url
.AppendPathSegment("...")
.WithClient(fc)
.GetJsonAsync<UserModel>();
Console.WriteLine(userModel.Username);
}
。FlurlClient
变量只是一个字符串,因此无需拨打url
。ResetToRoot
声明,但这是一种很好的做法。答案 1 :(得分:1)
还有另一种方法可行。对于每个连续的HTTP呼叫,请先修改fc.Url
,然后使用fc
拨打电话:
fc.Url.ResetToRoot().AppendPathSegment(...);
var x = await fc.GetJsonAsync<T>();
在这种情况下,您需要致电ResetToRoot
,而不是WithClient
。流畅的链条在这里被打破,但你可能会发现它更具可读性。无论哪种方式都有效,只是个人偏好。