第一次写博客,写的有什么不好地方;欢迎大家提出.
个人感觉用法跟volley差不多,好了开始介绍如何快速使用okhttp3。
一、主要类介绍
1. OkHttpClient http客户端
- newCall(Request request) 加入队列
- newBuild() 设置httpclient属性的内部类
- connectTimeout(long timeout, TimeUnit unit) 连接超时
- readTimeout(long timeout, TimeUnit unit) 读取超时
- writeTimeout(long timeout, TimeUnit unit) 写入超时
- TimeUnit 时间单位
- build() 创建一个根据我们设置的OkHttpClient对象
2. RequestBody 请求内容(感觉跟html中的<body></body>一样)
- FormBody 我们可以使用这个类.来发送键值对参数到服务器上
- add(String name, String value) 添加键值对.未编码
- addEncoded(String name, String value) 编码后的键值对
- build() 完成创建
3. Request
- Builder()设置请求参数
-url(String url)
- get() 请求方式为get
- post(RequestBody body) 请求方式为Post
- method(String method, RequestBody body) 设置请求方式.get和post内部是调用了该方法
4. Call 一个请求准备执行
- cancel 取消请求
- enqueue(Callback responseCallback);该队列等待执行。(异步)
- execute() 立即执行该队列,并阻塞(不要在主线程里.会报错的)
5. Response
- response.body().string();返回字符串
- response.body().byteStream();返回字节流
- response.body().charStream();字符流(没有设置Content-Type 字符集。那么默认就是utf-8)
- response.body().contentLength();返回内容字节长度
二、如何使用
//创建okHttpClient对象
OkHttpClient mClient = new OkHttpClient();
final String TAG="response";
Get
//创建请求 不设置请求方法默认为get 这里的地址是我电脑
Request requestGet = new Request.Builder().get().url(MYURL.GET).build();
//加入队列
Call call = mClient.newCall(requestGet);
//这里使用异步方法去执行这个请求
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure = " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//获取服务器返回的内容
ResponseBody body = response.body();
//获取字符串
final String msg = body.string();
Log.i(TAG," onResponse = "+ msg);
}
});
Post
//因为发起post需要请求内容.接下来我们要提交一个表单,所以我们这里使用FormBody.Builder
//add添加键值对--->服务器那里可以通过getParameter获取到
RequestBody body =new FormBody.Builder().add("name","mingjie").build();
Request post = new Request.Builder()
.url(MYURL.POST)
.post(body)//给post设置body
.build();
mClient.newCall(post).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e){
Log.e(TAG,"onFailure = "+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i(TAG, "onResponse = " + response.body().string());
}
});
GetFile
//其实和get请求是一样的。只是body哪里改成获取字节数组然后我们在写入下
Request getfile=new Request.Builder()
.url(MYURL.GET_FILE)
.build();
//请求加入客户端准备执行
Call call = mClient.newCall(getfile);
//等待执行(异步)
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "onFailure = " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//这里可以不用使用response.body().byteStream()。
byte[] data=response.body().bytes();//已经帮我们缓存到内存里了
BufferedOutputStream outputStream=new BufferedOutputStream(new FileOutputStream("/sdcard/test.apk"));
outputStream.write(data);
outputStream.flush();
outputStream.close();
Log.i(TAG,"文件长度 = "+data.length+";下载OK.");
}
});
PostFile
//1.文件类型 -->这个类型可以在tomcat里conf/web.xml 查看
MediaType MEDIA_TYPE_MP4 = MediaType.parse("video/mp4");
//2.mp4文件目录
File mp4File = new File("/sdcard/hzw.mp4");
//3.创建一个post请求内容;
RequestBody postFile = RequestBody.create(MEDIA_TYPE_MP4, mp4File);
//4。建立一个post请求
Request request = new Request.Builder()
.addHeader("Content-Disposition","hzw.mp4")
.url(MYURL.POSTFILE)
.post(postFile)
.build();
//5.加入请求队列
Call call = mClient.newCall(request);
//6.异步等待执行
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "文件上传失败 = " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//显示服务器给我们信息
final String msg = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
});
到这里有没有感觉到,上传单个文件其实挺简单的
PostMultipart(上传多个文件)
//1.文件类型 -->这个类型可以在tomcat里conf/web.xml 查看
MediaType MEDIA_TYPE_MP4 = MediaType.parse("video/mp4");
//2.添加请求
RequestBody requestBody = new MultipartBody.Builder()
//设置表
.setType(MultipartBody.FORM)
.addFormDataPart("name","hzw")//同时也可以提交一对键值对。
//4.添加部分文件 类型 文件名 创建上传文件的body其实就把上传一个文件body传进去
.addFormDataPart("mp4", "hzw1.mp4", RequestBody.create(MEDIA_TYPE_MP4, new File("/sdcard/hzw.mp4")))
.addFormDataPart("mp4", "hzw2.mp4", RequestBody.create(MEDIA_TYPE_MP4, new File("/sdcard/hzw2.mp4")))
.build();
//5.创建请求
Request request = new Request.Builder()
.url(MYURL.POST_MULTIPART)
.post(requestBody)
.build();
//6.加入请求队列
Call call = mClient.newCall(request);
//7.开始等待执行该请求
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//显示服务器给我们信息
final String msg = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
});
有没有感觉到.比单个文件复杂了点啊。其实就是把两个请求一一添加到一个大请求里,然后再发送出去
PostStreaming(数据流)
//1.文件类型 -->这个类型可以在tomcat里conf/web.xml 查看
final MediaType MEDIA_TYPE_MP4 = MediaType.parse("video/mp4");
//2.需要自己去实现RequestBody两个方法
RequestBody ioBody=new RequestBody() {
@Override
public MediaType contentType() {
return MEDIA_TYPE_MP4;
}
//这个就是我们向服务器写入数据
@Override
public void writeTo(BufferedSink sink) throws IOException {
//1.首先先读取下本地的文件
BufferedInputStream read=new BufferedInputStream(new FileInputStream("/sdcard/hzw.mp4"));
//2.开始写数据
byte[] buf=new byte[1024*8];
int len=-1;
while((len=read.read(buf))!=-1){
sink.write(buf,0, len);
sink.flush();
}
sink.close();
}
};
//3.创建请求
Request request=new Request.Builder()
.url(MYURL.POST_STREAMING)
.post(ioBody)
.build();
//4.加入队列
Call call = mClient.newCall(request);
//5.开始等待执行该请求
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//显示服务器给我们信息
final String msg = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
}
});
流的形式提交文件,很简单把.
三、总结
图片就直接使用现成的图片框架。看到这里相信你已经能够简单的使用okHttp了。
实际上我们不可能每个请求都去这样子发送,这时候就需要封装了那么。
下篇给大家带来okhttp框架如何使用。谢谢大家!!!