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
原创粉丝点击