xamarin 通过 HttpClient访问网络

GitHub
登录服务
REST 服务要求在登录后才能获取令牌。 没有用户身份验证。 首先,调用特定终结点来获取令牌。 然后,通过每个后续请求的 HTTP 标头将令牌发送回服务器。

在 Data 文件夹中,打开 BookManager.cs。

将下面的字段添加到代码中。 该值应是之前保存的 URL 并后跟 /api/books/。

const string Url = "{Url from before}/api/books/";

添加以下字段以保留令牌。

private string authorizationKey;

添加以下名为 GetClient 的专用方法,以返回标头中包含 authorizationKey 的 HttpClient 的实例。 (为 Newtonsoft.Json 命名空间添加 using 语句,以访问 Json.NET 功能。)

using Newtonsoft.Json;
...
private async Task<HttpClient> GetClient()
{
    HttpClient client = new HttpClient();
    if (string.IsNullOrEmpty(authorizationKey))
    {
        authorizationKey = await client.GetStringAsync(Url + "login");
        authorizationKey = JsonConvert.DeserializeObject<string>(authorizationKey);
    }

    client.DefaultRequestHeaders.Add("Authorization", authorizationKey);
    client.DefaultRequestHeaders.Add("Accept", "application/json");
    return client;
}

执行 GET 操作
现在可对服务进行身份验证,我们来添加代码以从基础 Url 检索书籍。

在“BookManager.cs”文件中,查找返回 Task<IEnumerable> 且名为 GetAll 的方法。

使用我们之前创建的 GetClient 方法来检索要使用的 HttpClient。

在基 Url 上使用 GetStringAsync 来检索书籍数组。 使用 C# async / await 功能来简化值的使用。

将返回的 string 传递到 JsonConvert.DeserializeObject,以将 JSON 数据转换为对象图并将其返回到调用方。

public async Task<IEnumerable<Book>> GetAll()
{
    HttpClient client = await GetClient();
    string result = await client.GetStringAsync(Url);
    return JsonConvert.DeserializeObject<IEnumerable<Book>>(result);
}

运行应用程序,然后选择工具栏上的“刷新”图标。 (工具栏可能位于顶部或底部,具体取决于平台。 该图标类似于包含一对箭头的圆圈。)

几秒钟后,应用会加载一组现有书籍并显示它们。

执行 POST 操作
应用程序现在可获取书籍列表。 让我们添加使用 POST 谓词新建书籍的功能。

打开 BookManager 代码,找到名为 Add 的方法。 它具有标题、作者和流派参数,并返回 Task。

在方法中,创建新的 Book 对象并使用传入的数据填充字段:

将 ISBN 字段设为空 string。
请确保创建新的 List 用于保存传入的作者。
将 PublishDate 设为 DateTime.Now。
从 GetClient 方法获取客户端。

针对基础 Url 使用 PostAsync 方法添加书籍:

使用 JsonConvert.SerializeObject() 将 Book 对象转换为 JSON。
以 JSON 格式创建包含书籍的新 StringContent 对象。 使用构造函数,它也采用编码和媒体类型。
编码为 Encoding.UTF8。 媒体类型为 application/json。
来自 POST 的响应为 JSON string,表示返回的书籍。 将其反序列化为 Book 对象。 从方法返回 Book 实例。

public async Task<Book> Add(string title, string author, string genre)
{
    Book book = new Book() {
        Title = title,
        Authors = new List<string>(new[] { author }),
        ISBN = string.Empty,
        Genre = genre,
        PublishDate = DateTime.Now.Date,
    };

    HttpClient client = await GetClient();
    var response = await client.PostAsync(Url,
        new StringContent(
            JsonConvert.SerializeObject(book),
            Encoding.UTF8, "application/json"));

    return JsonConvert.DeserializeObject<Book>(
        await response.Content.ReadAsStringAsync());
}

生成并运行应用程序。 选择“添加”([+]) 以添加书籍并返回主屏幕。

选择“刷新”以获取服务中的所有书籍, 其中包含新创建的书籍。

执行 PUT 操作
应用程序可显示所有书籍并添加新书。 如果新建带有错误的书籍,会发生什么情况? 现在来添加执行 PUT 操作以更新书籍的功能。

打开 BookManager 类。 找到名为 Update 的方法,该方法使用 Book 并返回 Task。

在方法实现中,获取新客户端。 使用 PutAsync 方法将 JSON 编码的书籍发送到添加了 ISBN 的基础 URL。 例如,如果 ISBN 为 12345678,则 URL 为 api/books/12345678。

就像在 POST 操作中所做的那样,为 PutAsync 的第二个参数创建 StringContent 的实例。 请确保使用 JsonConvert.SerializeObject() 将书籍序列化为 JSON。 如之前一样,包括编码和内容类型。

在这种情况下,我们没有显式返回类型,但我们想要返回 Task,以便异常能够正确地返回给调用方。 然后,调用方可使用 await 关键字暂停方法的执行,直到异步方法完成。

public async Task Update(Book book)
{
    HttpClient client = await GetClient();
    await client.PutAsync(Url + "/" + book.ISBN,
        new StringContent(
            JsonConvert.SerializeObject(book),
            Encoding.UTF8, "application/json"));
}

若要试用逻辑,请运行应用程序并点击现有书籍进行编辑。

执行 DELETE 操作
需要支持的最后一项操作是 DELETE 操作。 这样便可以从 Web 服务中删除书籍。

打开 BookManager 类。 找到 Delete 方法,该方法使用 string ISBN 并返回 Task。

在方法主体中,获取新客户端。 针对基础 URL + ISBN 使用 DeleteAsync 方法,就像在 UPDATE 事例中所做的一样。

public async Task Delete(string isbn)
{
    HttpClient client = await GetClient();
    await client.DeleteAsync(Url + isbn);
}

运行应用程序以测试删除逻辑。 若要获取特定书籍的删除功能,请在 iOS 中在行上左滑,或在 Android 中在行上执行长按操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值