Retrofit会将你的HTTP接口调用转换为java的interface,你没必要去实现这个接口,交给Retrofit来建立动态代理.
首先,贴上官网和Javadoc.java
加依赖,下jar包什么的就跳过了,来一个官网例子就知道怎么用了.git
//interface public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user); }
//建立工厂 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .build(); //建立代理对象 GitHubService service = retrofit.create(GitHubService.class);
//调用方法得到Call对象 Call<List<Repo>> repos = service.listRepos("octocat");
此时尚未发送请求去调用HTTP API.Call对象提供了同步和异步两种方式来发送请求:github
//同步,出错时抛出IO或者Runtime异常 Response response = call.execute();
//异步 call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { //TODO 成功时的回调 } @Override public void onFailure(Call call, Throwable t) { //TODO 失败时的回调 } });
关于Reponse和Call的细节,能够去看Javadoc.json
Retrofit的类仍是挺少的,这里就介绍些我用过的注解吧.api
@GET
,@POST
,@DELETE
,@HEAD
,@PUT
,@PATCH
和@HTTP
.除了@HTTP
以外都没什么好说的.
@HTTP
有三个参数:method,hasBody和path:app
@HTTP(method = "DELETE", path = "admin/delete_user", hasBody = true) Call<Message> deleteUser(@Body UserVO vo, @Header("Apitoken") ApiToken apiToken , @Header("X-Forwarded-For") String forwardedFor);
一些蛋疼的DELETE,POST或者PUT API的response会有body,可是@DELETE
,@POST
,@PUT
都不能有body,这时候就要用@HTTP
了.异步
@Header
,@Body
,@Path
,@Query
,@QueryMap
,'@Headers'
对应的参数若是不是基本类型包装类的话会自动转换为json,没有记错的话,@Query
,@QueryMap
不能和'@POST','@PUT'搭配使用,直接来点例子吧.ide
@GET("strategy") Call<List<Strategy>> getStrategyList(@Query("tid") Long tid, @Header("Apitoken")ApiToken apiToken, @Header("X-Forwarded-For") String forwardedFor);
@GET("graph/endpoint_counter") Call<List<String>> getCounterOfEndpoint(@QueryMap Map<String, String> map, @Header("Apitoken") ApiToken apiToken, @Header("X-Forwarded-For") String forwardedFor);
//不要在乎这个奇怪的API @Headers({"Content-type: application/x-www-form-urlencoded"}) @GET("alarm/eventcases") Call<List<EventCase>> getEventCasesById(@Query("eventid") String eventId, @Header("Apitoken") ApiToken apiToken, @Header("X-Forwarded-For") String forwardedFor);
须要注意的是格式和参数的注解是对应的.ui
@FormUrlEncoded @POST("user/edit") Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
@Multipart @PUT("user/photo") Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
经过添加不一样的依赖来使用不一样的转换器:url