Easyhttp by Hadi Hariri

最近,我编写的大部分代码都以某种方式与HTTP服务器进行通信。 无论是“ReSTful”服务还是“Wanna-be-ReSTful”服务,我都需要进行GET,POST,PUT等操作并与JSON配合。

在几次围绕WebRequest进行简单封装之后,我决定是时候将其正式化。
于是就有了EasyHttp
它已经在GitHub上待了很长一段时间,我和其他人一直在将它用于几个项目,所以我认为它已经到了让更多人尝试的时候了,如果他们愿意的话。

描述EasyHttp功能的最佳方法就是代码

1
2
3
4
5
6
var http = new HttpClient
{
Request = { Accept = HttpContentTypes.ApplicationJson }
}
var response = http.Get("http://domain.com/customer/25");
var customer = response.StaticBody<Customer>();

代码描述:我们创建了一个HttpClient实例,并指示我们接受内容类型application/json(因为在这种情况下,服务器返回给我们的是json)。 通过指定此Accept头,EasyHttp知道如何解码请求(request)。

我们如何得到响应(response)?
在上面的代码中,我们使用StaticBody方法,它为我们提供了一个强类型客户(strongly-typed Customer)。 但我们还有其他选择:

1
2
3
4
5
6
7
8
var http = new HttpClient
{
Request = { Accept = HttpContentTypes.ApplicationJson }
};
var response = http.Get("http://domain.com/customer/25");
dynamic customer = response.DynamicBody();
Console.WriteLine(customer.Name);
Console.WriteLine(customer.Email);

在这种情况下,我们想要返回一个动态类型,因此我们调用DynamicBody方法。
EasyHttp将自动反序列化对动态对象的响应。
这允许我们访问属性而不必提前声明类型(在使用JSON时非常有用)。
最后,我们还可以通过RawText属性访问原始响应。

如果我们想要数据流(stream)传输到文件,我们只需:

1
2
var http = new HttpClient();
http.GetAsFile("http://hadihariri.com/header.png", @"C:\Temp\header.png");

使用其他方法(Http verbs)几乎是相同的过程。
假设我们想要创建一个调用服务的客户端:

1
2
3
4
5
6
7
var http = new HttpClient();
var customer = new Customer()
{
Name = "Joe Smith",
Email = "Joe@Gmail.com"
};
http.Post("http://domain.com/customer", customer, HttpContentTypes.ApplicationJson);

在这种情况下,我们提交了一个Customer对象,并要求EasyHttp使用application/json对其进行编码。
与接收响应时类似,在发出需求正文的请求时,我们也可以使用动态对象。
因此,这也可以使用:

1
2
3
4
5
var http = new HttpClient()
dynamic customer = new ExpandoObject()
customer.Name = "Joe Smith";
customer.Email = "Joe@Gmail.com";
http.Post("http://domain.com/customer", customer, HttpContentTypes.ApplicationJson);

在内部,EasyHttp正在使用优秀的JsonFX,它目前支持JSON和XML 编码和解码。
EasyHttp通过添加www-form-urlencoded的编码支持来扩展它。
用其他格式扩展它应该很容易。

除了GETPOSTEasyHttp还支持PUTDELETEHEAD
请求和响应标头作为属性显示,因此我们不必手动添加标头,而是可以单独分配它们(其中一些标记来自现有的WebRequest)。

总结

这就是它的全部内容。 正如我所提到的,我一直在使用它与CouchDB交互,作为YouTrackSharp和其他一些项目的一部分。
它远不是全部功能,但是我添加的东西,因为我或部分人需要使用它们。

随意下载并使用它。
源代码在GitHub上,Issue Tracker在CodeBetter上。
如果您对运行测试感兴趣,则需要CouchDB。
我最初写这篇文章是因为我需要为CouchDB做一些事情,它是测试不同Http Verbs的一个很好的平台(是的,它们是集成测试,而不是单元测试)。