android网络请求框架汇总

网络

使用网络库不要忘记添加网络权限

2.1网络_Volley

· 简介:
Volley的中文翻译为齐射、并发,是在2013年的Google大会上发布的一款Android平台网络通信库,具有网络请求的处理、小图片的异步加载和缓存等功能,能够帮助Android APP 更方便地执行网络操作,而且更快速高效。

Google IO的演讲上,其配图是一幅发射火弓箭的图,有点类似流星。这表示,Volley特别适合数据量不大但是通信频繁的场景。见下图:

https://android.googlesource.com/platform/frameworks/volley/
https://github.com/mcxiaoke/android-volley

网络资料参考:http://www.dengzhr.com/others/mobile/android/762

· 特点:

通信更快,更简单

支持网络请求的排序,优先级处理

支持网络请求的缓存

多级别的取消请求

扩展性强(可以自己进行相关的封装,比如说请求失败重试机制等)

· 配置依赖:

0. compile'com.mcxiaoke.volley:library:1.0.19'

 

· 使用步骤:

1. 创建RequestQueue

1.  requestQueue= Volley.newRequestQueue(this);

2. 创建Request对象

1. //StringRequest响应的主体为字符串

2. //JsonArrayRequest发送和接收JSON数组

3. //JsonObjectRequest发送和接收JSON对象

4. //ImageRequest发送和接收Image

5. //StringRequest

6. //这里有两个构造方法,一个是有method参数,一个是没有method参数的,那么没有method参数的默认为GET method

7. StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener)   

8. StringRequest(String url, Listener<String> listener, ErrorListener errorListener)

 

3. 添加RequestRequestQueue

· 注意事项:

如果自己编译Volley的话,compileSdkVersion需要<=22,这是因为在Android6.0Google移除了httpClient相关的API

o Volley仅适合用于通信频繁数据量小的网络操作

大数据量的网络操作并不适合Volley

· 工作原理图

· 使用步骤:

0. 创建RequestQueue

1. 创建Request对象

2. 添加Request对象到RequestQueue

2.2网络_Okhttp

· 主页https://github.com/square/okhttp

· OkHttp是一个高效的Http客户端,有如下的特点::

支持HTTP/2 SPDY

默认支持 GZIP 降低传输内容的大小

支持网络请求的缓存

当网络出现问题时,自动重试一个主机的多个IP 地址

· 配置: 添加依赖 compile 'com.squareup.okhttp3:okhttp:3.2.0'

· 使用步骤:

0. 创建OkHttpClient对象

1. 创建Request对象

2. 添加Request对象到OkHttpClient对象中并执行请求.示例代码:

 

1.  OkHttpClient okHttpClient= new OkHttpClient();

 

-------Get 请求---------

2. //Get请求方式  

3. //默认情况下,Request就是是使用Get请求

4. Request requestGet=new Request.Builder()

5.                 .url(URL_GET)

6.                 .build();

 

7.  //默认情况下,Request就是是使用Get请求方式

8.         Request requestGet=new Request.Builder()

9.                 .url(URL_GET)

10.                 .build();

11.         //生成Call进行同步或者异步的调用

12.         Call call= okHttpClient.newCall(requestGet);

13.         //同步调用

14. //        Response response = call.execute();

15.         //异步调用

16.         call.enqueue(new Callback() {

17.             @Override

18.             public void onFailure(Call call, IOException e) {

19.                 //请求失败的时候执行

20.             }

21. 

22.             @Override

23.             public void onResponse(Call call, Response response) throws IOException {

24.                 //网络请求成功响应

25.             }

26.         });

 

------Post 请求---------

27.     RequestBody body= new FormBody.Builder()//请求体

28.             .add("phone", "13812345678")//构造请求的参数

29.             .add("key", "daf8fa858c330b22e342c882bcbac622")//构造请求的参数

30.             .build();

31. 

32.     Request post_request= new Request.Builder()

33.             .url(URL_POST)//指定请求的地址

34.             .post(body)//指定请求的方式为POST

35.             .build();

36.     client.newCall(post_request).enqueue(new Callback() {

37.         @Override

38.         public void onFailure(Call call, IOException e) {

39.             //请求失败的处理

40.         }

41. 

42.         @Override

43.         public void onResponse(Call call, Response response) throws IOException {   //请求成功的处理

44.             ResponseBody body= response.body();

45.             String string= body.string();//把返回的结果转换为String类型

46.             // body.bytes();//把返回的结果转换为byte数组

47.             // body.byteStream();//把返回的结果转换为流

48.         }

49.     });

 

· 因为原生OkHttp的使用比较复杂,有一个包装过的工具项目okhttp-utils使用非常简单

添加依赖

1. compile'com.zhy:okhttputils:2.3.8'

 

工具类简介:https://github.com/hongyangAndroid/okhttp-utils
代码写起来很简单,如下:

2.  OkHttpUtils

3.                 .get()//如果是Post请求,用.post()

4.                 .url(URL)

5.                 .addParams("key","value")

6.                 .build()

7.                 .execute(new StringCallback() {

8.                     @Override

9.                     public void onError(Call call, Exception e) {

10.                         //可以直接在这里进行UI的操作

11.                         //网络访问错误

12.                     }

13. 

14.                     @Override

15.                     public void onResponse(String response) {

16.                         //可以直接在这里进行UI的操作

17.                         //网络正常逻辑

18.                     }

19.                 });

 

2.3网络_Retrofit

· 主页https://github.com/square/retrofit

· 功能:

效率非常高

可以直接将结果转换称Java

可以配合RxJava一起使用

· 配置:

添加Retrofit依赖: compile 'com.squareup.retrofit2:retrofit:2.0.2'

添加数据解析依赖,根据实际情况进行选择

§ Gson : com.squareup.retrofit2:converter-gson:2.0.2

§ Jackson : com.squareup.retrofit2:converter-jackson:2.0.2

§ Moshi : com.squareup.retrofit2:converter-moshi:2.0.2

§ Protobuf : com.squareup.retrofit2:converter-protobuf:2.0.2

§ Wire : com.squareup.retrofit2:converter-wire:2.0.2

§ Simple XML : com.squareup.retrofit2:converter-simplexml:2.0.2

· 使用步骤:

0. 创建JsonBean(可以用工具生成)

1. Http Api 转化为 java interface.

0.  /**

1.      *对应Http接口的Java Interface

2.      */

3.     interface HttpApi {

4. 

5.         //网络请求方式,请求Url

6.         @GET("home")

7.         Call<HomeResponse> getHomeData();

8. 

9.         /*GET有参数请求:

10.             1、可以在url后面直接进行参数拼接,比如    @GET("home?key=value&key2=value2")

11.             2、可以用@Query进行参数设置,可以有多个

12.             3、可以用@QueryMap进行参数设置用Map集合进行参数

13.             */

14.         @GET("home")

15.         Call<HomeResponse> getHomeData(@Query("key1") String value1, @Query("key2") String value2);

16. 

17.         @GET("home")

18.         Call<HomeResponse> getHomeData(@QueryMap Map<String, String> params);

19. 

20. 

21.         /*POST有参数请求:

22.          1、可以用@Field进行参数设置,可以有多个

23.          2、可以用@FieldMap进行参数设置用Map集合进行参数

24.          */

25.         @FormUrlEncoded

26.         @POST("search")

27.         Call<SearchResponse> search(

28.                 @Field("keyword") String keyword,

29.                 @Field("page") String page,

30.                 @Field("pageNum") String pageNum,

31.                 @Field("orderby") String orderby

32.         );

33. 

34.         @FormUrlEncoded

35.         @POST("search")

36.         Call<SearchResponse> search(

37.                 @FieldMap Map<String, String> params

38.         );

39. 

40. 

41.     }

 

 

§ 

0. 创建Retrofit对象,并发起请求.示例代码:

0.   //3.1创建Retrofit实例,进行接口实现

1.         retrofit= new Retrofit

2.                 .Builder()

3.                 .baseUrl(baseUrl)

4.                 .addConverterFactory(GsonConverterFactory.create())

5.                 .build();

6.         //3.2实例化接口类

7.         HomeApi homeApi= retrofit.create(HomeApi.class);

8.         //3.3调用接口的方法得到Call

9.         Call<HomeResponse> homeResponseCall= homeApi.getHomeData();

10.         //3.4执行数据的请求操作,可以用同步或者是异步的操作

11.         //3.4.1同步操作,耗时操作需要在线程中执行

12.         /*try {

13.             Response homeResponseResponse = homeResponseCall.execute();

14.             HomeResponse homeResponse = homeResponseResponse.body();

15. 

16.         } catch (IOException e) {

17.             e.printStackTrace();

18.         }*/

19. 

20.         //3.4.2异步的操作,okhttp的异步执行不同的是,可以在回掉的方法中进行UI的控制操作

21.         homeResponseCall.enqueue(new Callback<HomeResponse>() {

22.             @Override

23.             public void onResponse(Call<HomeResponse> call, Response<HomeResponse> response) {

24.                 HomeResponse homeResponse= response.body();

25.                 textView.setText(homeResponse.toString());

26.                 textView.setTextColor(Color.GREEN);

27.             }

28. 

29.             @Override

30.             public void onFailure(Call<HomeResponse> call, Throwable t) {

31.                 textView.setText(t.getMessage());

32.                 textView.setTextColor(Color.RED);

33.             }

34.         });

 

· 常用注解:

请求方法:@GET / @POST / @PUT / @DELETE / @HEAD

o URL处理

1、拼接注意,建议baseUrl“/”结尾,接口中url不用"/"开头

例子:baseUrl=http://10.0.2.2:8080/market/        url=home

错误案例

0. 案例一:

1. baseUrl=http://10.0.2.2:8080/market        url=home

2. --->http://10.0.2.2:8080/home

3. 分析:默认用最后一个斜线去拼接

4. 

5. 案例二:

6. baseUrl=http://10.0.2.2:8080/market        url=/home

7. --->http://10.0.2.2:8080/home

8. 分析:url中开始的斜线代表主机地址http://10.0.2.2:8080

 

2、注解:

§ @Path - 替换参数

1. @GET("{path1}/{path2}")//注意:如果路径用“/”分割,就需要使用多个参数表示

2. public Call<ResponseData> groupList(@Path("path1") String path1,@Path("path2") String path2);

§ @Query - 添加查询参数,在GET请求中使用

3.  @GET("home")

4.  Call<HomeResponse> getHomeData(@Query("key1") String value1, @Query("key2") String value2);

 

§ @QueryMap - 如果有多个查询参数,把它们放在Map中,在GET请求中使用

5.  @GET("home")

6.  Call<HomeResponse> getHomeData(@QueryMap Map<String, String> params);

 

§ @Field单个字段,@FieldMap多个字段,把它们放在Map中,在Post请求中使用

@FormUrlEncoded 编码控制 与Post请求结合使用,不能缺少。

7.  @FormUrlEncoded

8.  @POST("search")

9.  Call<SearchResponse> search(

10.          @Field("keyword") String keyword,

11.          @Field("page") String page,

12.          @Field("pageNum") String pageNum,

13.          @Field("orderby") String orderby

14.  );

15.  @FormUrlEncoded

16.  @POST("search")

17.  Call<SearchResponse> search(

18.          @FieldMap Map<String, String> params

19.  );

 

拓展:Retrofitokhttp进化而来的,那么也是支持返回ResponseBody类型的,我们也可以直接使用返回数据类型ResponseBody来进行格式化字符串的获取。

20. //接口中的方法

21. @GET("home")

22. Call<ResponseBody> getHomeDataStr();

 

23. 

24.   //直接获取json字符串

25.         retrofit.create(HttpApi.class)

26.                 .getHomeDataStr()

27.                 .enqueue(new Callback<ResponseBody>() {

28.                     @Override

29.                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {

30.                         String resultStr=null;

31.                         if (response.isSuccessful()) {

32.                             ResponseBody body= response.body();

33.                             try {

34.                                 resultStr= body.string();

35.                             } catch (IOException e) {

36.                                 e.printStackTrace();

37.                             }

38.                         }

39.                     }

40. 

41.                     @Override

42.                     public void onFailure(Call<ResponseBody> call, Throwable t) {

43. 

44.                     }

45.                 });

 

 

· 优点

· 

 

你可能感兴趣的:(android网络请求框架汇总)