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 中在行上执行长按操作。