@[toc] OKHTTP的一些用法
OKHTTP的get请求
OkHttp是Square出的Http通讯库,支持HTTP和HTTP/2,用于Android应用和Java应用。
OkHttp是非常优秀的Http通讯库,将Http连接中各种繁杂的问题,对并发的支持,对常见异常的处理等封装在底层,提供简单易用的API供应用中调用。与之相比,HttpUrlConnection的使用过于复杂,Appache的HttpClient在Android平台上的运行又有各种问题,在Android 6.0之后,已经将HttpClient库从SDK中删除,全面转向使用OkHttp。
总而言之,OKHTTP就是一个用于网络操作的框架,用来简化我们的操作的时间和复杂度。
目前有很多知名的Android三方框架都使用OkHttp作为网络连接的默认基栈,例如Volley,Glide,Retrofit等,从中也能看出学习OkHttp的必要性。
请求json字符串
OKHTTP的重点就在于4个单词 : client ,request,call ,Response
client就是利用OkHttp来创建一个客户端,而后发送请求,即是request.
然后就是与服务端进行一个链接,就是一个打电话的呼叫过程,最后就是
服务端对客户端的请求返回响应。
//client
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(3, TimeUnit.SECONDS)
.readTimeout(3, TimeUnit.SECONDS)
.build();
//request
Request request = new Request.Builder().url(path).get().build();
//call
Call call = client.newCall(request);
//response
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(MainActivity.this, "失败" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
ResponseBody body = response.body();
final String string = body.string();
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "" + string, Toast.LENGTH_SHORT).show();
}
});
}
});
post 请求json字符串
//client
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(3, TimeUnit.SECONDS)
.connectTimeout(3, TimeUnit.SECONDS)
.build();
//request
FormBody formBody = new FormBody.Builder()
.add("page", "1")
.build();
Request request = new Request.Builder()
.url(post_path)
.post(formBody)
.build();
//call
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String string = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "" + string, Toast.LENGTH_SHORT).show();
}
});
}
});
OKHTTP 下载
//client
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(3, TimeUnit.SECONDS)
.readTimeout(3, TimeUnit.SECONDS)
.build();
//request
final Request request = new Request.Builder()
.url(load_path)
.get()
.build();
//call
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// File file = new File(mp4_path);
int count = 0;
File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
String state = Environment.getExternalStorageState();
File file1 = Environment.getExternalStorageDirectory();
if (state.equals(Environment.MEDIA_MOUNTED)) {
FileOutputStream fos = new FileOutputStream(new File(directory, "houzi.mp4"));
long l = response.body().contentLength();
InputStream is = response.body().byteStream();
int len;
byte[] bytes = new byte[1024];
while ((len = is.read(bytes)) != -1) {
fos.write(bytes, 0, len);
count += len;
fos.flush();
int progress = (int) ((count * 100) / l);
Message obtain = Message.obtain();
obtain.what = 120;
obtain.obj = progress;
handler.sendMessage(obtain);
}
fos.close();
is.close();
}
}
});
上传
在上传的过程中,最重要的就是在请求的请求体,应为上传的时候需要携带数据,而数据就是储存在请求体中。
而这就需要在请求时进行一些区别于正常的的操作 了。
//client
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(20, TimeUnit.SECONDS)
.connectTimeout(20, TimeUnit.SECONDS)
.build();
//request
RequestBody requestBody = RequestBody.create(MediaType.parse("media/mp4"), new File(upload_path));
MultipartBody multipartBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", "monkey.mp4", requestBody)
.build();
//主要是在这里的post()中需要天记上数据,在这里需要加入一个body对象,就是MultipartBody 对象
而在MultipartBod 中又要添加一个RequestBody对象。
Request request = new Request.Builder()
.url(upload_path_mp4)
.post(multipartBody)
.build();
//call 和 response
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "上传失败" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
}
});
}
});