网络通信框架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

 public class MainActivity extends AppCompatActivity implements View.OnClickListener {

     private TextView tv_content;
private String TAG = this.getClass().getSimpleName();
private String itemName;
private String STR_TAG = TAG + "--->***";
protected OkHttpClient okHttpClient;
protected Handler deliveryHandler; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_retrofit).setOnClickListener(this);
tv_content = (TextView) findViewById(R.id.tv_content); okHttpClient = OkHttpClientManager.getInstance(this).getOkHttpClient();
deliveryHandler = OkHttpClientManager.getInstance(MainActivity.this).getDeliveryHandler();
} @Override
public void onClick(View v) {
//弹一个对话框,分类选择:
show(); } private void show() {
//创建builder对象。
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
//设置标题.
builder.setTitle("Retrofit2操作");
//设置列表内容,以及点击事件.
//参数:1,String数组.2,点击事件.
final String[] items = {
"0指定无参数GET请求",
"1指定@Path和@Query参数GET请求",
"2指定@QueryMap参数集合GET请求",
"3指定@Url参数GET请求",
"4指定GET请求返回ResponseBody",
"5同步GET请求",
"6指定@Fild参数POST请求",
"7指定@FildMap参数POST请求",
"8指定@Part参数单文件上传",
"9指定@Body多文件上传带参数",
"10指定@Part通过多文件上传带参数",
"11指定@PartMap多文件上传带参数",
"12指定@Streaming大文件下载",
};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
itemName = items[i] + STR_TAG;
switch (i) {
case 0:
get0();
break;
case 1:
get1();
break;
case 2:
get2();
break;
case 3:
get3();
break;
case 4:
get4();
break;
case 5:
get5();
break;
case 6:
get6();
break;
case 7:
get7();
break;
case 8:
get8();
break;
case 9:
get9();
break;
case 10:
get10();
break;
case 11:
get11();
break;
case 12:
get12();
break;
}
}
});
builder.create().show();
} private void get11() {
final File file = new File(Environment.getExternalStorageDirectory(), "1.txt");
final File file1 = new File(Environment.getExternalStorageDirectory(), "2.png");
final RequestBody body = MultipartBody.create(MultipartBody.FORM, file);
final RequestBody body1 = MultipartBody.create(MultipartBody.FORM, file1);
final RequestBody body2 =RequestBody.create(MultipartBody.FORM, "zxn001"); // body =MultipartBody.Part.createFormData("file", file.getName(), body).body();
// body1 =MultipartBody.Part.createFormData("file", file.getName(), body1).body();
// final RequestBody body2 = MultipartBody.Part.createFormData("username", "zxn001").body(); String baseUrl = "http://192.168.1.102/";
new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
.create(NetService.class)
.uploadFilesByPartMap(new HashMap<String, RequestBody>(){
{
put("file\"; filename=\""+file.getName(), body);
put("file\"; filename=\""+file1.getName(), body1);
put("username",body2);
}
})
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
showResult("onResponse"+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
showResult("onFailure"+t.getMessage());
}
});
} private void get12() {
final String baseUrl = "http://1251603248.vod2.myqcloud.com/";
final String downUrl = "http://1251603248.vod2.myqcloud.com/4c9adaa7vodtransgzp1251603248/30e0819d9031868223192061218/v.f40.mp4";
new Thread(new Runnable() {
@Override
public void run() {
try {
Response<ResponseBody> response = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
.create(NetService.class)
.download(downUrl)
.execute(); if (response.isSuccessful()) {
deliveryHandler.post(new Runnable() {
@Override
public void run() {
showResult("服务器连接成功!");
}
});
boolean ok = writeDisk(response.body());
Log.i(TAG, STR_TAG + "run: 下载:" + ok);
if (ok) {
deliveryHandler.post(new Runnable() {
@Override
public void run() {
tv_content.setText("下载完成!!");
}
});
}
} else {
deliveryHandler.post(new Runnable() {
@Override
public void run() {
showResult("下载失败!");
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} private boolean writeDisk(ResponseBody body) {
try {
File file = new File(Environment.getExternalStorageDirectory(), "1.mp4");
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] fileReader = new byte[4096];
long fileSize = body.contentLength();
long loadSize = 0; inputStream = body.byteStream();
outputStream = new FileOutputStream(file);
int len = -1;
while ((len = inputStream.read(fileReader)) != -1) {
outputStream.write(fileReader, 0, len);
loadSize += len;
Log.i(TAG, STR_TAG + "已经下载: " + loadSize + "/总大小: " + fileSize);
}
outputStream.flush();
return true;
} catch (IOException e) {
return false;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
} catch (IOException e) {
return false;
}
} private void get10() {
File file = new File(Environment.getExternalStorageDirectory(), "1.txt");
File file1 = new File(Environment.getExternalStorageDirectory(), "2.png");
List<MultipartBody.Part> parts = new ArrayList<>();
RequestBody body = MultipartBody.create(MultipartBody.FORM, file);
RequestBody body1 = MultipartBody.create(MultipartBody.FORM, file1);
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), body);
MultipartBody.Part part1 = MultipartBody.Part.createFormData("file", file1.getName(), body1);
MultipartBody.Part part2 = MultipartBody.Part.createFormData("username", "zxn001");
parts.add(part);
parts.add(part1);
parts.add(part2); // String baseUrl = "http://192.168.1.102/";
String baseUrl = "http://169.254.38.24/";
new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
.create(NetService.class)
.uploadFilesByPart(parts)
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
showResult("onResponse" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
showResult("onFailure" + t.getMessage());
}
});
} private void get9() {
File file = new File(Environment.getExternalStorageDirectory(), "a.jpg");
File file1 = new File(Environment.getExternalStorageDirectory(), "d.jpg");
MultipartBody.Builder builder = new MultipartBody.Builder();
RequestBody body = MultipartBody.create(MultipartBody.FORM, file);
RequestBody body1 = MultipartBody.create(MultipartBody.FORM, file1);
MultipartBody multipartBody = builder
.addFormDataPart("file", file.getName(), body)
.addFormDataPart("file", file1.getName(), body1)
.addFormDataPart("username", "zxn123")
.setType(MultipartBody.FORM)
.build(); // String baseUrl = "http://192.168.1.102/";
String baseUrl = "http://169.254.38.24/";
new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
.create(NetService.class)
.uploadFilesByody(multipartBody)
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
showResult("onResponse" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
showResult("onFailure" + t.getMessage());
}
}); } private void get8() {
//指定上传文件
File file = new File(Environment.getExternalStorageDirectory(), "3.jpg");
// RequestBody body = RequestBody.create(MediaType.parse("multipart/form-data"), file); //封装请求体
// RequestBody body = RequestBody.create(MediaType.parse("application/otcet-stream"), file);
RequestBody body = MultipartBody.create(MultipartBody.FORM, file);
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), body); //http://192.168.1.100/MyUploadServer/servlet/UpLoadFileServlet
// String baseUrl = "http://192.168.1.102/";
String baseUrl = "http://169.254.38.24/"; new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
.create(NetService.class)
.postUpLoadFile(part)
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
showResult("onResponse" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
showResult("onFailure" + t.getMessage());
}
});
} private void get7() {
// String baseUrl = "http://v5.pc.duomi.com/search-ajaxsearch-searchall?kw=liedehua&pi=1&pz=10";
String baseUrl = "http://v5.pc.duomi.com/";
new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
.create(NetService.class)
.getSearchByPost(new HashMap<String, String>() {
{
put("kw", "liedehua");
put("pi", "1");
put("pz", "15");
}
}).enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
showResult("onResponse" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
showResult("onFailure" + t.getMessage());
}
});
} private void get6() {
// String baseUrl = "http://cache.video.iqiyi.com/jp/avlist/202861101/1/?callback=jsonp9";
String baseUrl = "http://cache.video.iqiyi.com/";
new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
.create(NetService.class)
.getJpByPost("jsonp9")
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
showResult("onResponse" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
showResult("onFailure" + t.getMessage());
}
}); } private void get4() {
String baseUrl = "http://api.immedc.com/";
new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.build()
.create(NetService.class)
.getStartBannerResponseBody()
.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
showResult("onResponse" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
showResult("onFailure" + t.getMessage());
}
}); } private void get5() {
final String baseUrl = "http://www.weather.com.cn/";
new Thread(new Runnable() {
@Override
public void run() {
try {
final Weather weather = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
.create(NetService.class)
.getWeather()
.execute().body();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
showResult(weather.toString());
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} private void get3() {
String baseUrl = "http://www.weather.com.cn/";
// String url = "http://www.weather.com.cn/data/sk/101010100.html";
String url = "data/sk/101010100.html";
new Retrofit.Builder().baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(NetService.class)
.getWeather(url)
.enqueue(new Callback<Weather>() {
@Override
public void onResponse(Call<Weather> call, Response<Weather> response) {
showResult("onResponse" + response.body().toString());
} @Override
public void onFailure(Call<Weather> call, Throwable t) {
showResult("onFailure" + t.getMessage());
}
});
} private void get2() {
String baseUrl = "http://www.kuaidi100.com/";
new Retrofit.Builder()
.baseUrl(baseUrl)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build().create(NetService.class)
.getQueryInfo(new HashMap<String, String>() {
{
put("type", "yuantong");
put("postid", "500379523313");
}
}).enqueue(new Callback<QueryInfo>() {
@Override
public void onResponse(Call<QueryInfo> call, Response<QueryInfo> response) {
showResult("onResponse" + response.body().toString());
} @Override
public void onFailure(Call<QueryInfo> call, Throwable t) {
showResult("onResponse" + t.getMessage());
}
});
} private void get1() {
String baseUrl = "http://m2.qiushibaike.com/";
new Retrofit.Builder().baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
.create(NetService.class)
.getArticles("latest", 1)
.enqueue(new Callback<QiushiModel>() {
@Override
public void onResponse(Call<QiushiModel> call, Response<QiushiModel> response) {
showResult("onResponse" + response.body().toString());
} @Override
public void onFailure(Call<QiushiModel> call, Throwable t) {
showResult("onFailure" + t.getMessage());
}
});
} private void get0() {
String url = "http://www.weather.com.cn/";
Retrofit.Builder builder = new Retrofit.Builder();
builder.baseUrl(url)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build().create(NetService.class).getWeather().enqueue(new Callback<Weather>() {
@Override
public void onResponse(Call<Weather> call, Response<Weather> response) {
Weather body = response.body();
showResult(body.toString());
} @Override
public void onFailure(Call<Weather> call, Throwable t) {
showResult(t.getMessage());
}
});
} private void showResult(String result) {
String mResult = itemName + result;
tv_content.setText(mResult);
Toast.makeText(this, mResult, Toast.LENGTH_SHORT).show();
Log.i(TAG, mResult);
}
}

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

 public interface NetService {

     @GET("data/sk/101010100.html")
Call<Weather> getWeather(); @GET("article/list/{type}?")
Call<QiushiModel> getArticles(@Path("type") String type, @Query("page") int page); @GET("query")
Call<QueryInfo> getQueryInfo(@QueryMap Map<String, String> map); @GET
Call<Weather> getWeather(@Url String url); @GET("/restapi/loading/getStartBanner")
Call<ResponseBody> getStartBannerResponseBody(); @FormUrlEncoded
@POST("jp/avlist/202861101/1/")
Call<ResponseBody> getJpByPost(@Field("callback") String callback); @FormUrlEncoded
@POST("search-ajaxsearch-searchall")
Call<ResponseBody> getSearchByPost(@FieldMap Map<String, String> map); @Multipart
@POST("MyUploadServer/servlet/UpLoadFileServlet")
Call<ResponseBody> postUpLoadFile(@Part() MultipartBody.Part requestBody); @POST("MyUploadServer/servlet/MyUploadServlet")
Call<ResponseBody> uploadFilesByody(@Body MultipartBody multipartBody); @Multipart
@POST("MyUploadServer/servlet/MyUploadServlet")
Call<ResponseBody> uploadFilesByPart(@Part() List<MultipartBody.Part> parts); @Multipart
@POST("MyUploadServer/servlet/MyUploadServlet")
Call<ResponseBody> uploadFilesByPartMap(@PartMap() Map<String, RequestBody> map); @Streaming
@GET
Call<ResponseBody> download(@Url String fileUrl); }

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

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

    NetworkComms网络通信框架序言 networkcomms是我遇到的写的最优美的代码,很喜欢,推荐给大家:) 基于networkcomms2.3.1开源版本( gplv3)协议,写了一些文章, ...

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

    NetworkComms网络通信框架序言 本例基于networkcomms2.3.1开源版本  gplv3协议 如果networkcomms是一顶皇冠,那么CommsThreadPool(自定义线程池 ...

  3. c#网络通信框架networkcomms内核解析之九 自定义处理方法的运行机制

    NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本  gplv3协议 我们自己写的处理方法都称之为自定义处理方法 比如,我们在服务器上写的与登陆相关的处理方法 ...

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

    NetworkComms网络通信框架序言 本文基于networkcomms2.3.1开源版本  gplv3协议 我们先回顾一个 c#网络通信框架networkcomms内核解析之六 处理接收到的二进制 ...

  5. NetworkComms网络通信框架V3结构图

    NetworkComms网络通信框架序言 来自英国的c#网络通信框架,历时五年打造,由英国剑桥的2位工程师倾情开发,最新版本V3.x版本.

  6. 强大的网络通信框架(实现缓存)--第三方开源--volley

    Android Volley是Android平台上很好用的第三方开源网络通信框架.使用简答,功能强大. Android Volley的库jar包Volley.ja下载连接地址:Volley下载 下载后 ...

  7. 成熟的C#网络通信框架介绍——ESFramework通信框架

    (转自:http://www.cnblogs.com/zhuweisky/archive/2010/08/12/1798211.html) ESFramework通信框架是一套性能卓越.稳定可靠.强大 ...

  8. DotNetty网络通信框架学习之初识Netty

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

  9. DotNetty网络通信框架学习

    p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...

随机推荐

  1. WebForm - cookie赋值乱码问题

    cookie的值为中文时候,取cookie的值会出现乱码 解决办法:存取cookie时候先解码和编码 存cookie,进行编码: cookie.Value = HttpUtility.UrlEncod ...

  2. Spring4 mvc+maven 框架搭建(1)

    这篇博客其实很早就应该写,早在半年前,因为对SpringMVC感兴趣,便自学了一下Spring.一段时间的学习后,对Spring有了一个基本的了解,于是想着自己动手搭建一个SpringMvc的框架出来 ...

  3. FactoryMethod工厂方法模式升级成AbstractFactory抽象工厂模式

    具体参考抽象工厂(AbstractFactory)模式-创建型模式,本文在FactoryMethod工厂方法模式(创建型模式)的基础上进行业务进一步抽象,不做详细原理介绍. 1.在FactoryMet ...

  4. Jmeter测试Mysql数据库-入门篇

    一.jmter配置数据库 1.在配置jmter之前需要先安装数据库连接池驱动,进入到官方下载页面https://dev.mysql.com/downloads/connector/j/,下载对应的驱动 ...

  5. Azure Storage架构介绍

    Windows Azure Storage由三个重要部分或者说三种存储数据服务组成,它们是:Windows Azure Blob.Windows Azure Table和Windows Azure Q ...

  6. iOS 8.0 bluetooth peripheral manager giving no callback for addService

    I am adding the service using: [self.peripheralManager addService:myService]; Is this method depreca ...

  7. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十):接口服务整理

    通用操作 通用操作是指一般的增删改查操作,逻辑大体都是一致的,所以统一抽象到CURD接口,需要用到CURD的表直接实现接口就可以了. 通用操作主要有以下几个: 保存操作 /** * 保存操作 * @p ...

  8. 【转载】配置文件报错:不允许有匹配 [xX][mM][lL] 的处理指令目标

    今天编写代码的时候,不小心给一个xml文件的首行加了一行空格,导致了启动报了如题类似的错误,查到一篇文章,顺藤摸瓜发现了这个失误,文章转载如下: 框架整合 的时候,XML 配置文件大多数情况是从另一个 ...

  9. Golang数组Array

    数组Array 定义数组的格式:var [n], n>0 package main import ( "fmt" ) func main() { //数组的长度也是类型的一部 ...

  10. MarkdownPad编写博客技巧笔记

    说明 想约束自己使用博客来记录自己的内容,发现CSDN能导入.md文件,就查了查使用方式,发现确实比较好用的,本文档就是使用MarkdownPad编写,生成.md上传的.记录下使用方法 Markdow ...