Retrofit的使用
程序员文章站
2024-03-01 00:02:22
...
先说说Retrofit这个框架,它是一个网络请求框架,底部封装了OKhttp,遵循了restful设计风格。它的优点有通过注解配置网络请求的参数、支持多种数据的解析(如gson)、支持同步异步请求、支持Rxjava。
用法
1.添加依赖
除了Retrofit还导入了Rxjava和gson的包,之后会用到
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2'
2.创建服务器返回数据的bean类
public class User {
private String id;
private String name;
public User() {}
public User(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3.创建配置网络请求的接口
这个接口只要是用来配置网络请求,核心就通过各种注解来配置
public interface RequestInterface {
//Call<T>方法为接收响应数据的方法 响应的数据类型为T
//通过GET方式进行网络请求,里面加URL
/*
@GET("Test/testretrofit?key=123456")
Call<User> getuser();
*/
//{}变量传参
//使用时Call<User> userCall=requestInterface.getuser("testretrofit");
@GET("Test/{aa}?key=123456")
Call<User> getuser(@Path("aa") String aa);
//通过Post方式进行网络请求,里面加URL
/*
@POST("Test/testretrofit?key=123456")
Call<User> getuser();
*/
//通过http设置请求,参数分别为请求方式、URL、是否有请求体
//注意!!!method里面区分大小写
/*
@HTTP(method = "GET",path = "Test/testretrofit?key=123456",hasBody = false)
Call<User> getuser();
*/
//使用@body注解来设置请求体,现修改上述url的key为user
//使用时传参,如:Call<User> userCall=requestInterface.getuser(new User("456","hhh"));
//注意!!!body标签是将user对象转化成json写入请求体中,而不是像QueryMap在URL后面加键值对。
//本例中的请求体读出后:{"id":"456","name":"hhh"}
/*
@HTTP(method = "POST",path = "Test/testretrofit",hasBody = true)
Call<User> getuser(@Body User user);
*/
}
还有@field、@query、@part等不一一举例,给出一个偷来的汇总图,
4.创建Retrofit实例
5.创建配置网络请求接口的实例
6.发送同步或异步请求并解析返回结果
这个步骤都在一个活activity中所以给出activity代码
public class MainActivity extends AppCompatActivity {
//final static String url="http://localhost:8080/Test/testretrofit";
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
request();
}
});
}
public void request(){
//创建retrofit
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("http://169.254.225.111:8080/")//设置请求的URL
.addConverterFactory(GsonConverterFactory.create())//设置数据解析器为Gson
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//设置网络请求适配器为Rxjava
.build();
//通过创建网络请求接口的实例
RequestInterface requestInterface=retrofit.create(RequestInterface.class);
//创建请求的实例
//Call<User> userCall=requestInterface.getuser();
//Call<User> userCall=requestInterface.getuser(new User("456","hhh"));
Call<User> userCall=requestInterface.getuser("testretrofit");
//发送请求(异步)
userCall.enqueue(new Callback<User>() {
//请求成功
@Override
public void onResponse(Call<User> call, Response<User> response) {
User user=response.body();
Log.e("结果",user.getName());
button.setText(user.getName());
}
//请求失败
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.e("结果",t.toString());
}
});
// //发送请求(同步)
// final Call<User> userCall=requestInterface.getuser();
// new Thread(){
// public void run(){
// try {
// Response<User> response=userCall.execute();
// User user=response.body();
// Log.e("结果",user.getName());
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }.start();
// //注意,不能在主线程中就行同步请求
}
}
到这里基本的Retrofit用法介绍完了。然后Rxjava不太了解可以参考这篇文章:Rxjava基本用法
- Retrofit上传图片
首先一个上传文件的接口。MultipartBody.Part用于指定文件,如果要上传多个文件那就传一个MultipartBody.Part集合
public interface FileuploadService {
@Multipart
@POST("Test/testretrofit")
Call<Result> upload(@Part("description") RequestBody description,
@Part MultipartBody.Part img);
}
上传文件的核心代码
private void uploadpicture(String path){
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("http://192.168.43.110:8080/")
.addConverterFactory(GsonConverterFactory.create())
.build();
FileuploadService fileuploadService=retrofit.create(FileuploadService.class);
File file=new File(path);
//创建请求体
RequestBody requestfile=RequestBody.create(MediaType.parse("multipart/form-data"),file);
MultipartBody.Part body=MultipartBody.Part.createFormData("aFile", file.getName(), requestfile);
//MultipartBody.Part body=MultipartBody.Part.create(requestfile);//这样服务器通过表单读不到。
String descriptionString = "This is description";
RequestBody description =
RequestBody.create(MediaType.parse("multipart/form-data"), descriptionString);
//异步请求
Call<Result> call=fileuploadService.upload(description,body);
call.enqueue(new Callback<Result>() {
@Override
public void onResponse(Call<Result> call, Response<Result> response) {
Log.e("result",response.body().getName());
}
@Override
public void onFailure(Call<Result> call, Throwable t) {
}
});
}
这样提交的表单是multipart/form-data类型。不能直接从请求体中解析,
服务器代码:servlet处理multipart/form-data
源码(含服务器代码)下载:Retrofit上传文件