网络通信框架Retrofit2

网络通信框架Retrofit2

1 概要
Retrofit2的简介以及特点
Retrofit2使用配置(导包,权限等)
Retrofit2中常用的注解介绍
Retrofit2实现http网络访问
GET与POST请求
同步请求和异步请求
Retrofit2实现文件上传
Retrofit2进行大文件下载

2 Retrofit2的特点及简介
简介
Retrofit翻新,改型,改良
Retrofit是针对于Android/Java的、基于okHttp的、一种轻量级并使用注解方式和动态代理的网络请求框架,是目前比较流行的网络框架!
Retrofit是square公司开源系列的精品之一,简单好用,效率高,基于REST的架构风格,本框架的主要开发人Jake Wharton
REST Representational State Transfer简称REST,表述性状态转移传递
一种软件架构的设计风格,针对网络应用的设计和开发方式
Retrofit让开发者面向接口去请求服务,使用注解和代理去发起真正的请求,让开发者更快速的开发应用,省掉一些复杂的逻辑处理
你不用担心android6.0不支持httpclient方式的请求,你也不用引入gson去转换数据与对象,Retrofit都已经完美实现

特点
性能好,处理快,使用简单,目前安卓中使用比较的流行网络请求跨框架之一.(速度上比volley更快!)
支持NIO;(新的IOapi,可以替代标准的java IO API)
使用注解方式,大大简化了我们的URL拼写形式,而且注解含义一目了然,简单易懂
支持同步和异步执行,使得请求变得异常简单,只要调用enqueue/execute即可完成
请求的方法参数注解都可以定制
默认是使用OKHttp处理网络请求的
默认使用Gson来进行数据解析的

相关资料的网址
retrofit官网:
http://square.github.io/retrofit/
github地址:
https://github.com/square/retrofit

3 Retrofit2的使用配置

3.1 modle下build.gradle配置添加如下依赖后进行同步
dependencies {
compile ‘com.squareup.retrofit2:converter-gson:2.0.2‘//
compile ‘com.squareup.retrofit2:retrofit:2.3.0‘
compile ‘com.squareup.okhttp3:okhttp:3.8.1‘
}
同步后External Libraries中会增加:
retrofit-2.3.0
okhttp-3.8.0
okio-1.13.0
gson-2.6.1
converer-gson-2.0.2

3.2 AndroidManifest.xml添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

4 Retrofit2常用注解
请求方法类
4.1 @GET
GET网络请求方式

4.2 @PSOT
POST网络请求方式

@PUT,@DELETE,@PATCH,@HEAD,@OPTIONS,@HTTP
不常用请求方式.

参数类
4.3 @Headers
头信息参数

4.4 @Path
路径参数,用于替换url路径中的变量字符替换,也就是url中的{*}中的*部分
(@Path主要用于Get请求)
例如接口:子连接地址中/wages/{wageId}/detail
替换部分:{wageId}中的wageId.

4.5 @Query
形成单个查询参数,将接口url中追加类似于"page=1"的字符串,形成提交给服务器端的参数.
(主要用于Get请求数据,用于拼接在拼接在url路径后面的查询参数,一个@Query相当于拼接一个参数,多个参数中间用,隔开)

4.5.1,无参数
例如接口:
http://www.weather.com.cn/data/sk/101010100.html
使用注解:
@GET("data/sk/101010100.html")
Call <Weather> getWeather();

4.5.2,单个参数
例如接口:
http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9
形成提交参数的部分:
callback=jsonp9
使用注解:使用注解:
@GET("jp/avlist/202861101/1/")
Call VideoInfo getVideoData(@Query("callback") String callback);

4.5.3,多个参数
例如接口:
http://www.kuaidi100.com/query?type=yuantong&postid=500379523313"
形成提交参数的部分:
type=yuantong&postid=500379523313
使用注解:
@GET("query")
Call QueryInfo QueryInfo(@Query("type") String type,@Query("postid") String postid,);

4.6 @QueryMap
查询参数集合,将url中追加类似于"page=1&count=20"的字符串,形成提交给服务器端的参数.
(主要的效果等同于多个@Query参数拼接,主要也用于Get请求网络数据。)
例如接口:
http://www.kuaidi100.com/query?type=yuantong&postid=500379523313"
形成提交参数的部分:
type=yuantong&postid=500379523313
使用注解:
Call QueryInfo QueryInfo(@QueryMap Map<String, String> map) ;

4.7 @Url
使用此注解参数后,@GET后无需在添加任何内容.
方法中的@Url参数可以是全路径参数,也可以是子路径参数,但是baseurl必须要指定.

4.8 @Field
指定form表单中域中每个控件name以及相应数值
(@Field的用法类似于@Query,主要不同的是@Field主要用于Post请求数据。)

4.9 @FieldMap
表单域集合
(主要用于Post请求数据,@FieldMap的用法类似于@QueryMap)

4.10 @Part
Post提交分块请求
(表单字段,与 PartMap 配合,适合文件上传情况)

4.11PartMap
表单字段,与 Part 配合,适合文件上传情况;默认接受 Map<String, RequestBody> 类型,非 RequestBody 会通过 Converter 转换

4.12 @Body
(指定一个对象作为 request body)非表单请求体
@POST("users/new")
Call<User> createUser(@Body User user);

标记类:

4.13 @FormUrlEncoded
对表单域中填写的内容进行编码处理,避免乱码.
(用于post请求.)
例如:
@FormUrlEncoded
@POST(“/user/edit”)
Call updateUnableApeName(@Field(“first_name”) String first,
@Field(“last_name”) String last);

4.14 @MultiPart
Post提交分块请求,如果上传文件必须指定MultiPart
(请求体是支持文件上传的 From 表单)

4.15 @Streaming
响应体的数据用流的形式返回
(未使用该注解,默认会把数据全部载入内存,之后通过流读取内存中数据,所以返回数据较大时,需要使用该注解)

注意:
Map 用来组合复杂的参数;
Query、QueryMap 与 Field、FieldMap 功能一样,生成的数据形式一样;
Query、QueryMap 的数据体现在url上,主要用于GET请求.
Field、FieldMap 的数据是在请求体上,主要用于Post请求.

5 Retrofit2代码实现步骤(Retrofit2五部曲)
1,定义一个接口(用于存放执行网络请求的方法)
2,实例化Retrofit
3,通过Retrofit实例创建接口服务对象
4,接口服务对象调用其对应的方法,获取Call对象
5,Call对象来执行网络请求(同步或者异步请求)

6 Retrofit2发送GET请求
6.1 GET请求方法中无参数
6.2 GET请求方法指定@Path参数和@Query参数
6.3 GET请求,提交表单数据,方法中定义@QueryMap参数
6.4 GET请求,方法中无参数,但是在@Url中定义完整的Url路径,这种情况下BaseUrl会被忽略!
6.5 GET请求,指定返回结果为ResponseBody.

7 Retrofit2发送POST请求
7.1 Post请求,方法中定义@Fild参数,分别指定各个表单控件的名称
7.2 Post请求,方法中定义@FildMap参数,@FildMap集合中来指定所有控件名称

8 同步请求和异步请求
同步:调用call对象的excute(),需要开启子线程!!!
异步:调用call对象的enqueue(Callback<T> callback)方法,请求结果的回调是在主线程中进行的,这点不同于OkHttp.
9 Retrofit2进行文件上传
9.1 Post请求,方法中定义@Part参数,该参数指定file控件的名称及上传后文件的名称
上传数据类型:multipart/form-data
步骤:锁定File,创建RequestBody,创建MultipartBody.Part
9.2 Post请求,方法中定义@Body参数,向服务器中上传多个文件及其他表单域数据
9.3 Post请求,方法中定义@Part参数,向服务器中上传多个文件及其他表单域数据
9.4 Post请求,方法中定义@PartMap参数,向服务器中上传多个文件及其他表单域数据
使用此种方式变量的书写格式:
file"; filename="123.jpg
(表单控件名称";filename="保存在服务其端的文件名称)
web端:
Content-Disposition: form-data; name="file"; filename="1.txt"
10 Retrofit2进行文件下载
10.1小文件下载整体加载到内存.
10.2大文件下载需使用@Streaming注解,实现边下载边存入sd卡(存入sd卡过程也应该放在子线程中进行,否则会出现异常)

         Java 注解
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
② 代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件、或者运行时中出现(SOURCE/CLASS/RUNTIME)。

元数据的作用
如果要对于元数据的作用进行分类,还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类:
编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查

代码实现:Activity

  1 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2
  3     private TextView tv_content;
  4     private String TAG = this.getClass().getSimpleName();
  5     private String itemName;
  6     private String STR_TAG = TAG + "--->***";
  7     protected OkHttpClient okHttpClient;
  8     protected Handler deliveryHandler;
  9
 10     @Override
 11     protected void onCreate(Bundle savedInstanceState) {
 12         super.onCreate(savedInstanceState);
 13         setContentView(R.layout.activity_main);
 14         findViewById(R.id.btn_retrofit).setOnClickListener(this);
 15         tv_content = (TextView) findViewById(R.id.tv_content);
 16
 17         okHttpClient = OkHttpClientManager.getInstance(this).getOkHttpClient();
 18         deliveryHandler = OkHttpClientManager.getInstance(MainActivity.this).getDeliveryHandler();
 19     }
 20
 21     @Override
 22     public void onClick(View v) {
 23         //弹一个对话框,分类选择:
 24         show();
 25
 26     }
 27
 28     private void show() {
 29         //创建builder对象。
 30         final AlertDialog.Builder builder = new AlertDialog.Builder(this);
 31         //设置标题.
 32         builder.setTitle("Retrofit2操作");
 33         //设置列表内容,以及点击事件.
 34         //参数:1,String数组.2,点击事件.
 35         final String[] items = {
 36                 "0指定无参数GET请求",
 37                 "1指定@Path和@Query参数GET请求",
 38                 "2指定@QueryMap参数集合GET请求",
 39                 "3指定@Url参数GET请求",
 40                 "4指定GET请求返回ResponseBody",
 41                 "5同步GET请求",
 42                 "6指定@Fild参数POST请求",
 43                 "7指定@FildMap参数POST请求",
 44                 "8指定@Part参数单文件上传",
 45                 "9指定@Body多文件上传带参数",
 46                 "10指定@Part通过多文件上传带参数",
 47                 "11指定@PartMap多文件上传带参数",
 48                 "12指定@Streaming大文件下载",
 49         };
 50         builder.setItems(items, new DialogInterface.OnClickListener() {
 51             @Override
 52             public void onClick(DialogInterface dialogInterface, int i) {
 53                 itemName = items[i] + STR_TAG;
 54                 switch (i) {
 55                     case 0:
 56                         get0();
 57                         break;
 58                     case 1:
 59                         get1();
 60                         break;
 61                     case 2:
 62                         get2();
 63                         break;
 64                     case 3:
 65                         get3();
 66                         break;
 67                     case 4:
 68                         get4();
 69                         break;
 70                     case 5:
 71                         get5();
 72                         break;
 73                     case 6:
 74                         get6();
 75                         break;
 76                     case 7:
 77                         get7();
 78                         break;
 79                     case 8:
 80                         get8();
 81                         break;
 82                     case 9:
 83                         get9();
 84                         break;
 85                     case 10:
 86                         get10();
 87                         break;
 88                     case 11:
 89                         get11();
 90                         break;
 91                     case 12:
 92                         get12();
 93                         break;
 94                 }
 95             }
 96         });
 97         builder.create().show();
 98     }
 99
100     private void get11() {
101         final File file = new File(Environment.getExternalStorageDirectory(), "1.txt");
102         final File file1 = new File(Environment.getExternalStorageDirectory(), "2.png");
103         final RequestBody body = MultipartBody.create(MultipartBody.FORM, file);
104         final RequestBody body1 = MultipartBody.create(MultipartBody.FORM, file1);
105         final RequestBody body2 =RequestBody.create(MultipartBody.FORM, "zxn001");
106
107 //        body =MultipartBody.Part.createFormData("file", file.getName(), body).body();
108 //        body1 =MultipartBody.Part.createFormData("file", file.getName(), body1).body();
109 //        final RequestBody body2 = MultipartBody.Part.createFormData("username", "zxn001").body();
110
111
112         String baseUrl = "http://192.168.1.102/";
113         new Retrofit.Builder()
114                 .baseUrl(baseUrl)
115                 .client(okHttpClient)
116                 .build()
117                 .create(NetService.class)
118                 .uploadFilesByPartMap(new HashMap<String, RequestBody>(){
119                     {
120                         put("file\"; filename=\""+file.getName(), body);
121                         put("file\"; filename=\""+file1.getName(), body1);
122                         put("username",body2);
123                     }
124                 })
125                 .enqueue(new Callback<ResponseBody>() {
126                     @Override
127                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
128                         try {
129                             showResult("onResponse"+response.body().string());
130                         } catch (IOException e) {
131                             e.printStackTrace();
132                         }
133                     }
134
135                     @Override
136                     public void onFailure(Call<ResponseBody> call, Throwable t) {
137                         showResult("onFailure"+t.getMessage());
138                     }
139                 });
140     }
141
142     private void get12() {
143         final String baseUrl = "http://1251603248.vod2.myqcloud.com/";
144         final String downUrl = "http://1251603248.vod2.myqcloud.com/4c9adaa7vodtransgzp1251603248/30e0819d9031868223192061218/v.f40.mp4";
145         new Thread(new Runnable() {
146             @Override
147             public void run() {
148                 try {
149                     Response<ResponseBody> response = new Retrofit.Builder()
150                             .baseUrl(baseUrl)
151                             .client(okHttpClient)
152                             .build()
153                             .create(NetService.class)
154                             .download(downUrl)
155                             .execute();
156
157                     if (response.isSuccessful()) {
158                         deliveryHandler.post(new Runnable() {
159                             @Override
160                             public void run() {
161                                 showResult("服务器连接成功!");
162                             }
163                         });
164                         boolean ok = writeDisk(response.body());
165                         Log.i(TAG, STR_TAG + "run: 下载:" + ok);
166                         if (ok) {
167                             deliveryHandler.post(new Runnable() {
168                                 @Override
169                                 public void run() {
170                                     tv_content.setText("下载完成!!");
171                                 }
172                             });
173                         }
174                     } else {
175                         deliveryHandler.post(new Runnable() {
176                             @Override
177                             public void run() {
178                                 showResult("下载失败!");
179                             }
180                         });
181                     }
182                 } catch (IOException e) {
183                     e.printStackTrace();
184                 }
185             }
186         }).start();
187     }
188
189     private boolean writeDisk(ResponseBody body) {
190         try {
191             File file = new File(Environment.getExternalStorageDirectory(), "1.mp4");
192             InputStream inputStream = null;
193             OutputStream outputStream = null;
194             try {
195                 byte[] fileReader = new byte[4096];
196                 long fileSize = body.contentLength();
197                 long loadSize = 0;
198
199                 inputStream = body.byteStream();
200                 outputStream = new FileOutputStream(file);
201                 int len = -1;
202                 while ((len = inputStream.read(fileReader)) != -1) {
203                     outputStream.write(fileReader, 0, len);
204                     loadSize += len;
205                     Log.i(TAG, STR_TAG + "已经下载: " + loadSize + "/总大小: " + fileSize);
206                 }
207                 outputStream.flush();
208                 return true;
209             } catch (IOException e) {
210                 return false;
211             } finally {
212                 if (inputStream != null) {
213                     inputStream.close();
214                 }
215                 if (outputStream != null) {
216                     outputStream.close();
217                 }
218             }
219         } catch (IOException e) {
220             return false;
221         }
222     }
223
224     private void get10() {
225         File file = new File(Environment.getExternalStorageDirectory(), "1.txt");
226         File file1 = new File(Environment.getExternalStorageDirectory(), "2.png");
227         List<MultipartBody.Part> parts = new ArrayList<>();
228         RequestBody body = MultipartBody.create(MultipartBody.FORM, file);
229         RequestBody body1 = MultipartBody.create(MultipartBody.FORM, file1);
230         MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), body);
231         MultipartBody.Part part1 = MultipartBody.Part.createFormData("file", file1.getName(), body1);
232         MultipartBody.Part part2 = MultipartBody.Part.createFormData("username", "zxn001");
233         parts.add(part);
234         parts.add(part1);
235         parts.add(part2);
236
237 //        String baseUrl = "http://192.168.1.102/";
238         String baseUrl = "http://169.254.38.24/";
239         new Retrofit.Builder()
240                 .baseUrl(baseUrl)
241                 .client(okHttpClient)
242                 .build()
243                 .create(NetService.class)
244                 .uploadFilesByPart(parts)
245                 .enqueue(new Callback<ResponseBody>() {
246                     @Override
247                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
248                         try {
249                             showResult("onResponse" + response.body().string());
250                         } catch (IOException e) {
251                             e.printStackTrace();
252                         }
253                     }
254
255                     @Override
256                     public void onFailure(Call<ResponseBody> call, Throwable t) {
257                         showResult("onFailure" + t.getMessage());
258                     }
259                 });
260     }
261
262     private void get9() {
263         File file = new File(Environment.getExternalStorageDirectory(), "a.jpg");
264         File file1 = new File(Environment.getExternalStorageDirectory(), "d.jpg");
265         MultipartBody.Builder builder = new MultipartBody.Builder();
266         RequestBody body = MultipartBody.create(MultipartBody.FORM, file);
267         RequestBody body1 = MultipartBody.create(MultipartBody.FORM, file1);
268         MultipartBody multipartBody = builder
269                 .addFormDataPart("file", file.getName(), body)
270                 .addFormDataPart("file", file1.getName(), body1)
271                 .addFormDataPart("username", "zxn123")
272                 .setType(MultipartBody.FORM)
273                 .build();
274
275 //        String baseUrl = "http://192.168.1.102/";
276         String baseUrl = "http://169.254.38.24/";
277         new Retrofit.Builder()
278                 .baseUrl(baseUrl)
279                 .client(okHttpClient)
280                 .build()
281                 .create(NetService.class)
282                 .uploadFilesByody(multipartBody)
283                 .enqueue(new Callback<ResponseBody>() {
284                     @Override
285                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
286                         try {
287                             showResult("onResponse" + response.body().string());
288                         } catch (IOException e) {
289                             e.printStackTrace();
290                         }
291                     }
292
293                     @Override
294                     public void onFailure(Call<ResponseBody> call, Throwable t) {
295                         showResult("onFailure" + t.getMessage());
296                     }
297                 });
298
299     }
300
301     private void get8() {
302         //指定上传文件
303         File file = new File(Environment.getExternalStorageDirectory(), "3.jpg");
304 //        RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), file);
305
306         //封装请求体
307 //        RequestBody body = RequestBody.create(MediaType.parse("application/otcet-stream"), file);
308         RequestBody body = MultipartBody.create(MultipartBody.FORM, file);
309         MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), body);
310
311
312         //http://192.168.1.100/MyUploadServer/servlet/UpLoadFileServlet
313 //        String baseUrl = "http://192.168.1.102/";
314         String baseUrl = "http://169.254.38.24/";
315
316         new Retrofit.Builder()
317                 .baseUrl(baseUrl)
318                 .client(okHttpClient)
319                 .build()
320                 .create(NetService.class)
321                 .postUpLoadFile(part)
322                 .enqueue(new Callback<ResponseBody>() {
323                     @Override
324                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
325                         try {
326                             showResult("onResponse" + response.body().string());
327                         } catch (IOException e) {
328                             e.printStackTrace();
329                         }
330                     }
331
332                     @Override
333                     public void onFailure(Call<ResponseBody> call, Throwable t) {
334                         showResult("onFailure" + t.getMessage());
335                     }
336                 });
337     }
338
339     private void get7() {
340 //        String baseUrl = "http://v5.pc.duomi.com/search-ajaxsearch-searchall?kw=liedehua&pi=1&pz=10";
341         String baseUrl = "http://v5.pc.duomi.com/";
342         new Retrofit.Builder()
343                 .baseUrl(baseUrl)
344                 .client(okHttpClient)
345                 .build()
346                 .create(NetService.class)
347                 .getSearchByPost(new HashMap<String, String>() {
348                     {
349                         put("kw", "liedehua");
350                         put("pi", "1");
351                         put("pz", "15");
352                     }
353                 }).enqueue(new Callback<ResponseBody>() {
354             @Override
355             public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
356                 try {
357                     showResult("onResponse" + response.body().string());
358                 } catch (IOException e) {
359                     e.printStackTrace();
360                 }
361             }
362
363             @Override
364             public void onFailure(Call<ResponseBody> call, Throwable t) {
365                 showResult("onFailure" + t.getMessage());
366             }
367         });
368     }
369
370     private void get6() {
371 //        String baseUrl = "http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9";
372         String baseUrl = "http://cache.video.iqiyi.com/";
373         new Retrofit.Builder()
374                 .baseUrl(baseUrl)
375                 .client(okHttpClient)
376                 .build()
377                 .create(NetService.class)
378                 .getJpByPost("jsonp9")
379                 .enqueue(new Callback<ResponseBody>() {
380                     @Override
381                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
382                         try {
383                             showResult("onResponse" + response.body().string());
384                         } catch (IOException e) {
385                             e.printStackTrace();
386                         }
387                     }
388
389                     @Override
390                     public void onFailure(Call<ResponseBody> call, Throwable t) {
391                         showResult("onFailure" + t.getMessage());
392                     }
393                 });
394
395     }
396
397     private void get4() {
398         String baseUrl = "http://api.immedc.com/";
399         new Retrofit.Builder()
400                 .baseUrl(baseUrl)
401                 .client(okHttpClient)
402                 .build()
403                 .create(NetService.class)
404                 .getStartBannerResponseBody()
405                 .enqueue(new Callback<ResponseBody>() {
406                     @Override
407                     public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
408                         try {
409                             showResult("onResponse" + response.body().string());
410                         } catch (IOException e) {
411                             e.printStackTrace();
412                         }
413                     }
414
415                     @Override
416                     public void onFailure(Call<ResponseBody> call, Throwable t) {
417                         showResult("onFailure" + t.getMessage());
418                     }
419                 });
420
421     }
422
423     private void get5() {
424         final String baseUrl = "http://www.weather.com.cn/";
425         new Thread(new Runnable() {
426             @Override
427             public void run() {
428                 try {
429                     final Weather weather = new Retrofit.Builder()
430                             .baseUrl(baseUrl)
431                             .addConverterFactory(GsonConverterFactory.create())
432                             .client(okHttpClient)
433                             .build()
434                             .create(NetService.class)
435                             .getWeather()
436                             .execute().body();
437                     MainActivity.this.runOnUiThread(new Runnable() {
438                         @Override
439                         public void run() {
440                             showResult(weather.toString());
441                         }
442                     });
443                 } catch (IOException e) {
444                     e.printStackTrace();
445                 }
446             }
447         }).start();
448     }
449
450     private void get3() {
451         String baseUrl = "http://www.weather.com.cn/";
452 //        String url = "http://www.weather.com.cn/data/sk/101010100.html";
453         String url = "data/sk/101010100.html";
454         new Retrofit.Builder().baseUrl(baseUrl)
455                 .client(okHttpClient)
456                 .addConverterFactory(GsonConverterFactory.create())
457                 .build()
458                 .create(NetService.class)
459                 .getWeather(url)
460                 .enqueue(new Callback<Weather>() {
461                     @Override
462                     public void onResponse(Call<Weather> call, Response<Weather> response) {
463                         showResult("onResponse" + response.body().toString());
464                     }
465
466                     @Override
467                     public void onFailure(Call<Weather> call, Throwable t) {
468                         showResult("onFailure" + t.getMessage());
469                     }
470                 });
471     }
472
473     private void get2() {
474         String baseUrl = "http://www.kuaidi100.com/";
475         new Retrofit.Builder()
476                 .baseUrl(baseUrl)
477                 .client(okHttpClient)
478                 .addConverterFactory(GsonConverterFactory.create())
479                 .build().create(NetService.class)
480                 .getQueryInfo(new HashMap<String, String>() {
481                     {
482                         put("type", "yuantong");
483                         put("postid", "500379523313");
484                     }
485                 }).enqueue(new Callback<QueryInfo>() {
486             @Override
487             public void onResponse(Call<QueryInfo> call, Response<QueryInfo> response) {
488                 showResult("onResponse" + response.body().toString());
489             }
490
491             @Override
492             public void onFailure(Call<QueryInfo> call, Throwable t) {
493                 showResult("onResponse" + t.getMessage());
494             }
495         });
496     }
497
498     private void get1() {
499         String baseUrl = "http://m2.qiushibaike.com/";
500         new Retrofit.Builder().baseUrl(baseUrl)
501                 .addConverterFactory(GsonConverterFactory.create())
502                 .client(okHttpClient)
503                 .build()
504                 .create(NetService.class)
505                 .getArticles("latest", 1)
506                 .enqueue(new Callback<QiushiModel>() {
507                     @Override
508                     public void onResponse(Call<QiushiModel> call, Response<QiushiModel> response) {
509                         showResult("onResponse" + response.body().toString());
510                     }
511
512                     @Override
513                     public void onFailure(Call<QiushiModel> call, Throwable t) {
514                         showResult("onFailure" + t.getMessage());
515                     }
516                 });
517     }
518
519     private void get0() {
520         String url = "http://www.weather.com.cn/";
521         Retrofit.Builder builder = new Retrofit.Builder();
522         builder.baseUrl(url)
523                 .client(okHttpClient)
524                 .addConverterFactory(GsonConverterFactory.create())
525                 .build().create(NetService.class).getWeather().enqueue(new Callback<Weather>() {
526             @Override
527             public void onResponse(Call<Weather> call, Response<Weather> response) {
528                 Weather body = response.body();
529                 showResult(body.toString());
530             }
531
532             @Override
533             public void onFailure(Call<Weather> call, Throwable t) {
534                 showResult(t.getMessage());
535             }
536         });
537     }
538
539     private void showResult(String result) {
540         String mResult = itemName + result;
541         tv_content.setText(mResult);
542         Toast.makeText(this, mResult, Toast.LENGTH_SHORT).show();
543         Log.i(TAG, mResult);
544     }
545 }

创建接口,用于存放网络请求的方法

 1 public interface NetService {
 2
 3     @GET("data/sk/101010100.html")
 4     Call<Weather> getWeather();
 5
 6     @GET("article/list/{type}?")
 7     Call<QiushiModel> getArticles(@Path("type") String type, @Query("page") int page);
 8
 9     @GET("query")
10     Call<QueryInfo> getQueryInfo(@QueryMap Map<String, String> map);
11
12     @GET
13     Call<Weather> getWeather(@Url String url);
14
15     @GET("/restapi/loading/getStartBanner")
16     Call<ResponseBody> getStartBannerResponseBody();
17
18     @FormUrlEncoded
19     @POST("jp/avlist/202861101/1/")
20     Call<ResponseBody> getJpByPost(@Field("callback") String callback);
21
22     @FormUrlEncoded
23     @POST("search-ajaxsearch-searchall")
24     Call<ResponseBody> getSearchByPost(@FieldMap Map<String, String> map);
25
26     @Multipart
27     @POST("MyUploadServer/servlet/UpLoadFileServlet")
28     Call<ResponseBody> postUpLoadFile(@Part() MultipartBody.Part requestBody);
29
30     @POST("MyUploadServer/servlet/MyUploadServlet")
31     Call<ResponseBody> uploadFilesByody(@Body MultipartBody multipartBody);
32
33     @Multipart
34     @POST("MyUploadServer/servlet/MyUploadServlet")
35     Call<ResponseBody> uploadFilesByPart(@Part()  List<MultipartBody.Part> parts);
36
37     @Multipart
38     @POST("MyUploadServer/servlet/MyUploadServlet")
39     Call<ResponseBody> uploadFilesByPartMap(@PartMap()  Map<String, RequestBody> map);
40
41     @Streaming
42     @GET
43     Call<ResponseBody> download(@Url String fileUrl);
44
45 }
时间: 2024-10-07 14:38:12

网络通信框架Retrofit2的相关文章

NetworkComms网络通信框架序言

03年大学毕业,主要做Web开发,大家可以看看networkcomms中文站: www.networkcomms.cn  自己基于网上开源程序二次开发的:) 从06年开始,便把主要的学习精力放到网络通信上, 主要使用C#语言,WinForm框架,sql Server数据库. 工作于大企业的IT部门,平时有较多的时间用于技术研究,即便这样,在学习的初期,几年的时间内,都无法开发出比较稳定的CS系统,网络通信中需要调试和考虑的地方太多,能开发稳定的可复用的通信系统,我想只有传说中的高手才能做到,而我

c#网络通信框架networkcomms内核解析 序言

networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章,希望大家喜欢,个人水平有限,不足之处难免. networkcommsc#通信框架来自于美丽的英国剑桥,由大洋彼岸的两位工程师 Marc Fletcher, Matthew Dean开发. c#网络通信框架networkcomms内核解析之一 消息传送 c#网络通信框架networkcomms内核解析之二 消息处理流程 c#网络通信框架net

c#网络通信框架networkcomms内核解析之十 支持优先级的自定义线程池

本例基于networkcomms2.3.1开源版本  gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池)就是皇冠上的明珠了,这样说应该不夸张的,她那么优美,简洁,高效. 在 <c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据>中我们曾经提到,服务器收到数据后,如果是系统内部保留类型数据或者是最高优先级数据,系统会在主线程中处理,其他的会交给自定义线程池进行处理. 作为服务器,处理成千上万的连接及数据,单线程性能

c#网络通信框架networkcomms内核解析之八 数据包的核心处理器

我们先回顾一个 c#网络通信框架networkcomms内核解析之六 处理接收到的二进制数据 中,主程序把PacketBuilder 中的数据交给核心处理器处理的过程 //创建优先级队列项目 PriorityQueueItem item = new PriorityQueueItem(priority, this, topPacketHeader, packetBuilder.ReadDataSection(packetHeaderSize, topPacketHeader.PayloadPac

Mycat开发实践---Mycat的网络通信框架

1从一个测试说起 网上有人对Cobar和MyCAT做了一个简单的比较测试,过程如下: 1 测试环境 利用A.B.C三大类服务器,在A台上面安装配置MyCAT及Cobar,这样保证了硬件方面的一致性.B类服务器上安装Apache这一web服务,使用PHP语言.C类安装MySQL数据库,其中B类与C类均不止一台,主要目的是为了作压力的均分.C类服务器安装了4台,存放了相同的数据库,对其中一个表进行分片存储. 测试软件使用的是loadRunner.在对两个中间件分别进行测试的过程中,采用的web服务器

网络通信框架之volley

介绍 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高. 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码.于是乎,一些Android网络通信框架也就应

NetworkComms网络通信框架配套CodeSmith模板使用简介

NetworkComms网络通信框架配套CodeSmith模板使用简介 NetworkComms网络通信程序开发过程中,与数据库的交互部分,很多代码我们采用CodeSmith模板来生成. 此套CodeSmith模板目前只支持sql server 数据库 模板下载地址:  [模板下载]分享我所使用的数据库框架 我们以Sql server数据库为例 简单的看一下如何使用CodeSmith模板生成相关文件 首先双击打开模板文件 第二步:打开属性窗口 数据库配置完成后 ,选择相应的表 生成的代码如下:

Android 网络通信框架Volley的解析

在2013年Google I/O大会上,Android开发团队公布了一个新的网络通信框架:Volley.它适合处理通信频繁的网络操作,但对于每一次通信的数据量则有较为苛刻的限制.本文将介绍该通信框架的用法(包括使用现成和自定义的Request),并从源码的角度探究其工作机制. 目前,Android系统中用于实现HTTP通信的方式主要有HttpURLConnection和HttpClient两个类[1],而封装了它们的框架主要有AsyncHttpClient和Universal-Image-Loa

Android-Volley网络通信框架(二次封装数据请求和图片请求(包含处理请求队列和图片缓存))

1.回想 上篇 使用 Volley 的 JsonObjectRequest 和 ImageLoader 写了 电影列表的样例 2.重点 (1)封装Volley 内部 请求 类(请求队列,数据请求,图片请求,图片缓存) (2)封装 Response.Listener 和 Response.ErrorListener 回调函数 (3)用法 3.文件夹介绍 3.1 GsonRequset.java 自己定义Gson请求,直接将 Json字符串  实例化为 对象 3.2 VolleyApplicatio