如何在Flurl HttpClient中保留标头

时间:2015-02-13 15:30:34

标签: portable-class-library dotnet-httpclient flurl

我在.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()不再发送标题后,似乎会出现。

这是设计的吗?是否有更好的方法来确保在每个请求上发送这些标头?

2 个答案:

答案 0 :(得分:1)

问题是倒数第二行。

fc.Url...GetJsonAsync

FlurlClientUrl对象的引用,但反之亦然,所以当你调用fc.Url时,你实际上已经丢失了该引用和一个新的{{当你致电FlurlClient时,会在幕后创建1}}。这是设计的,GetJsonAsync是核心Flurl库中的一个简单的构建器类,可以独立于Flurl.Http使用。

我是这样做的:

Flurl.Url

一对夫妇注意到:

  1. 请注意,您在每次HTTP通话中附加 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); }
  2. 此处FlurlClient变量只是一个字符串,因此无需拨打url
  3. 此处并非绝对需要ResetToRoot声明,但这是一种很好的做法。

答案 1 :(得分:1)

还有另一种方法可行。对于每个连续的HTTP呼叫,请先修改fc.Url,然后使用fc拨打电话:

fc.Url.ResetToRoot().AppendPathSegment(...);
var x = await fc.GetJsonAsync<T>();

在这种情况下,您需要致电ResetToRoot,而不是WithClient。流畅的链条在这里被打破,但你可能会发现它更具可读性。无论哪种方式都有效,只是个人偏好。