Eve.NET 文档翻译

Eve.NET 文档翻译

Eve.NET Build status

Eve.NET 是一个简单的用于 Eve 框架 支持的 Web 服务的 HTTP 和 REST 客户端。它同时使用 System.Net.HttpClientJson.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 IarocciGestionali Amica 的开源项目,基于 BSD 许可证 分发。


原文阅读


Share Tweet Send
0 Comments
Loading...
You've successfully subscribed to 隔窗听雨
Great! Next, complete checkout for full access to 隔窗听雨
Welcome back! You've successfully signed in
Success! Your account is fully activated, you now have access to all content.
豫ICP备19045256号-1