okhttp3.0之快速入门教程
来源:互联网 发布:python 异常处理 编辑:程序博客网 时间:2024/05/22 05:00
第一次写博客,写的有什么不好地方;欢迎大家提出.
个人感觉用法跟volley差不多,好了开始介绍如何快速使用okhttp3。
- 一主要类介绍
- 二如何使用
- Get
- Post
- GetFile
- PostFile
- PostMultipart上传多个文件
- PostStreaming数据流
- 三总结
一、主要类介绍
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框架如何使用。谢谢大家!!!
参考:
官方例子
鸿洋的okhttp
1 0
- okhttp3.0之快速入门教程
- Yii2.0 快速入门教程
- 网络请求之OKHttp3.0(工具类)
- okhttp3.0
- okhttp3.0
- Android数据库之Realm快速入门教程
- OkHttp3之缓存应用
- RoR2.0快速入门教程(推荐)
- asp.net2.0快速入门教程下载
- okhttp3.0学习
- okHttp3.0下载文件
- android OkHttp3.0
- android OkHttp3.0介绍
- android OkHttp3.0介绍
- OkHttp3
- OkHttp3
- OkHttp3
- OkHttp3
- 使用dubbo+maven搭建消费者跟提供者(附源码)
- HDU---1689
- 杭电-2035 人见人爱A^B
- poj2187
- 通过数据库连接池连接数据库方式
- okhttp3.0之快速入门教程
- POJ 3087Shuffle'm Up 简单的模拟题
- QSDK art分区地址映射
- 一句话看懂getactivity和this区别
- 仿京东,淘宝,顶部自动轮播图
- OXWALL优化思路
- Django部署(Nginx)
- 【java项目】迁移到linux下
- 在HP DL180 Gen9 上安装CentOS系统并设置一个简单网站