[关闭]
@wangwangheng 2015-04-12T07:46:36.000000Z 字数 5944 阅读 3385

Retrofit文档

第三方&开源


1. 入门

  1. public interface GitHubService {
  2. @GET("/users/{user}/repos")
  3. List<Repo> listRepos(@Path("user") String user);
  4. }
  1. RestAdapter restAdapter = new RestAdapter.Builder()
  2. .setEndpoint("https://api.github.com")
  3. .build();
  4. GitHubService service = restAdapter.create(GitHubService.class);
  1. List<Repo> repos = service.listRepos("octocat");

2. API说明

2.1 请求方法

  1. @GET("/users/list")
  1. @GET("/users/list?sort=desc")

2.2 URL处理

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

2.3 请求体

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

2.4 表单格式和Multipart

  1. @FormUrlEncoded
  2. @POST("/user/edit")
  3. User updateUser(@Field("first_name") String first, @Field("last_name") String last);
  1. @Multipart
  2. @PUT("/user/photo")
  3. User updateUser(@Part("photo") TypedFile photo, @Part("description") TypedString description);

2.5 处理Header

  1. @Headers("Cache-Control: max-age=640000")
  2. @GET("/widget/list")
  3. List<Widget> widgetList();
  1. @Headers({
  2. "Accept: application/vnd.github.v3.full+json",
  3. "User-Agent: Retrofit-Sample-App"
  4. })
  5. @GET("/users/{username}")
  6. User getUser(@Path("username") String username);
  1. @GET("/user")
  2. void getUser(@Header("Authorization") String authorization, Callback<User> callback)
  1. RequestInterceptor requestInterceptor = new RequestInterceptor() {
  2. @Override
  3. public void intercept(RequestFacade request) {
  4. request.addHeader("User-Agent", "Retrofit-Sample-App");
  5. }
  6. };
  7. RestAdapter restAdapter = new RestAdapter.Builder()
  8. .setEndpoint("https://api.github.com")
  9. .setRequestInterceptor(requestInterceptor)
  10. .build();

2.6 同步、异步和Observable

方法能够被声明为同步或者异步执行。

  1. @GET("/user/{id}/photo")
  2. Photo getUserPhoto(@Path("id") int id);
  1. @GET("/user/{id}/photo")
  2. void getUserPhoto(@Path("id") int id, Callback<Photo> cb);

在Android中,callback在主线程中执行。对于桌面应用程序callback将会在执行Http请求的线程中执行。

  1. @GET("/user/{id}/photo")
  2. Observable<Photo> getUserPhoto(@Path("id") int id);

Observable请求是订阅异步请求并且在执行HTTP请求的相同线程上观察,调用在不同的线程的(例如Android的主线程)observeOn(Scheduler)方法对返回的Observable进行观察。

2.7 响应对象类型

  1. @GET("/users/list")
  2. List<User> userList();
  3. @GET("/users/list")
  4. void userList(Callback<List<User>> cb);
  5. @GET("/users/list")
  6. Observable<List<User>> userList();
  1. @GET("/users/list")
  2. Response userList();
  3. @GET("/users/list")
  4. void userList(Callback<Response> cb);
  5. @GET("/users/list")
  6. Observable<Response> userList();

3. RestAdapter配置

RestAdapter是把你的API接口转换为可调用的方法的类(实际上是通过动态代理来生成具体的请求类的对象),默认情况下Retrofit为合适的平台提供合适的默认配置,但是它也允许自定义配置。

3.1 JSON转换器

Retrofit默认使用Gson来转换请求参数并把服务端返回的原生数据转换为你指定的类型。如果你想指定不同的Gson的默认行为(如命名策略,数据类型,自定义类型),可以在build一个RestAdapter的时候指定一个包含你所期望行为新的Gson的实例,可以参考Gson文档来了解自定义Gson行为。

3.2 自定义JSON转换器的实例

下面的代码创建一个把所有字段从用下划线分割的小写字母转换为驼峰命名法。它也为Date类注册了一个类型的适配器。这个DateTypeAdapter将会在Gson解析日期类型的时候使用。

gson实例作为GsonConverter参数,这是一个用于转换类型的包装类。

  1. Gson gson = new GsonBuilder()
  2. .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
  3. .registerTypeAdapter(Date.class, new DateTypeAdapter())
  4. .create();
  5. RestAdapter restAdapter = new RestAdapter.Builder()
  6. .setEndpoint("https://api.github.com")
  7. .setConverter(new GsonConverter(gson))
  8. .build();
  9. GitHubService service = restAdapter.create(GitHubService.class);

3.3 其他的转换器

除了JSON,Retrofit也可以配置其他的内容格式,Retrofit提供了可选的XML转换器(使用Sample -- 一个高性能的XML序列化和配置框架)和协议缓冲池(使用protobuf 或者 Wire).请查看retrofit-converters目录查看所有的转换器列表。

下面的代码展示了怎样使用SimpleXMLConverter与使用XML的API通讯:

  1. RestAdapter restAdapter = new RestAdapter.Builder()
  2. .setEndpoint("https://api.soundcloud.com")
  3. .setConverter(new SimpleXMLConverter())
  4. .build();
  5. SoundCloudService service = restAdapter.create(SoundCloudService.class);

3.4 自定义转换器

入股哦你需要使用一个Retrofit不支持的内容格式与API通讯(如YAML,txt,自定义格式)或者或者你想使用一个不同而库来实现现有格式,你可以轻松的创建你自己的转换器。创建一个类并且实现Converter接口并且在创建适配器的时候传递一个实例。

3.5 自定义错误处理器

如果你需要自定义错误处理的请求,您可以提供自己的ErrorHandler。下面的代码展示了怎样在服务器返回401状态码的时候抛出一个自定义的异常:

  1. class MyErrorHandler implements ErrorHandler {
  2. @Override
  3. public Throwable handleError(RetrofitError cause) {
  4. Response r = cause.getResponse();
  5. if (r != null && r.getStatus() == 401) {
  6. return new UnauthorizedException(cause);
  7. }
  8. return cause;
  9. }
  10. }
  11. RestAdapter restAdapter = new RestAdapter.Builder()
  12. .setEndpoint("https://api.github.com")
  13. .setErrorHandler(new MyErrorHandler())
  14. .build();

注意,如果返回的异常是被封闭的,它必须被定义在接口方法中。建议您通过我们提供的RetrofitError的错误原因抛出新的异常。

3.6 日志

如果你需要详细查看请求和响应,你可以很轻松地添加日志级别到RestAdapter中。可能的日志级别是:BASIC,FULL,HEADERSNONE.

下面的代码展示了如何记录Header,Boady,和元数据请求和响应的一个完整的日志级别:

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

这个日志能够在RestAdapter的任何生命周期的时间点通过调用.setLogLevel()方法添加或者改变不同的日志级别的值。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注