Eve.NET
Eve.NET 是一个简单的用于 Eve 框架 支持的 Web 服务的 HTTP 和 REST 客户端。它同时使用 System.Net.HttpClient
和 Json.NET
来提供 .NET 平台最好的 Eve 体验。
跨平台
Eve.NET 作为 .NET Standard 1.1 包分发,这使它兼容于 大范围 操作系统和 .NET 平台。
用法
初始化
// 可能的最简单的初始化.
var client = new EveClient();
client.BaseAddress = new Uri("http://api.com");
// 或
var client = new EveClient { BaseAddress = new Uri("http://api.com") };
// 或!
var client = new EveClient {
BaseAddress = new Uri("http://api.com"),
BasicAuthenticator = new BasicAuthenticator ("user", "pw")
};
// 为下一步请求设置目标资源.
client.ResourceName = "companies";
在资源终结点 GET
// 返回一个 List<T>.
var companies = await client.GetAsync<Company>();
Assert.AreEqual(HttpStatusCode.OK, client.HttpResponse.StatusCode);
Assert.AreEqual(companies.Count, 10);
// 返回包含某个 DateTime 之后改变项的 List<T>.
var ifModifiedSince = DateTime.Now.AddDays(-1);
var companies = await client.GetAsync<Company>(ifModifiedSince);
Assert.AreEqual(HttpStatusCode.OK, client.HttpResponse.StatusCode);
Assert.AreEqual(companies.Count, 2);
在文档终结点 GET
var company = companies[0];
// 通过悄悄进行一个基于对象 ETag 的 If-None-Match 请求来更新一个已经存在的对象.
// 参考 http://python-eve.org/features#conditional-requests
company = await client.GetAsync<Company>(company);
// StatusCode 是 'NotModified',因为 ETag 匹配了服务器上的一个 (没有进行任何下载). 出现下载也没事. 对象未变化.
Assert.AreEqual(HttpStatusCode.NotModified, client.HttpResponse.StatusCode);
// 原生,带条件的 GET 请求
var companyId = "507c7f79bcf86cd7994f6c0e";
var eTag = "7776cdb01f44354af8bfa4db0c56eebcb1378975";
var company = await client.GetAsync<Company>("companies", companyId, eTag);
// HttpStatusCode i仍是 'NotModified'.
Assert.AreEqual(HttpStatusCode.NotModified, client.HttpResponse.StatusCode);
POST/创建请求
var company = await client.PostAsync<Company>(new Company { Name = "MyCompany" });
// HttpStatusCode 是 'Created'.
Assert.AreEqual(HttpStatusCode.Created, client.HttpResponse.StatusCode);
Assert.AreEqual("MyCompany", company.Name);
// 新建的对象包含正确初始化的 API 元数据字段.
Assert.IsInstanceOf<DateTime>(company.Created);
Assert.IsInstanceOf<DateTime>(company.Updated);
Assert.IsNotNullOrEmpty(company.UniqueId);
Assert.IsNotNullOrEmpty(company.ETag);
PUT/替代请求
company.Name = "YourCompany";
// PUT 请求将悄悄进行一个 If-Match 请求,因此,如果服务器和文档 ETag 匹配,只是更新服务器副本.
// 参考 http://python-eve.org/features#data-integrity-and-concurrency-control
var result = await client.PutAsync<Company>(company);
Assert.AreEqual(HttpStatusCode.OK, client.HttpResponse.StatusCode);
Assert.AreEqual(result.Name, company.Name);
// UniqueId 和 Created 没有变化.
Assert.AreEqual(result.UniqueId, company.UniqueId);
Assert.AreEqual(result.Created, company.Created);
// 但是 Updated 和 ETag 已经更新了.
Assert.AreNotEqual(result.Updated, company.Updated);
Assert.AreNotEqual(result.ETag, company.ETag);
DELETE 请求
// DELETE 请求将悄悄进行一个 If-Match 请求,因此,如果它的 ETag 匹配了服务器上的某一项,只是删除文档.
// 参考 http://python-eve.org/features#data-integrity-and-concurrency-control
var message = await client.DeleteAsync(Original);
Assert.AreEqual(HttpStatusCode.OK, message.StatusCode);
映射 JSON 和 Eve 元数据字段到类成员
// 通过标识 RemoteAttribute,你可以映射 Eve 元数据字段到类属性. 因为这些在 API 终结点之间常常是不变的,
// 所以为你的业务对象提供一个基类很可能是个好主意.
public abstract class BaseClass
{
[JsonProperty("_id")]
[Remote(Meta.DocumentId)]
public string UniqueId { get; set; }
[JsonProperty("_etag")]
[Remote(Meta.ETag)]
public string ETag { get; set; }
[JsonProperty("_updated")]
[Remote(Meta.LastUpdated)]
public DateTime Updated { get; set; }
[JsonProperty("_created")]
[Remote(Meta.DateCreated)]
public DateTime Created { get; set; }
}
默认情况下,类与 json 的序列化/反序列化会采用 snake_case 转换。例如,在 json 中 `MyClass.ThisIsAProperty` 会被序列化到`this_is_a_property`。如果你想改变这个行为,设置对应的 `ContractResolver` 属性。
原生 GET 请求
// 你可以使用这个方法来进行参数化的查询.
var query = @"companies?where={""n"": ""MyCompany""}";
// GetAsync 会返回一个你可以轻松查看的 HttpResponseMessage.
var response = await client.GetAsyc(query);
Assert.AreEqual(HttpStatusCode.OK, result.StatusCode);
Assert.AreEqual("application/json", result.Content.Headers.ContentType.ToString())
// 请注意,使用 GetAsync<T> 你也获取到了通过 HttpResponse 属性暴露的 HttpResponseMessage 对象.
安装
Eve.NET 已放在 NuGet 上。在包管理器控制台运行如下命令:
PM> Install-Package Eve.NET
或者通过 Visual/Xamarin Studio 中的 NuGet 包管理器安装。
运行测试
你应该 clone evenet-testbed
代码库,运行测试 Web 服务的一个本地实例。要不然,如果你手里没有一个 Python/Eve 环境的话,你可以选择依靠一个在线可用的免费 (而且慢,还资源有限) 测试实例。查看 tests code 获取详细信息。
许可证
Eve.NET 是一个 Nicola Iarocci 和 Gestionali Amica 的开源项目,基于 BSD 许可证 分发。