Retrofit是SQUARE美国一家移动支付公司最近新发布的在Android平台上http访问的开源项目
官方标语;A type-safe HTTP client for Android and Java
语意很明显一款android安全类型的http客户端, 那么怎么样才算安全?支持https?支持本地线程安全?
官方官方github
http://square.github.io/retrofit/
常用注解
Retrofit 2.0底层依赖OkHttp实现,也就是说Retrofit本质上就是对OkHttp的更进一步封装。Retrofit和其它Http库最大区别在于通过大范围使用注解简化Http请求。
Retrofit中的注解大体分为以下几类:用于标注请求方式的注解、用于标记请求头的注解、用于标记请求参数的注解。其实,任何一种Http库都提供了相关的支持,无非在retrofit中是用注解来简化。
Retrofit使用注解来描述HTTP请求:
该类型的注解用于标注不同的http请求方式,常用有以下几种:
注解 | 说明 |
---|---|
@Get | 表明这是get请求 |
@POST | 表明这个post请求 |
该类型的注解用于为请求添加请求头。
注解 | 说明 |
---|---|
@Headers | 用于添加固定请求头可以同时添加多个通过该注解添加的请求头不会相互覆盖,而是共同存在 |
@Header | 作为方法的参数传入,用于添加不固定值的Header,该注解会更新已有的请求头 |
请求和响应格式注解
注解 | 说明 |
---|---|
@FormUrlEncoded | 表示请求发送编码表单数据,每个键值对需要使用@Field注解 |
@Multipart | 表示请求发送multipart数据,需要配合使用@Part |
该类型的注解用来标注请求参数的格式,有些需要结合上面请求和响应格式的注解一起使用。
注解 | 说明 |
---|---|
@Body | 能够通过@Body注解来指定一个方法作为HTTP请求主体 |
@Filed | 多用于post请求中表单字段,Filed和FieldMap需要FormUrlEncoded结合使用 |
@FiledMap | 和@Filed作用一致,用于不确定表单参数 |
@Part | 用于表单字段,Part和PartMap与Multipart注解结合使用,适合文件上传的情况 |
@PartMap | 用于表单字段,默认接受的类型是Map |
@Path | {占位符}和PATH只用在URL的path部分,url中的参数使用Query和QueryMap 代替,保证接口定义的简洁 |
@Query | 添加参数 |
@QueryMap | 复杂的query参数可以用QueryMap来构建 |
异步VS同步
任何一个任务都可以被分为异步任务或者同步任务,和其它大多数的请求框架一样,retrofit也分为同步请求和异步请求。在retrofit是实现这两者非常简单:
- 同步请求需要借助retrofit提供的execute()方法实现。
- 异步请求需要借助retrofit提供的enqueue()方法实现
简单的使用
compile ‘com.squareup.okhttp3:okhttp:3.0.0-RC1’
compile ‘com.squareup.okhttp3:logging-interceptor:3.0.0-RC1’
compile ‘com.squareup.retrofit2:retrofit:2.0.0-beta3’
使用Get异步请求
创建Retrofit对象
private static final Retrofit M_RETROFIT = new Retrofit.Builder().baseUrl("").build(); //baseurl好像是必须要设置吧 ,我没有设置就发生了错误。
@Query用于url的参数拼写
*/
@GET("ms/getUserUrl.bdo?")
Call<ResponseBody> loadRepo(@Query("username") String username);
使用请求
ApiStores call = M_RETROFIT.create(ApiStores.class);
Call<ResponseBody> m_requeest = call.loadRepo("cswd2");
//异步发送请求
m_requeest.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
try {
Log.e("ljl", "请求的数据=======" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
Log.e("ljl", "请求失败=======" + t.toString());
}
});
使用Post异步请求
//创建Retrofit对象
private static final Retrofit M_RETROFIT = new Retrofit.Builder().baseUrl(" ").build();
ApiStores call = M_RETROFIT.create(ApiStores.class);
Call<ResponseBody> m_requeest = call.logIn(maps);
m_requeest.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
try {
Log.e("ljl", "请求的数据=======" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
Log.e("ljl", "请求失败=======" + t.toString());
}
});
@POST用于构造post请求
@QueryMap用于构造复杂的参数列表
@POST("/ms/userlogin.do?")
Call<ResponseBody> logIn(@QueryMap HashMap<String, String> maps);
ApiStores call = M_RETROFIT.create(ApiStores.class);
Call<ResponseBody> m_requeest = call.logIn(maps);
m_requeest.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
try {
Log.e("ljl", "请求的数据=======" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
Log.e("ljl", "请求失败=======" + t.toString());
}
});
@POST用于构造post请求 上传参数以及一张图片,适用于账号申请,以及头像修改等:代码如下:
@Multipart //必须使用这个注解跟Part注解配合使用
@POST("/ms/saveHead.bdo?") //@QueryMap用来传递普通的参数
Call<ResponseBody> modifyThePicture(@QueryMap Map<String, String> usermap, @Part("head\";filename=\"" + "ljl.jpg") RequestBody body); //"head"是服务器接收图片的地址
ApiStores call = M_RETROFIT.create(ApiStores.class);
Call<ResponseBody> m_requeest = call.modifyThePicture(bodyHashMap, body);
m_requeest.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
try {
Log.e("ljl", "请求的数据=======" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
Log.e("ljl", "请求失败=======" + t.toString());
}
});
@POST用于构造post请求 上传参数以及已经多张图片,有俩种方式来构建
第一中代码如下:
@QueryMap使用这个来构建普通参数,@Body使用body来构造多图参数
@POST(" /ms/save_theme.do?")
Call<ResponseBody> uploadFileWithRequestBody(@QueryMap Map<String, String> usermap, @Body MultipartBody amultipartBody);
info普通参数集合,description-可无 paths :图片的路径集合
public static void uploadPhotos(Map<String, String> info, String description, List<String> paths) {
ApiStores call = M_RETROFIT.create(ApiStores.class);
MultipartBody.Builder build = new MultipartBody.Builder();
for (String path : paths) {
File file = new File(path);
RequestBody requestBody = RequestBody.create(MediaType.parse("image/png"), file);
build.addFormDataPart("attachmentFile", file.getName(), requestBody);
}
build.setType(MultipartBody.FORM);
MultipartBody multipartBody = build.build();
Call<ResponseBody> m_requeest = call.uploadFileWithRequestBody(info, multipartBody);
m_requeest.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Response<ResponseBody> response) {
try {
Log.e("ljl", "请求的数据=======" + response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t) {
Log.e("ljl", "请求失败=======" + t.toString());
}
});
}
基本的使用就基本上完了,以后再有更多的研究在继续记录