0

私は .NET Http Client で 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()、ヘッダーが送信されなくなった後に表示されます。

これは設計によるものですか?これらのヘッダーが各リクエストで送信されることを保証するためのより良い方法はありますか?

4

2 に答える 2

1

問題は最後から 2 番目の行です。

fc.Url...GetJsonAsync

FlurlClientはオブジェクトへの参照を持っていUrlますが、その逆はありません。そのため、 を呼び出すまでに、実質的にその参照が失われ、 を呼び出すと舞台裏fc.Urlで新しいが作成されます。これは設計によるもので、Flurl.Http とは独立して使用できるコア Flurl ライブラリの単純なビルダー クラスです。FlurlClientGetJsonAsyncFlurl.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);
}

いくつかのメモ:

  1. 各 HTTP 呼び出しに をアタッチしていることに注意してください。FlurlClient
  2. ここで、url変数は単なる文字列なので、 を呼び出す必要はありませんResetToRoot
  3. ここでのusingステ​​ートメントは絶対に必要というわけではありませんが、良い習慣です。
于 2015-02-13T16:16:17.730 に答える