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>() {
                @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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值