网络框架 Retrofit
2016-02-24 17:47
459 查看
转载出处:http://www.bkjia.com/Androidjc/995850.html
Retrofit官网:http://square.github.io/retrofit/
Retrofit: A type-safe REST client for Android and Java Retrofit简化了从Web
API下载数据,解析成普通的Java对象(POJO)。例如,要从Github 上下载用户仓库的信息,你只需要编写下面的几行:
okHttp: OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。 Gson:GSON是将JSON解析成POJO的Java库。GSON也可以将POJO解析成JSON。Retrofit使用GSON解析JSON数据。
官网:http://square.github.io/retrofit/
1) POJO或模型实体类 : 从服务器获取的JSON数据将被填充到这种类的实例中。
2) 接口 : 我们需要创建一个接口来管理像GET,POST...等请求的URL,这是一个服务类。
3) RestAdapter类 : 这是一个REST客户端(RestClient)类,retrofit中默认用的是Gson来解析JSON数据,你也可以设置自己的JSON解析器,比如jackson
安装:
Maven方式:
Retrofit将RestAPI转变为java接口:
以上使用注解描述HTTP请求的好处:
URL parameter replacement and query parameter support
Object conversion to request body (e.g., JSON, protocol buffers)
Multipart request body and file upload
所有请求都需要一个请求方法注解并以相对URL路径作为参数。内建了5个注解:GET, POST, PUT, DELETE, and HEAD
如:
@GET("/users/list")
你也可以指定查询参数: @GET("/users/list?sort=desc")
所有请求URL可以动态改变,通过如下形式:
还可以通过这种形式添加查询:@Query
BODY请求体
@FormUrlEncoded修饰表单域,每个表单域子件key-value采用@Field修饰
以下方式为同步的:A method with a return type will be executed synchronously.
execution requires the last parameter of the method be a Callback.
返回观察:
Retrofit一旦在项目中发现okHttp,会自动集成okHttp
Retrofit官网:http://square.github.io/retrofit/
Retrofit: A type-safe REST client for Android and Java Retrofit简化了从Web
API下载数据,解析成普通的Java对象(POJO)。例如,要从Github 上下载用户仓库的信息,你只需要编写下面的几行:
<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/users/{user}/repos") List listRepos(@Path("user") String user);</span>
okHttp: OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。 Gson:GSON是将JSON解析成POJO的Java库。GSON也可以将POJO解析成JSON。Retrofit使用GSON解析JSON数据。
Retrofit
官网:http://square.github.io/retrofit/ 2) 接口 : 我们需要创建一个接口来管理像GET,POST...等请求的URL,这是一个服务类。
3) RestAdapter类 : 这是一个REST客户端(RestClient)类,retrofit中默认用的是Gson来解析JSON数据,你也可以设置自己的JSON解析器,比如jackson
安装:
Maven方式:
<span style="font-family:KaiTi_GB2312;font-size:12px;"><dependency> <groupId>com.squareup.retrofit2</groupId> <artifactId>retrofit</artifactId> <version>2.0.0-beta4</version> </dependency></span>Gradle方式:
<span style="font-family:KaiTi_GB2312;font-size:12px;"><pre name="code" class="html">compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'</span>
使用
Retrofit将RestAPI转变为java接口:<span style="font-family:KaiTi_GB2312;font-size:12px;">public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user); }</span>RestAdapter创建HTTP连接并用于创建GitHubService的实现:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com") .build();
<span style="font-family:KaiTi_GB2312;font-size:12px;"> GitHubService service cbf7 = <span style="line-height: 25px;">retrofit </span><span style="line-height: 25px;">.create(GitHubService.class);</span></span>每次调用GitHubService中的方法都会创建一个HTTP请求到服务端
<pre class="prettyprint prettyprinted" style="padding: 9.5px; color: rgb(102, 102, 102); border-radius: 4px; margin-top: 0px; margin-bottom: 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; border: 1px solid rgba(0, 0, 0, 0.14902); background-color: rgb(245, 245, 245);"><span style="font-family:KaiTi_GB2312;font-size:12px;"><span class="typ" style="color: rgb(34, 34, 34);">Call</span><span class="pun" style="color: rgb(136, 136, 136);"><</span><span class="typ" style="color: rgb(34, 34, 34);">List</span><span class="pun" style="color: rgb(136, 136, 136);"><</span><span class="typ" style="color: rgb(34, 34, 34);">Repo</span><span class="pun" style="color: rgb(136, 136, 136);">>></span><span class="pln" style="color: rgb(0, 0, 0);"> repos </span><span class="pun" style="color: rgb(136, 136, 136);">=</span><span class="pln" style="color: rgb(0, 0, 0);"> service</span><span class="pun" style="color: rgb(136, 136, 136);">.</span><span class="pln" style="color: rgb(0, 0, 0);">listRepos</span><span class="pun" style="color: rgb(136, 136, 136);">(</span><span class="str" style="color: rgb(50, 131, 91);">"octocat"</span><span class="pun" style="color: rgb(136, 136, 136);">);</span></span>
以上使用注解描述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如:
"user_repositories_url": "https://api.github.com/users/{user}/repos{?type,page,per_page,sort}",
@GET("users/{user}/repos")
@GET("/users/list")
你也可以指定查询参数: @GET("/users/list?sort=desc")
URL操作
所有请求URL可以动态改变,通过如下形式:<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/group/{id}/users") List<User> groupList(@Path("id") int groupId);</span>其中参数用@Path注解修饰,@Path("id")对应于{id}
还可以通过这种形式添加查询:@Query
<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/group/{id}/users") List<User> groupList(@Path("id") int groupId, @Query("sort") String sort);</span>对于添加更复杂的查询可以采用map形式:
<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/group/{id}/users") List<User> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);</span>REQUEST
BODY请求体
<span style="font-family:KaiTi_GB2312;font-size:12px;">@POST("/users/new") void createUser(@Body User user, Callback<User> cb);</span>注意采用一个POJO作为请求体,它会被RestAdapter进行转换。同时POST方式可以传入回调。
FORM ENCODED AND MULTIPART表单域与文件上传
@FormUrlEncoded修饰表单域,每个表单域子件key-value采用@Field修饰<span style="font-family:KaiTi_GB2312;font-size:12px;">@FormUrlEncoded @POST("/user/edit") User updateUser(@Field("first_name") String first, @Field("last_name") String last);</span>@Multipart修饰用于文件上传,每个Part元素用@Part修饰:
<span style="font-family:KaiTi_GB2312;font-size:12px;">@Multipart @PUT("/user/photo") User updateUser(@Part("photo") TypedFile photo, @Part("description") TypedString description);</span>
处理Header:
<span style="font-family:KaiTi_GB2312;font-size:12px;">@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)</span>如果想给所有的请求添加同一个Header,那么可以采取RequestIntercepor形式:
<span style="font-family:KaiTi_GB2312;font-size:12px;">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();</span>
同步、异步、可观察
以下方式为同步的:A method with a return type will be executed synchronously.<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/user/{id}/photo") Photo getUserPhoto(@Path("id") int id);</span>以下为异步的:Asynchronous
execution requires the last parameter of the method be a Callback.
<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/user/{id}/photo") void getUserPhoto(@Path("id") int id, Callback<Photo> cb);</span>但是需要注意的是在Android中,Callback是在主线程中调用执行的。 总之,带返回值形式为同步,带Callback参数形式为异步请求。
返回观察:
<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/user/{id}/photo") Observable<Photo> getUserPhoto(@Path("id") int id);</span>注意:Retrofit所有的JSON与Object转换工作由RestAdapter完成
<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/users/list") List<User> userList(); @GET("/users/list") void userList(Callback<List<User>> cb); @GET("/users/list") Observable<List<User>> userList();</span>如果你想访问原始HTTP响应:
<span style="font-family:KaiTi_GB2312;font-size:12px;">@GET("/users/list") Response userList(); @GET("/users/list") void userList(Callback<Response> cb); @GET("/users/list") Observable<Response> userList();</span>
RestAdaper配置
JSON转换:Retrofit默认采用Gson.如果你想定制Gson转换(e.g. naming policies, date formats, custom types)可以在RestAdapter构建的时候提供一个Gson对象。
<span style="font-family:KaiTi_GB2312;font-size:12px;">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);</span>处理XML转换:
<span style="font-family:KaiTi_GB2312;font-size:12px;">RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.soundcloud.com") .setConverter(new SimpleXMLConverter()) .build(); SoundCloudService service = restAdapter.create(SoundCloudService.class);</span>
错误处理
<span style="font-family:KaiTi_GB2312;font-size:12px;">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();</span>
日志处理:
<span style="font-family:KaiTi_GB2312;font-size:12px;">RestAdapter restAdapter = new RestAdapter.Builder() .setLogLevel(RestAdapter.LogLevel.FULL) .setEndpoint("https://api.github.com") .build();</span>
集成okHttp
Retrofit一旦在项目中发现okHttp,会自动集成okHttp
Proguard:
<span style="font-family:KaiTi_GB2312;font-size:12px;">-dontwarn retrofit.** -keep class retrofit.** { *; } -keepattributes Signature -keepattributes Exceptions</span>
相关文章推荐
- java发送http的get、post请求
- javascript XMLHttpRequest对象全面剖析
- HttpSession 的作用
- BZOJ1834network 网络扩容
- 计算机网络——1.计算机网络基础
- 解读TCP 四种定时器
- linux上安装apache以及httpd.conf基本配置
- TCP那些事儿(下)
- TCP那些事儿(上)
- Servlet和Android网络交互基础_MVP(2)
- 更新centos yum 网络源到163
- 快速Android开发系列网络篇之Retrofit
- 用Android网络通信技术,在网络上直接传输对象
- HTTPClient模块的HttpGet和HttpPost(处理http请求响应)
- HTTP
- HttpClient的通信
- 周记(cas服务器HTTPS验证配置)
- Android Volley完全解析(二),使用Volley加载网络图片
- 从事系统运维的工作已经N年了,蓦然回首,发现网络上并没有我的身影,于是
- Andorid 6.0 如何使用HttpClient