目录
- 引用
- 基础用法
- GET
- post
- 使用FormBody传递键值对参数
- 使用RequestBody传递Json或File对象
- 使用MultipartBody同时传递键值对参数和File对象
- 自定义RequestBody实现流的上传
- 设置请求头
- 下载文件
- 封装
一.引用
compile 'com.squareup.okhttp3:okhttp:3.8.1'
二.基础用法
GET
private void initget() {
//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url("http://apis.juhe.cn/mobile/get?phone=18856907654&key=5778e9d9cf089fc3b093b162036fc0e1")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
if (response.isSuccessful()) {//回调的方法执行在子线程。
String htmlStr = response.body().string();
Logger.e("htmlStr--->" + htmlStr);
Logger.e("response.code()==" + response.code());
}
}
});
}
POST
(1)使用FormBody传递键值对参数
private void initPost() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("phone", "18856907654");//传递键值对参数
formBody.add("key", "5778e9d9cf089fc3b093b162036fc0e1");//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url("http://apis.juhe.cn/mobile/get")
.post(formBody.build())//传递请求体
.build();
}
(2)使用RequestBody传递Json或File对象
private void initPost1() {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
String jsonStr = "{\"phone\":\"18856907654\",\"key\":\"5778e9d9cf089fc3b093b162036fc0e1\"}";//json数据.
RequestBody body = RequestBody.create(JSON, jsonStr);
Request request = new Request.Builder()
.url("http://apis.juhe.cn/mobile/get")
.post(body)
.build();
}
(3) 使用MultipartBody同时传递键值对参数和File对象
private void initPost2() {
OkHttpClient client = new OkHttpClient();
MultipartBody multipartBody =new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("phone","18856907654")//添加键值对参数
.addFormDataPart("key","5778e9d9cf089fc3b093b162036fc0e1")
// .addFormDataPart("file","fileName",RequestBody.create(MediaType.parse("file/*"), new File("/user/allens/desktop/meinv.png")))//添加文件
.build();
final Request request = new Request.Builder()
.url("http://apis.juhe.cn/mobile/get")
.post(multipartBody)
.build();
(4)自定义RequestBody实现流的上传
private void initPost3() {
RequestBody body = new RequestBody() {
@Override
public MediaType contentType() {
return null;
}
@Override
public void writeTo(BufferedSink sink) throws IOException {//重写writeTo方法
FileInputStream fio = new FileInputStream(new File("fileName"));
byte[] buffer = new byte[1024 * 8];
if (fio.read(buffer) != -1) {
sink.write(buffer);
}
}
};
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(body)
.build();
}
三.设置请求头
Request request = new Request.Builder()
.url("http://www.baidu.com")
.header("User-Agent", "OkHttp Headers.java")
.addHeader("token", "myToken")
.build();
四.下载文件
在OKHttp中并没有提供下载文件的功能,但是在Response中可以获取流对象,有了流对象我们就可以自己实现文件的下载。代码如下:
这段代码写在回调接口CallBack的onResponse方法中:
InputStream is = response.body().byteStream();//从服务器得到输入流对象