retrofit--------样例代码

简介: Retrofit 官网:http://square.github.io/retrofit/  1) POJO或模型实体类 : 从服务器获取的JSON数据将被填充到这种类的实例中。2) 接口 : 我们需要创建一个接口来管理像GET,POST...等请求的URL,这是一个服务类。3) RestAdapter类 : 这是一个REST客户端(RestClient)类,ret

Retrofit

官网:http://square.github.io/retrofit/ 





1) POJO或模型实体类 : 从服务器获取的JSON数据将被填充到这种类的实例中。
2) 接口 : 我们需要创建一个接口来管理像GET,POST...等请求的URL,这是一个服务类。
3) RestAdapter类 : 这是一个REST客户端(RestClient)类,retrofit中默认用的是Gson来解析JSON数据,你也可以设置自己的JSON解析器,比如jackson


使用

Retrofit将RestAPI转变为java接口:
public interface Github {

    @GET("/repos/{owner}/{repo}/contributors")
    List<GithubClient.Contributor>contributors(@Path("owner") String owner,@Path("repo")String repo);

    @GET("/repos/{owner}/{repo}/contributors")
    void contributors(@Path("owner")String owner, @Path("repo")String repo, Callback<List<GithubClient.Contributor>> callable);

}

RestAdapter创建HTTP连接并用于创建GitHubAdapter的实现:


public static void getContributors(Callback<List<Contributor>>callable){

    RestAdapter restAdapter=new RestAdapter.Builder().setServer(API_URLa).build();

    Github github=restAdapter.create(Github.class);

    github.contributors("square","retrofit",callable);
}


每次调用GitHubAdapter中的方法都会创建一个HTTP请求到服务端:


GithubClient.getContributors(callback);

以上使用注解描述HTTP请求的好处:

  • URL parameter replacement and query parameter support
  • Object conversion to request body (e.g., JSON, protocol buffers)
  • Multipart request body and file upload

API注解

所有请求都需要一个请求方法注解并以相对URL路径作为参数。内建了5个注解:GET, POST, PUT, DELETE, and HEAD
@GET("/repos/list")
你也可以指定查询参数: @GET("/repos/list?sort=desc")

URL操作


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

其中参数用@Path注解修饰,@Path("id")对应于{id} 还可以通过这种形式添加查询:@Query

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

对于添加更复杂的查询可以采用map形式:

@GET("/group/{id}/users")
List<User> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

REQUEST BODY请求体

@POST("/users/new")
void createUser(@Body User user, Callback<User> cb);

注意采用一个POJO作为请求体,它会被RestAdapter进行转换。同时POST方式可以传入回调。

FORM ENCODED AND MULTIPART表单域与文件上传

@FormUrlEncoded修饰表单域,每个表单域子件key-value采用@Field修饰
@FormUrlEncoded
@POST("/user/edit")
User updateUser(@Field("first_name") String first, @Field("last_name") String last);

@Multipart修饰用于文件上传,每个Part元素用@Part修饰:

@Multipart
@PUT("/user/photo")
User updateUser(@Part("photo") TypedFile photo, @Part("description") TypedString description);


处理Header:

@Headers("Cache-Control: max-age=640000")
@GET("/widget/list")
List<Widget> widgetList();
@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("/users/{username}")
User getUser(@Path("username") String username);
@GET("/user")
void getUser(@Header("Authorization") String authorization, Callback<User> callback)
如果想给所有的请求添加同一个Header,那 么可以采取RequestIntercepor形式:
RequestInterceptor requestInterceptor = new RequestInterceptor() {
  @Override
  public void intercept(RequestFacade request) {
    request.addHeader("User-Agent", "Retrofit-Sample-App");
  }
};

RestAdapter restAdapter = new RestAdapter.Builder()
  .setEndpoint("https://api.github.com")
  .setRequestInterceptor(requestInterceptor)
  .build();

同步、异步、可观察

以下方式为同步的:A method with a return type will be executed synchronously.
@GET("/user/{id}/photo")
Photo getUserPhoto(@Path("id") int id);
以下为异步的:Asynchronous execution requires the last parameter of the method be a Callback.
@GET("/user/{id}/photo")
void getUserPhoto(@Path("id") int id, Callback<Photo> cb);
但是需要注意的是在Android中,Callback是在主线程中调用执行的。  总之,带返回值形式为同步,带Callback参数形式为异步请求。 返回观察:
@GET("/user/{id}/photo")
Observable<Photo> getUserPhoto(@Path("id") int id);
Observable requests are subscribed asynchronously and observed on the same thread that executed the HTTP request. To observe on a different thread (e.g. Android's main thread) call observeOn(Scheduler) on the returned Observable.

RESPONSE OBJECT TYPE

注意:Retrofit所有的JSON与Object转换工作由RestAdapter完成
@GET("/users/list")
List<User> userList();

@GET("/users/list")
void userList(Callback<List<User>> cb);

@GET("/users/list")
Observable<List<User>> userList();
如果你想访问原始HTTP响应:
@GET("/users/list")
Response userList();

@GET("/users/list")
void userList(Callback<Response> cb);

@GET("/users/list")
Observable<Response> userList();

RestAdaper配置

JSON转换:Retrofit默认采用Gson.如果你想定制Gson转换(e.g. naming policies, date formats, custom types)可以在RestAdapter构建的时候提供一个Gson对象。

Gson gson = new GsonBuilder()
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
    .registerTypeAdapter(Date.class, new DateTypeAdapter())
    .create();

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .setConverter(new GsonConverter(gson))
    .build();

GitHubService service = restAdapter.create(GitHubService.class);
处理XML转换:
RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.soundcloud.com")
    .setConverter(new SimpleXMLConverter())
    .build();

SoundCloudService service = restAdapter.create(SoundCloudService.class);

错误处理

class MyErrorHandler implements ErrorHandler {
  @Override public Throwable handleError(RetrofitError cause) {
    Response r = cause.getResponse();
    if (r != null && r.getStatus() == 401) {
      return new UnauthorizedException(cause);
    }
    return cause;
  }
}

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .setErrorHandler(new MyErrorHandler())
    .build();

日志处理:

RestAdapter restAdapter = new RestAdapter.Builder()
    .setLogLevel(RestAdapter.LogLevel.FULL)
    .setEndpoint("https://api.github.com")
    .build();

集成okHttp

Retrofit一旦在项目中发现okHttp,会自动集成okHttp

Proguard:

-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions

样例代码地址 :https://github.com/linhaosheng/RetrofitDemo-master



目录
相关文章
简洁方法,替代set和get的方法----lombok
简洁方法,替代set和get的方法----lombok
|
小程序 前端开发 定位技术
小程序----组件
小程序----组件
|
11月前
|
Java 数据库
反射-----JAVAEE反射机制-----详细结合代码分析
反射-----JAVAEE反射机制-----详细结合代码分析
|
Java
Java中的递归(recursion)方法----简单介绍加演示
Java中的递归(recursion)方法----简单介绍加演示
155 3
Java中的递归(recursion)方法----简单介绍加演示
|
算法 安全 JavaScript
python---js逆向------再接再励------案例
python---js逆向------再接再励------案例
|
编译器 C++ 异构计算
|
XML 存储 JSON
SpringBoot2.x系列教程18--ContentNegotiatingViewResolver实现同一接口输出不同的View内容
前言 在上一章节中,壹哥 给大家讲解了ContentNegotiating内容协商的简单使用及原理分析,让我们明白了内容协商在HttpMessage上的作用。 我们知道,利用ContentNegotiating可以实现访问同一个URL接口,可以访问不同格式的数据,比如返回JSON、XML格式;那么如果我想使用同样的数据内容来呈现出不同的View该怎么办呢?这就要用到我今天要讲的内容了。 内容协商不仅可以作用在HttpMessage上面,还可以作用在我们输出的View视图内容上,本章节我会继续讲解这一块的内容。 一. 内容协商视图解析器 1. 概述 我们利用ContentNegotiatin
225 1
|
存储 Java 编译器
二十八、JavaSE----注解
二十八、JavaSE----注解
二十八、JavaSE----注解
|
Java
Java实现图片转字符输出示例demo
前面几篇博文介绍了使用jdk来对图片做一些有意思的转换,接下来我们再介绍一个有意思的玩法,直接根据图片,输出一个二维字符数组,实现用字符来实现绘画的场景 各位小伙伴可能都有看到过一些有趣的注释,比如大佛,美女之类的,通关本文,相信你也很可以很简单的实现类似的场景 作者:一灰灰 链接:https://juejin.cn/post/7033040253673799711 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
131 0
Java实现图片转字符输出示例demo
|
测试技术 Python
Pytest----如何使用断言
Pytest----如何使用断言
162 0