Retrfit与OKhttp共同出资square公司,与OK不同的事retrfit需要定义一个接口,用来返回我们的call对象,retrfit提供的请求方式为注解方式,有get和post。参数也是注解的方式。
它是一个可以用Android和java的网络库,使他可以简化我们的网络操作的工作,提高效率和正确率,retrfit是square公司开源的一个高质量高效率的http库,它将我们自己开发的底层代码和细节封装了起来,在没有retrfit,ok时,我们可能要去写get,post请求,但有了这些库后对于这些请求我们就需要一行代码或者一个注释。所有的网络通信核心任务只有一个,Cline端与server端进行数据交互与操作,所以retrfit将底层代码封装了起来,只暴露了我们业务中的数据模型和操作方法
retrfit的使用方法
网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
官方最新依赖:
compile 'com.squareup.retrofit2:retrofit:2.0.1'
//这是组合依赖。
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依赖包
compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依赖包
get请求方式
/**
* 无参get请求
* http://service.meiyinkeqiu.com/service/ads/cptj
*
* @return
*/
@POST("/api/cook/classify")
Call<String> download();//泛型为String是因为增加返回值为String的支持
泛型可为String可为Bean对象
//不需要添加Gson包。已经添加过gson依赖
Retrofit builder = new Retrofit.Builder().baseUrl(RetrofitService.BASE_GET)
//增加返回值为String的支持
.addConverterFactory(ScalarsConverterFactory.create())
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitService service = builder.create(RetrofitService.class);
Call<String> call = service.downGet(1);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.i("222",response.body()+"");
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
//有参get请求
//https://api.github.com/users/baiiu
@GET("users/{user}")
Call<String> downget(@Path("user")String user);
//接口地址做了封装
Retrofit builder = new Retrofit.Builder().baseUrl(RetrofitService.BASE_PATH)
//增加返回值为String的支持
.addConverterFactory(ScalarsConverterFactory.create())
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitService service = builder.create(RetrofitService.class);
Call<String> call = service.downget("forever");
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.i("111",response.body()+"");
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
//拼接接口地址后面为:?&
@GET("/article/list/latest")
Call<String>downGet(@Query("page")int a);
Retrofit builder = new Retrofit.Builder().baseUrl(RetrofitService.BASE_URL)
//增加返回值为String的支持
.addConverterFactory(ScalarsConverterFactory.create())
//增加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitService service = builder.create(RetrofitService.class);
Call<String> call = service.download();
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
Log.i("1111",response.body()+"");
}
@Override
public void onFailure(Call<String> call, Throwable throwable) {
}
});
/**
* http://localhost:8080/08web/LoginServlet
* post方式实现登录
*/
@POST("LoginServlet")
@FormUrlEncoded
Call<UserInfo> login(@Field("name") String name, @Field("pwd") String pwd);
//创建retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl(Api.BASE_POST).client(client).addConverterFactory(GsonConverterFactory.create()).build();
//这里采用的是Java的动态代理模式
RetrofitService retrofitService = retrofit.create(RetrofitService.class);
//得到Call对象
Call<UserInfo> argumentData = retrofitService.login("wowo", "520");
//发送网络请求
argumentData.enqueue(new Callback<UserInfo>() {
@Override
public void onResponse(Call<UserInfo> call, Response<UserInfo> response) {
UserInfo userInfo = response.body();
String name = userInfo.name;
Log.i("xxx", "name:" + name);
}
@Override
public void onFailure(Call<UserInfo> call, Throwable t) {
}
});
/**
* http://192.168.0.104:8080/08web/FileUploadServlet
* post
* 方式实现上传头像
*/
@Multipart
@POST("08web/FileUploadServlet")
Call<UserInfo> upload(@Part MultipartBody.Part file);
//创建retrofit
Retrofit retrofit = new Retrofit.Builder().baseUrl(Api.BASE_POST).client(client).addConverterFactory(GsonConverterFactory.create()).build();
//这里采用的是Java的动态代理模式
RetrofitService retrofitService = retrofit.create(RetrofitService.class);
//拿到图片 file
File file = new File(Environment.getExternalStorageDirectory(), "/Pictures/Screenshots/a.jpg");
RequestBody requestFile =
RequestBody.create(MediaType.parse("application/otcet-stream"), file);
MultipartBody.Part body =
MultipartBody.Part.createFormData("file", file.getName(), requestFile);
final Call<UserInfo> upload = retrofitService.upload(body);
upload.enqueue(new Callback<UserInfo>() {
@Override
public void onResponse(Call<UserInfo> call, Response<UserInfo> response) {
UserInfo userInfo = response.body();
String name = userInfo.name;
Log.i("xx", "name:" + name);
}
@Override
public void onFailure(Call<UserInfo> call, Throwable t) {
}
});