Google Code Prettify

如何使用HttpClient存取具有Authorize的RESTfull API?

要使用 `HttpClient` 存取需要授權的 RESTful API,你通常需要在請求中附加適當的身份驗證憑證,例如 JWT(JSON Web Token)。以下是完整的步驟,包括如何生成 JWT、配置 `HttpClient` 並發送授權請求。

### 假設場景
- 你的 RESTful API 使用 JWT 作為身份驗證方式。
- 你已經擁有用戶憑證(如用戶名和密碼)並且能夠獲取 JWT。

### 步驟 1:生成 JWT
首先,你需要獲取 JWT,通常是通過登錄端點獲取。這個端點驗證用戶名和密碼並返回一個 JWT。


public async Task GetJwtTokenAsync(string username, string password)
{
    var client = new HttpClient();
    var loginUrl = "https://yourapi.com/api/auth/login";

    var loginData = new
    {
        Username = username,
        Password = password
    };

    var content = new StringContent(JsonSerializer.Serialize(loginData), Encoding.UTF8, "application/json");
    var response = await client.PostAsync(loginUrl, content);

    response.EnsureSuccessStatusCode();

    var responseString = await response.Content.ReadAsStringAsync();
    var jwt = JsonSerializer.Deserialize(responseString);

    return jwt.Token;
}

public class JwtResponse
{
    public string Token { get; set; }
}


### 步驟 2:配置 HttpClient 並附加 JWT
在獲取 JWT 之後,你可以在後續的請求中附加此 JWT 進行授權。


public async Task GetProtectedResourceAsync(string token)
{
    var client = new HttpClient();
    var requestUrl = "https://yourapi.com/api/protectedresource";

    // 附加 Bearer Token 到請求頭
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    var response = await client.GetAsync(requestUrl);

    response.EnsureSuccessStatusCode();

    return await response.Content.ReadAsStringAsync();
}


### 完整示例
以下是完整的代碼,包含了從獲取 JWT 到使用 JWT 訪問受保護資源的流程:


using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main(string[] args)
    {
        string username = "yourusername";
        string password = "yourpassword";

        string token = await GetJwtTokenAsync(username, password);
        string protectedResource = await GetProtectedResourceAsync(token);

        Console.WriteLine(protectedResource);
    }

    public static async Task GetJwtTokenAsync(string username, string password)
    {
        var client = new HttpClient();
        var loginUrl = "https://yourapi.com/api/auth/login";

        var loginData = new
        {
            Username = username,
            Password = password
        };

        var content = new StringContent(JsonSerializer.Serialize(loginData), Encoding.UTF8, "application/json");
        var response = await client.PostAsync(loginUrl, content);

        response.EnsureSuccessStatusCode();

        var responseString = await response.Content.ReadAsStringAsync();
        var jwt = JsonSerializer.Deserialize(responseString);

        return jwt.Token;
    }

    public static async Task GetProtectedResourceAsync(string token)
    {
        var client = new HttpClient();
        var requestUrl = "https://yourapi.com/api/protectedresource";

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

        var response = await client.GetAsync(requestUrl);

        response.EnsureSuccessStatusCode();

        return await response.Content.ReadAsStringAsync();
    }
}

public class JwtResponse
{
    public string Token { get; set; }
}


### 注意事項
1. **安全性**:確保密碼和其他敏感信息的安全傳輸和存儲。
2. **錯誤處理**:添加適當的錯誤處理邏輯,例如處理登錄失敗或令牌過期的情況。
3. **Token 更新**:考慮在令牌過期後刷新令牌。

這樣,你就可以使用 `HttpClient` 訪問需要授權的 RESTful API。這種方式適用於各種需要身份驗證的 HTTP 請求場景。