一.安装
二.用法
(一)Http Get Http Post
//创建okHttpClient对象,设置超时
OkHttpClient mOKHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.build();
get、post请求除了请求体和请求方法不同,其他设置是相同的
首先说一下2.x到3.x关于POST请求的请求体类的改变:
在2.x中是 类名是:FormEncodingBuilder()
使用FormEncodingBuilder builder = new FormEncodingBuilder();
builder.add("username","name");
在3.x中是 类名是: FormBody,但是一般使用是 RequestBody requestBodyPost = new FormBody.Builder()
需要说明一下FormBody是RequestBody的子类
本文采用3.x版本
// 请求参数:page=1&code=news&pageSize=20&parentid=0&type=1
RequestBody requestBodyPost = new FormBody.Builder()
.add("page", "1")
.add("code", "news")
.add("pageSize", "20")
.add("parentid", "0")
.add("type", "1")
.build();
默认请求方法是get方法,.get()可以省略
Request request = new Request.Builder()
.get()
.url(GET_URL)
.build();
Request requestPost = new Request.Builder()
.url(POST_URL)
.post(requestBodyPost)
.build();
然后通过request的对象去构造得到一个Call对象
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{
@Override
public void onFailure(Request request, IOException e)
{
} @Override
public void onResponse(final Response response) throws IOException
{
//String htmlStr = response.body().string();
}
});
需要注意几点:
onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过
response.body().string()
获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes()
;如果你想拿到返回的inputStream,则调用response.body().byteStream()
- onResponse执行的线程并不是UI线程,如果你希望操作控件,还是需要使用handler,runOnUiThread等操作ui
(二)基于Http的文件上传
上传文件和一般的带参数post请求不同之处在于RequestBody的构建
RequestBody的Builder和type因版本而已,2.x叫做MultipartBuilder,3.x叫做MultipartBody.Builder()
。当我们需要做类似于表单上传的时候,就可以使用它来构造我们的requestBody。此处以3.x为例
File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");
if (!file.exists()) {
Toast.makeText(MainActivity.this, "文件不存在", Toast.LENGTH_SHORT).show();
} else {
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
/* 2.x版本
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)*/
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"username\""),
RequestBody.create(null, "cxc"))
/* .addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"mFile\";
filename=\"wjd.mp4\""), fileBody)*/
.addFormDataPart("mFile", file.getName(), fileBody)
.addFormDataPart("thumb", file.getName(),
RequestBody.create(MediaType.parse("image/*"), file));
//添加其他参数
.addFormDataPart(key, value);
.build();
·····}
说明:
提交json数据,MediaType.parse("application/json; charset=utf-8");
上传图片,MediaType.parse("image/*");
提交String,MediaType.parse("text/x-markdown; charset=utf-8")
上传文件,MediaType.parse("application/octet-stream")
addPart和addFormDataPart方法本质是一样的
通过上面设置上传图片,MP3,小的文件都没问题。
本文为博主原创文章,请尊重版权,未经博主允许不得转载,转载请注明出处:http://www.cnblogs.com/details-666/p/OKHttp.html
带有进度监听的上传下载请参考http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0904/3416.html