创建一个网络请求接口ApiService,后续项目中所有网络请求均在该接口中定义:
常见网络请求格式和参数书写
1 GET方式请求——–无参请求
/**比如完整路径https://api.app.com/vi/my/home.json
* baseUrl指的是https://api.app.com/vi/
* 显而易见my/home.json是完整路径除baseUrl之外的部分
*/
@GET("my/home.json")
Flowable<BaseEntity<MyHomeEntity>> getMyHome();
2 GET方式请求——–有参请求(如果参数有多个继续在后面累加即可)
/**比如完整路径https://api.app.com/vi/my/home.json?ordersn=123
*/
@GET("my/home.json")
Flowable<BaseEntity<MyHomeEntity>> getMyHome(@Query("ordersn") String ordersn);
使用方式
ApiService apiService = retrofit.create(ApiService.class);
apiService.getMyHome("123").map(new Function<BaseEntity<MyHomeEntity>, MyHomeEntity>() {
@Override
public UserLoginEntity apply(@NonNull BaseEntity<MyHomeEntity> myHomeEntityBaseEntity) throws Exception {
return myHomeEntityBaseEntity.data;
}
})
//以下两行表示在io现在请求网络,成功之后回调到mainThread主线程
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<MyHomeEntity>() {
@Override
public void accept(@NonNull MyHomeEntity myHomeEntity) throws Exception {
System.out.println("=========" + myHomeEntity.toString());
}
});
3 POST登录请求
@Headers("Content-type:application/json; charset=utf-8")
@POST("user/login.json")//UserInfo存储账号和密码
Flowable<BaseEntity<UserLoginEntity>> getUserLogin(@Body UserInfo info);
/**
* Created by zhang on 2017/4/14 15 : 19.
*/
public class UserInfo {
//username和password不需要自己定义名字,这是服务器需要的字段名
private String username;
private String password;
public UserInfo(String username, String password) {
this.password = password;
this.username = username;
}
}
apiService.getUserLogin(new UserInfo("13400000003", "123456"));
4 文件下载
/**
如果下载路径和baseurl部分相同,则使用下面这种方式
*/
@GET("download/app.pak")
@Streaming//如果下载较大的文件必须添加该注解
Flowable<ResponseBody> downloadingApk();
/**
如果下载路径和baseurl部分不相同,则使用下面这种方式
*/
@GET
@Streaming//如果下载较大的文件必须添加该注解
Flowable<ResponseBody> downloadingApk(@Url String url);
ps:返回类型一定要是ResponseBody,不然接收不到数据
subscribe = apiService.downloadingApk(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept(@NonNull ResponseBody responseBody) throws Exception {
if (responseBody != null){
String info = "文件大小====="+responseBody.bytes().length;
}
}
});
5 文件上传几种方式
/**
第一种方式:
如果服务器要求参数(ordersn)需要依GET形式拼接到url后面,写成一下方式即可
file是要上传的文件,单个文件上传必须这样写
**/
@Multipart
@POST("My/comment.uploadCmtPic.json")
Flowable<BaseEntity<UploadCmtPicEntity>> uploadPic(@Query("ordersn") String ordersn,@Part MultipartBody.Part file);
/**
第二种方式:
如果服务器需要的参数不是第一种方式,则参数应该封装到Multipart中,否则服务器接收不到
**/
@Multipart
@POST("My/comment.uploadCmtPic.json")
Flowable<BaseEntity<UploadCmtPicEntity>> uploadPic(@Part MultipartBody.Part pram,@Part MultipartBody.Part file);
/**
第三种方式:
多个文件上传
**/
@Multipart
@POST("My/comment.uploadCmtPic.json")
Flowable<BaseEntity<UploadCmtPicEntity>> uploadPic(@Part List<MultipartBody.Part> file);
第一种方式为例:
//需要上传的文件
File file = new File(Environment.getExternalStorageDirectory(),"/abc.png");
//上传类型为form表单
RequestBody requestFile = RequestBody.create(MultipartBody.FORM, file);
//cmt_pic为服务器定义的字段
MultipartBody.Part body = MultipartBody.Part.createFormData("cmt_pic", file.getName(), requestFile);
String ordersn = "123456789";
apiService.uploadPic(ordersn,body)