对于Android Studio的用户,可以在gradle上添加: com.squareup.okhttp3:okhttp:3.2.0'
一、Http Get
对了网络加载库,那么最常见的肯定就是http get请求了,比如获取一个网页的内容。
//创建okHttpClient对象
OkHttpClient client = new OkHttpClient();
//创建一个Request
Request request = new Request.Builder().url("http://www.yzg020.com/zhengmian/app/user/updateUser.api").build();
//创建一个call
Call call = client.newCall(request);
//把call加入调度
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String str = response.body().string();//获取到的数据内容
}
});
以上就是发送一个get请求的步骤,首先构造一个Request对象,参数最起码有个url,当然你可以通过Request.Builder设置更多的参数比如:header
、method
等。
然后通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。
最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。
注意: 1、onResponse(Call call, Response response)方法返回的不是UI现在,不能直接更新UI,需要用Handler。
2、response.body().toString();//获取到的数据字符串
response.body().byteStream(); //可以用于下载
response.body().bytes(); //二进制字节数组
二、Http Post 携带参数
post携带参数,也仅仅是Request的构造的不同。
注意:OkHttp3异步POST请求和OkHttp2.x有一些差别就是没有FormEncodingBuilder这个类,替代它的是功能更加强大的FormBody:
//创建okHttpClient对象
OkHttpClient client = new OkHttpClient();
// FormEncodingBuilder builder = new FormEncodingBuilder();
RequestBody body = new FormBody.Builder()
.add("name", "xiaoming").build();
Request request = new Request.Builder()
.url("http://www.yzg020.com/zhengmian/app/user/updateUser.api").post(body).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String str = response.body().string();
}
});
三、异步上传文件
首先定义上传文件类型:
public static final MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
将sdcard根目录的test.txt文件上传到服务器上:
OkHttpClient client = new OkHttpClient();
File file = new File("/sdcard/test.txt");
Request request = new Request.Builder().url("http://www.yzg020.com/zhengmian/app/user/updateUser.api")
.post(RequestBody.create(mediaType, file)).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String str = response.body().string();
}
});
四、异步下载文件:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://img2.imgtn.bdimg.com/it/u=2151106510,2213335010&fm=26&gp=0.jpg").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(new File("/sdcard/te.jpg"));
byte[] buffer = new byte[2048];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
fileOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
});
五、异步上传Multipart文件
定义上传文件
public static final MediaType meType = MediaType.parse("image/png");
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("name", "xiaoming")
.addFormDataPart("age", "18")
.addFormDataPart("image", "te.jpg", RequestBody.create(meType, new File("/sdcard/te.jpg")))
.build();
Request request = new Request.Builder()
.header("xiaoming", "Client-ID " + "...")
.url("http://www.yz.com/zhn/app/user/updateUser.api")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});