首页 / 教程列表 / Flurl中文文档(使用教程) / 在C#&.NET(.NET Core)程序中使用Flurl中进行HTTP GET请求详解

在C#&.NET(.NET Core)程序中使用Flurl中进行HTTP GET请求详解

2746 更新于: 2023-03-25 读完约需 24 分钟

Flurl 是一个开源的 C# HTTP 客户端库,它的设计目的是提供一种简单而灵活的方式来处理 HTTP 请求和响应。使用 Flurl,你可以轻松地创建和发送 GET 请求,并使用简洁明了的语法处理响应。在本文中,我们将深入介绍 Flurl 中的 GET 请求,并提供一些示例来帮助你了解如何使用该库。

安装 Flurl

在开始使用 Flurl 之前,你需要先安装它。Flurl 可以通过 NuGet 包管理器或手动下载安装程序包来安装。下面是使用 NuGet 包管理器安装 Flurl 的步骤:

  1. 打开 Visual Studio。
  2. 打开要安装 Flurl 的项目。
  3. 在“解决方案资源管理器”中右键单击项目,并选择“管理 NuGet 程序包”。
  4. 在“NuGet 程序包管理器”中搜索 Flurl。
  5. 找到 Flurl 并单击“安装”按钮。

Flurl 中的 GET 请求

在 Flurl 中执行 GET 请求非常简单。你只需要创建一个 URL,并使用 GetAsync() 方法来执行请求。下面是一个简单的示例:

using Flurl.Http;

var responseString = await "https://api.example.com/products/123".GetAsync().ReceiveString();

在上面的示例中,我们向 https://api.example.com/products/123 发送了一个 GET 请求,并使用 ReceiveString() 方法获取响应正文的字符串表示形式。

在 Flurl 中发送 GET 请求时,你可以使用 SetQueryParam() 方法来添加查询参数。下面是一个示例:

using Flurl.Http;

var responseString = await "https://api.example.com/products"
    .SetQueryParam("category", "electronics")
    .SetQueryParam("brand", "apple")
    .GetAsync()
    .ReceiveString();

在上面的示例中,我们向 https://api.example.com/products 发送了一个 GET 请求,并添加了两个查询参数:categorybrand。我们使用 SetQueryParam() 方法来设置这些查询参数。

你还可以使用 SetQueryParams() 方法来添加多个查询参数。下面是一个示例:

using Flurl.Http;

var queryParams = new
{
    category = "electronics",
    brand = "apple"
};

var responseString = await "https://api.example.com/products"
    .SetQueryParams(queryParams)
    .GetAsync()
    .ReceiveString();

在上面的示例中,我们使用一个匿名类型来定义查询参数,并使用 SetQueryParams() 方法将其添加到 URL 中。

Flurl 还支持使用 SetQueryParams() 方法来添加一个 IDictionary<string, object> 类型的参数,如下所示:

using Flurl.Http;

var queryParams = new Dictionary<string, object>
{
    { "category", "electronics" },
    { "brand", "apple" }
};

var responseString = await "https://api.example.com/products"
    .SetQueryParams(queryParams)
    .GetAsync()
    .ReceiveString();

在上面的示例中,我们使用Dictionary<string, object>类型的字典来定义查询参数,并使用SetQueryParams() 方法将其添加到 URL 中。

处理响应

在 Flurl 中处理响应非常方便。你可以使用 ReceiveString() 方法来获取响应正文的字符串表示形式,或者使用 ReceiveJson() 方法来将响应正文解析为 JSON 对象。下面是一个使用 ReceiveJson() 方法的示例:

using Flurl.Http;

var responseJson = await "https://api.example.com/products"
    .SetQueryParam("category", "electronics")
    .SetQueryParam("brand", "apple")
    .GetAsync()
    .ReceiveJson();

在上面的示例中,我们向 https://api.example.com/products 发送了一个 GET 请求,并添加了两个查询参数:categorybrand。我们使用 ReceiveJson() 方法将响应正文解析为 JSON 对象。

你还可以使用 ReceiveStream() 方法将响应正文作为流接收,或使用 ReceiveBytes() 方法将响应正文作为字节数组接收。下面是一个使用 ReceiveBytes() 方法的示例:

using Flurl.Http;

var responseBytes = await "https://api.example.com/products"
    .SetQueryParam("category", "electronics")
    .SetQueryParam("brand", "apple")
    .GetAsync()
    .ReceiveBytes();

在上面的示例中,我们向 https://api.example.com/products 发送了一个 GET 请求,并添加了两个查询参数:categorybrand。我们使用 ReceiveBytes() 方法将响应正文作为字节数组接收。

错误处理

在 Flurl 中,你可以使用 FlurlHttpException 类捕获 HTTP 错误。这个异常包含一个 Call 属性,其中包含有关请求和响应的详细信息。下面是一个示例:

using Flurl.Http;

try
{
    var responseString = await "https://api.example.com/products/123"
        .GetAsync()
        .ReceiveString();
}
catch (FlurlHttpException ex)
{
    Console.WriteLine($"Error: {ex.Message}");
    Console.WriteLine($"Status Code: {ex.Call.HttpStatus}");
    Console.WriteLine($"Response Body: {ex.Call.Response.Body}");
}

在上面的示例中,我们向 https://api.example.com/products/123 发送了一个 GET 请求。如果出现 HTTP 错误,我们使用 FlurlHttpException 捕获该异常,并输出有关错误的详细信息。

还有一个方便的方式是使用 FlurlClient 类。你可以在创建 FlurlClient 实例时设置默认的基本 URL 和请求头,并使用它来执行 GET 请求,如下所示:

using Flurl;
using Flurl.Http;

var client = new FlurlClient("https://example.com/api/")
    .WithHeader("User-Agent", "MyApp/1.0");

var responseString = await client
    .Request("someEndpoint")
    .SetQueryParam("param1", "value1")
    .SetQueryParam("param2", "value2")
    .GetAsync()
    .ReceiveString();

// 处理响应字符串

在上面的代码中,创建了一个名为 clientFlurlClient 实例,并将默认基本 URL 设置为 "https://example.com/api/",请求头中添加了一个自定义的 User-Agent。然后,使用 Request() 方法来指定要请求的特定端点,并使用 SetQueryParam() 方法设置查询参数。最后,使用 GetAsync() 方法进行 GET 请求,并使用 ReceiveString() 方法接收响应。

当你需要将查询参数设置为多个值时,可以将值包装在 IEnumerable 中,并使用 SetQueryParam() 方法进行设置。如下所示:

using Flurl;
using Flurl.Http;

var values = new List<string> { "value1", "value2" };
var responseString = await "https://example.com/api/someEndpoint"
    .SetQueryParam("param1", values)
    .GetAsync()
    .ReceiveString();

// 处理响应字符串

在上面的代码中,将查询参数 "param1" 的值设置为 values,这是一个包含多个字符串值的 List<string>。此时,Flurl将自动将值序列化为逗号分隔的字符串,然后将其附加到 URL 查询参数中。

另外,如果你需要处理响应的内容类型,例如 JSON,你可以使用 ReceiveJson() 方法代替 ReceiveString() 方法。这将自动将响应反序列化为 JSON 对象或集合。例如:

using Flurl;
using Flurl.Http;

var response = await "https://example.com/api/someJsonEndpoint"
    .GetAsync()
    .ReceiveJson();

// 处理反序列化后的 JSON 对象或集合

在上面的代码中,使用 GetAsync() 方法执行 GET 请求,并使用 ReceiveJson() 方法接收响应。在这种情况下,Flurl将自动将响应反序列化为 JSON 对象或集合,你可以根据需要对其进行处理。如果响应的内容类型不是 JSON,则使用 ReceiveString() 方法接收响应,并根据需要进行处理。

总之,使用 Flurl 发送 HTTP GET 请求非常简单,你可以选择使用 GetAsync() 方法或创建 FlurlClient 实例,并使用 Request() 方法执行 GET 请求。无论你使用哪种方法,都可以方便地设置查询参数、请求头和其他参数,并处理响应的内容类型。

除了基本的 HTTP GET 请求,Flurl 还提供了许多其他功能,以便你更好地控制你的请求和响应。以下是一些示例。

异步取消请求

你可以使用 CancellationToken 对象在异步请求期间取消请求。如下所示:

using Flurl;
using Flurl.Http;
using System.Threading;

var cts = new CancellationTokenSource();
cts.CancelAfter(5000); // 5 秒后取消请求

try
{
    var responseString = await "https://example.com/api/someEndpoint"
        .SetQueryParam("param1", "value1")
        .WithTimeout(TimeSpan.FromSeconds(10))
        .WithCancellationToken(cts.Token)
        .GetAsync()
        .ReceiveString();

    // 处理响应字符串
}
catch (OperationCanceledException ex)
{
    // 处理请求被取消的情况
}

在上面的代码中,创建了一个名为 ctsCancellationTokenSource 对象,并设置了一个 5 秒的超时时间。然后,使用 WithCancellationToken() 方法将 cts.Token 添加到请求中,以便你可以在超时或其他情况下取消请求。注意,在超时之前,如果请求完成,它仍将返回响应,否则将抛出 OperationCanceledException 异常。

设置请求超时

如果你需要在请求花费过长时间时取消它,可以使用 WithTimeout() 方法设置请求超时时间。如下所示:

using Flurl;
using Flurl.Http;
using System;

try
{
    var responseString = await "https://example.com/api/someEndpoint"
        .SetQueryParam("param1", "value1")
        .WithTimeout(TimeSpan.FromSeconds(10))
        .GetAsync()
        .ReceiveString();

    // 处理响应字符串
}
catch (FlurlHttpTimeoutException ex)
{
    // 处理超时异常
}

在上面的代码中,使用 WithTimeout() 方法将请求超时时间设置为 10 秒。如果请求在这个时间内没有完成,将抛出 FlurlHttpTimeoutException 异常。

除了上述示例之外,Flurl 还提供了以下其他功能:

将查询参数添加到 URL

使用 SetQueryParam() 方法将查询参数添加到 URL。例如:

using Flurl;
using Flurl.Http;

var responseString = await "https://example.com/api/someEndpoint"
    .SetQueryParam("param1", "value1")
    .SetQueryParam("param2", "value2")
    .GetAsync()
    .ReceiveString();

在上面的代码中,使用 SetQueryParam() 方法添加了两个查询参数,参数名分别为 param1param2

将标头添加到请求

使用 WithHeader() 方法将标头添加到请求。例如:

using Flurl;
using Flurl.Http;

var responseString = await "https://example.com/api/someEndpoint"
    .WithHeader("Authorization", "Bearer <token>")
    .GetAsync()
    .ReceiveString();

在上面的代码中,使用 WithHeader() 方法添加了一个名为 Authorization 的标头,并将其值设置为一个身份验证令牌。

使用 Basic 认证

使用 WithBasicAuth() 方法使用 Basic 认证进行身份验证。例如:

using Flurl;
using Flurl.Http;

var responseString = await "https://example.com/api/someEndpoint"
    .WithBasicAuth("<username>", "<password>")
    .GetAsync()
    .ReceiveString();

在上面的代码中,使用 WithBasicAuth() 方法进行 Basic 认证,用户名为 <username>,密码为 <password>

序列化请求正文

使用 WithJsonAsync() 方法将对象序列化为 JSON 并发送到服务器。例如:

using Flurl;
using Flurl.Http;

var requestObject = new { param1 = "value1", param2 = "value2" };

var responseObject = await "https://example.com/api/someEndpoint"
    .WithJsonAsync(requestObject)
    .ReceiveJson<ResponseObject>();

在上面的代码中,使用 WithJsonAsync() 方法将 requestObject 序列化为 JSON 并作为请求正文发送到服务器。

接收二进制响应

使用 ReceiveBytes() 方法接收二进制响应。例如:

using Flurl;
using Flurl.Http;

var responseBytes = await "https://example.com/api/someEndpoint"
    .GetAsync()
    .ReceiveBytes();

在上面的代码中,使用 ReceiveBytes() 方法接收二进制响应。你可以将响应字节流转换成需要的格式。

总之,Flurl 是一个功能强大而又易于使用的 HTTP 客户端库,它提供了许多方便的方法和功能来帮助你更好地控制你的请求和响应。无论你是在编写 ASP.NET Core、Xamarin、Unity 或其他 .NET 应用程序,Flurl 都是一个值得尝试的 HTTP 客户端库。

结论

在本文中,我们深入介绍了 Flurl 中的 GET 请求,并提供了一些示例来帮助你了解如何使用该库。使用 Flurl,你可以轻松地创建和发送 GET 请求,并使用简洁明了的语法处理响应。此外,Flurl 还提供了方便的方法来添加查询参数和处理响应,以及捕获 HTTP 错误。如果你需要在 C# 中进行 HTTP 请求,Flurl 绝对是一个值得尝试的库。

版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。

发表评论

登录用户才能发表评论, 请 登 录 或者 注册