SCOTT HANSELMAN 博客上看到一个好东西《Exploring refit, an automatic type-safe REST library for .NET Standard》,他推荐了一个.NET标准1.4 的自动类型安全的REST库refit。 refit 类似于Java的Retrofit,是一套RESTful架构的.NET客户端实现,基于特性,提供把REST API返回的数据转化为(Plain Ordinary C# Object,简单C#对象),POCO to JSON,网络请求(POST,GET,PUT,DELETE等)封装,内部封装使用HttpClient,前者专注于接口的封装,后者专注于网络请求的高效,二者分工协作。我们的应用程序通过 refit请求网络,实际上是使用 refit接口层封装请求参数、Header、Url 等信息,之后由 HttpClient完成后续的请求操作,在服务端返回数据之后,HttpClient将原始的结果交给 refit,后者根据用户的需求对结果进行解析的过程。

例如:

public interface IGitHubApi
{
[Get("/users/{user}")]
Task<User> GetUser(string user);
}

定义上面的一个REST API接口。 该接口定义了一个函数 GetUser,该函数会通过HTTP GET请求去访问服务器的/users/{user}路径并把返回的结果封装为User POCO 对象返回。

其中URL路径中的{user}的值为GetUser函数中的参数 user的取值。

然后通过 RestService 类来生成一个 IGitHubApi 接口的实现,使用HttpClient 调用;

var gitHubApi = RestService.For<IGitHubApi>(https://api.github.com);
var octocat = await gitHubApi.GetUser("octocat");

从上面的示例可以看出, refit使用特性来声明HTTP请求

  • 支持 URL 参数替换和查询参数
  • 返回结果转换为C#对象(返回结果可以为JSON)
  • 支持 Multipart请求和文件上传

具体使用文档

函数和函数参数上的特性声明了请求方式

1、请求方式

每个函数都必须带有 HTTP特性来表明请求方式和请求的URL路径。类库中有5个HTTP注解:GET, POST, PUT,DELETEHEAD。注解中的参数为请求的相对URL路径

[Get("/users/list")]

在URL路径中也可以指定URL参数:

[Get("/users/list?sort=desc")]
2、URL处理

请求的URL可以根据函数参数动态更新。一个可替换的区块为用 {} 包围的字符串,而函数参数必需用 @AliasAs特性标明,并且特性的参数为 同样的字符串

[Get("/group/{id}/users")]//注意 字符串id
Task<List<User>> GroupList([AliasAs("id")] int groupId); //注意 AliasAs特性的参数要和前面的字符串一样 id
还支持查询参数
[Get("/group/{id}/users")]
Task<List<User>> GroupList([AliasAs("id")] int groupId, [AliasAs("sort")] string sortOrder); GroupList(4, "desc");
>>> "/group/4/users?sort=desc"
3、请求体(Request Body)

通过[Body]特性可以声明一个对象作为请求体发送到服务器。

[Post("/users/new")]
Task CreateUser([Body] User user);
对象将被RestService 使用对应的转换器转换为字符串或者字节流提交到服务器。
4、FORM ENCODED AND MULTIPART 表单和Multipart

函数也可以注解为发送表单数据和multipart 数据

5、服务器结果转换为C# 对象

使用RestService 的转换器把HTTP请求结果(默认为JSON)转换为C#对象,C#对象通过函数返回值指定

6、添加请求头

我们可以通过[Headers]来添加请求头,支持动态的请求头。

refit是非常强大的,本文通过丰富的示例和对源码的挖掘,向大家展示了 refit自身强大的功能以及扩展性

自动类型安全的.NET标准REST库refit的更多相关文章

  1. (27)ASP.NET Core .NET标准REST库Refit

    1.简介 Refit是一个受到Square的Retrofit库(Java)启发的自动类型安全REST库.通过HttpClient网络请求(POST,GET,PUT,DELETE等封装)把REST AP ...

  2. [APUE]标准IO库(下)

    一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...

  3. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  4. 【转】C++标准库和标准模板库

    C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...

  5. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  6. C++——string类和标准模板库

    一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...

  7. STL 简介,标准模板库

    这篇文章是关于C++语言的一个新的扩展--标准模板库的(Standard Template Library),也叫STL.  当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话 ...

  8. Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

    前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. ...

  9. C++标准库和标准模板库

    转自原文http://blog.csdn.net/sxhelijian/article/details/7552499 C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标 ...

随机推荐

  1. 动态加载js,css(项目中需要的)

    最近做的一个项目需要加入百度统计,大家都知道百度统计在页面引用就是一坨js,实现方法很简单引用到页面就ok了. 那么问题来了,虽然我不知道百度统计的原理是啥,我的测试服引用了百度统计,百度统计账号里面 ...

  2. Codeforces Round #383 (Div. 2) B. Arpa’s obvious problem and Mehrdad’s terrible solution

    B. Arpa’s obvious problem and Mehrdad’s terrible solution time limit per test 1 second memory limit ...

  3. 浏览器怎么解析一个hmtl文档

    注意 link里面的css文件是并行请求下载的 script里面的js文件是同步请求下载的 html页面中的语句都是从上往下执行的 浏览器是同步加载 JavaScript 脚本,即渲染引擎遇到 def ...

  4. CentOS、Ubuntu配置网卡子接口

    CentOS # ip addr add dev eth0 lable eth0: 以上为临时配置,重启失效.若需永久保存,增加网络配置文件 # vim /etc/sysconfig/network- ...

  5. JAVAscript学习笔记 js异常 第二节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. WebP 的前世今生

    除了视频,图片占据了 PC 和 App 的大部分流量,为运营方带来高额的成本支出,同时过多的图片加载会影响到网站与 App 的加载速度.因此在保证图片质量的前提下缩小图片的体积就成了迫在眉睫的事情. ...

  7. 享受Python和PHP动态类型检查语言的快感

    前言 写这文章的时候特地查了资料,以确保我没有说错关于Python和PHP的类型机制. 所以这里放一张图,关于强弱类型与动态/静态类型检查的区分 从分类上看,PHP属于弱类型语言,而Python属于强 ...

  8. docker下编译mangoszero WOW60级服务端(一)

    这几天看到暴雪准备开放怀旧服的新闻,突然想到几年前用大芒果window一键服务端自己搭建过服务,就想着在Linux环境下重新编译一套,毕竟Linux作为服务端,性能和稳定性都会高一些,于是在mac虚拟 ...

  9. C#中的静态成员和非静态成员

    C#的类中可以包含两种方法:C#静态方法与非静态方法.那么他们的定义有什么不同呢?他们在使用上会有什么不同呢? 让我们来看看最直观的差别:使用了static 修饰符的方法为静态方法,反之则是非静态方法 ...

  10. Go基础篇【第5篇】: 内置库模块 exec

    Package exec runs external commands. It wraps os.StartProcess to make it easier to remap stdin and s ...