第一步
创建OkHttpClient对象
- 使用构造方法直接创建OkHttpClient
OkHttpClient client = new OkHttpClient();
- 使用Builder模式创建对象
OkHttpClient.Builder builder = new OkHttpClient.Builder();//先创建构建者对象
builder.connectTimeout(3*1000,TimeUnit.MILLISECONDS);//设置超时时间
OkHttpClient client = builder.build();//使用构建者创建OkHttpClient对象
区别
- 使用Bulider模式创建OkHttpClient对象,先得到Bulider对象,在通过代码创建OkHttpClient,这中间可以根据需要修改Bulider对象的一些字段值
- 使用构造方法创建OkHttpClient对象则是一步操作,不能更改任何字段值
第二步
Request对象的创建
get请求时创建Request对象的代码如下:
Request request = new Request.Builder().url("/").build();
这是一种Builder设计模式,先创建Builder对象,给Builder对象的属性赋值,再用build方法创建Request对象,最后把builder的值赋给Request对象
在Request的内部类Builder的无参构造源码中默认把Builder的请求方法设置为GET,所以使用get请求不需要再次设置请求方式
缺少Call对象的创建
缺少RealCall的execute方法实现同步请求
缺少RealCall的enqueue方法实现异步请求
第三步
讲解Request.Builder类的post方法
该方法作用是设置post请求的请求体,接收的参数是RequestBody类及子类对象
RequestBody类及其核心方法
1.public abstract MediaType contentType()//数据类型
2public long contentLength()//数据长度
3public abstract void writeTo(BufferedSink sink)//写操作RequestBody类的create方法
重要方法有两个
1.create(final MediaType contentType,final byte[] content,final int offset,final int byteCount)
//创建上传byte数据的RequestBody对象
2.create(final MediaType contentType, final File file)
//创建上传File数据的RequestBody对象
第四步
MultipartBody类
多重body的类
既可以上传键值对数据,又可以上传File数据
微信发朋友圈要上传文字+图片 就可以用到这个
基本代码
MultipartBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("groupId",""+groupId)//添加键值对参数
.addFormDataPart("title","title")
.addFormDataPart("file",file.getName(),RequestBody.create(MediaType.parse("file/"),file))//添加文件
看addFormDataPart方法
- addFormDataPart(String name,String value)
添加键值对数据 - addFormDataPart(String name,String filename,RequestBody body)
添加File数据
添加File数据的流程如下:
1.将File对象得到body对象
2.将name和Filename封装到Header对象
3.将Header对象和body对象传递给part对象,然后将part对象放入Builder的字段parts集合中
下面演示一次正确的上传文字和图片的代码
List<MultipartBody.Part> part = null;
File file = new File(imagUrl);
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("userId", mId);
RequestBody imgBody = RequestBody.create(MediaType.parse("multpart/form-data"), file);
builder.addFormDataPart("file", file.getName(), imgBody);
part = builder.build().parts();
ps:用addFormDataPart上传File数据时,需要创建RequestBody对象,所以这里先创建好再传入进去
分析:
写给后台的Service
submitImage(@Part List<MultipartBody.Part> partList);
传给后台一个MultiPart集合,他们进行解析
所以安卓端是创建一个List集合传给后台