她引入了两个.NET正规一.肆,它能够通过申明来描述Http请求

SCOTT HANSELMAN
博客上见到三个好东西《Exploring refit, an automatic type-safe REST
library for .NET
Standard
》,他引入了一个.NET正式一.4的自动类型安全的REST库refit
refit
类似于Java的Retrofit,是1套RESTful架构的.NET客户端完结,基于本性,提供把REST
API再次回到的数据转载为(Plain Ordinary C# Object,简单C#目的),POCO to
JSON,互连网请求(POST,GET,PUT,DELETE等)封装,内部封装使用HttpClient,前者专注于接口的包裹,后者专注于网络请求的高效,二者分工同盟。大家的应用程序通过
refit请求网络,实际上是行使 refit接口层封装请求参数、Header、Url
等新闻,之后由
HttpClient成就后续的呼吁操作,在服务端重返数据之后,HttpClient将本来的结果提交
refit,后者遵照用户的须求对结果开始展览解析的长河。

Retrofit是什么

对于Retrofit ,官方的叙述是:“A type-safe REST client for Android and
Java.”它能够经过注脚来叙述Http请求,UHighlanderL参数,查询参数,同时,它还帮衬多少个请求体和文件上传
Retrofit 二私下认可情状下使用okhttp为互联网层

例如:

Retrofit用法示例

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

官方网址示例

  • 1 定义java接口

public interface GitHubService {
      @GET("users/{user}/repos")
      Call<List<Repo>> listRepos(@Path("user") String user);
}

该接口定义了2个 listRepos方法,该方法会通过HTTP
GET请求去拜访服务器的/users/{user}/repos门路并把再次回到的结果封装为List<Repo>Java对象回来。个中U揽胜L路线中的{user}的值为listRepos主意中的参数
user的取值。

  • 二 通过 RestAdapter类来生成1个 GitHub瑟维斯 接口的完毕;

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();
GitHubService service = retrofit.create(GitHubService.class); 
  • 三 获取接口的落到实处后就足以调用接口函数来和服务器交互

Call<List<Repo>> repos = service.listRepos("octocat");

从上边的言传身教能够看看, Retrofit 使用表明来声称HTTP请求

  • 支撑 ULANDL 参数替换和询问参数
  • 回到结果调换为Java对象(重临结果可以为JSON, protocol buffers)
  • 支撑 Multipart请求和文书上传

概念方面包车型大巴三个REST API接口。 该接口定义了叁个函数
GetUser,该函数会通过HTTP
GET请求去访问服务器的/users/{user}路径并把重回的结果封装为User POCO
对象回来。

一般选择

先是定义接口

public interface ApiCallBiz {
        @GET("data/Android/{number}/{page}")
        Call<List<AndroidInfoBean>> getAndroidInfo(@Path("number") int number, @Path("page") int page);
}

getAndroidInfo(
)方法通过证明@GET标明为get请求,完整的url依据制造retrofit对象时传出的baseUrl+@GET的所填写的value组成,value的全体值会遵照调用接口是传播的参数补充完整,例如data/Android/10/1
创建 retrofit目的完毕请求服务器

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://gank.io/api/")
    .addConverterFactory(GsonConverterFactory.create())//gson解析
    .build();
ApiCallBiz mApiCallBiz =retrofit.create(ApiCallBiz.class);
Call<List<AndroidInfoBean>> call = mApiCallBiz.getAndroidInfo1(10,1);
call.enqueue(new Callback<List<AndroidInfoBean>>() {     
      @Override
      public void onResponse(Call<List<AndroidInfoBean>> call,Response<List<AndroidInfoBean>> response) {
          Log.e("TAG",response.body().toString());
      }     
      @Override
      public void onFailure(Call<List<AndroidInfoBean>> call, Throwable t) {

      }
});

构造者情势营造了baseurlConverterFactory,通过GsonConverterFactory达成对服务器再次来到的json数据举行对象的调换
注意:.addConverterFactory(GsonConverterFactory.create())
那边如若采用gson,须要1贰分导入
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

上述示范呈现了动用@Path可完成动态url的造访,retrofit还支持

  • 询问参数的设置@Query

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

对此复杂的查询参数的咬合能够利用贰个Map。

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
  • @POST请求体@Body

@POST("users/new")
Call<User> createUser(@Body User user);
  • 表单的方法传送键值对@FormUrlEncoded

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
  • 单文件上传@Multipart

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
  • 多文本上传@PartMap

@Multipart @POST("register") 
Call<User> registerUser(@PartMap Map<String, RequestBody> params, @Part("description") RequestBody description);}

当中UPRADOL路线中的{user}的值为GetUser函数中的参数 user的取值。

然后经过 RestService类来生成三个
IGitHubApi接口的兑现,使用HttpClient 调用;

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

从地方的示范能够看来, refit使用特性来声称HTTP请求

  • 支撑 U瑞虎L 参数替换和询问参数
  • 回去结果调换为C#指标(重回结果可认为JSON)
  • 支撑 Multipart请求和文件上传

实际使用文书档案

函数和函数参数上的风味证明了请求情势

一、请求格局

种种函数都必须含有
HTTP特性来注明请求格局和乞请的U冠道L路线。类库中有5个HTTP注脚:GET,
POST,
PUT,DELETEHEAD。注脚中的参数为呼吁的相对URL路径

[Get("/users/list")]

在UKoleosL路线中也足以钦赐U帕杰罗L参数:

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

请求的URAV四L能够依照函数参数动态更新。一个可替换的区块为用 {}
包围的字符串,而函数参数必需用 @``AliasAs特性注明,并且天性的参数为
1律的字符串

[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]特性可以声美赞臣(Meadjohnson)个对象作为请求体发送到服务器。

[Post("/users/new")]
Task CreateUser([Body] User user);

对象将被RestService 使用对应的转换器转换为字符串或者字节流提交到服务器。
4、FORM ENCODED AND MULTIPART 表单和Multipart

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

伍、服务器结果调换为C# 对象

使用RestService的转变器把HTTP请求结果(默认为JSON)调换为C#对象,C#对象通过函数再次来到值内定

6、加多请求头

我们得以经过[Headers]来增多请求头,支持动态的乞请头。

refit是丰富强劲的,本文通过增添的言传身教和对源码的开挖,向大家显示了
refit本身强硬的效劳以及扩张性

相关文章