okhttp3.0之快速入门教程

第一次写博客,写的有什么不好地方;欢迎大家提出.
个人感觉用法跟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框架如何使用。谢谢大家!!!

参考:
官方例子
鸿洋的okhttp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值