本文主要是介绍retorfit2+okhttp3文件上传下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
创建一个网络请求接口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>() {@Overridepublic UserLoginEntity apply(@NonNull BaseEntity<MyHomeEntity> myHomeEntityBaseEntity) throws Exception {return myHomeEntityBaseEntity.data;}})//以下两行表示在io现在请求网络,成功之后回调到mainThread主线程.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<MyHomeEntity>() {@Overridepublic 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>() {@Overridepublic 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)
这篇关于retorfit2+okhttp3文件上传下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!