美文网首页
OkHttp3的使用

OkHttp3的使用

作者: 笔墨Android | 来源:发表于2017-09-16 14:28 被阅读0次

    不怕跌倒,所以飞翔

    参考文献:
    SUN's Cabin
    刘望舒
    瘟疫幽魂
    OyangYujun

    1.OkHttp3进行GET请求的简单使用:

    1.引入关联

     compile 'com.squareup.okhttp3:okhttp:3.8.1'
    

    这里我引入的是最新的你也可以看看最新的是什么版本

    2.创建OkHttpClient对象

    OkHttpClient httpClient = new OkHttpClient();
    

    3. 创建一个请求

    Request request = new Request.Builder()
                    .method("GET", null)/*可以通过method设置请求方式,不指定请求方法时默认是GET请求*/
                    .url("https://github.com/hongyangAndroid")
                    .build();
    
    

    4.发送一个请求,这里是把请求封装成一个任务,其实这个请求是一个异步请求

    Call call = httpClient.newCall(request);
    

    5.开始异步请求

    call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e(TAG, "onFailure: " + e.toString());
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    /*step 5:获取响应体*/
                    Log.e(TAG, "onResponse: " + response.body());
                   }
            });
    

    这里有很多细节的地方需要注意:

    • 这个 response.body().string()只能调用一次,如果调用多次的话会有异常
    • response.body()有很多方法处理数据,可以是流,也可以是字符串等许多类型,根据业务逻辑自行处理
      整体的流程代码如下:
            /*step 1:创建OkHttpClient对象*/
            OkHttpClient httpClient = new OkHttpClient();
            /*step 2:创建一个请求,不指定请求方法时默认是GET请求*/
            Request request = new Request.Builder()
                    .method("GET", null)/*可以通过method设置请求方式*/
                    .url("https://github.com/hongyangAndroid")
                    .build();
            /*step 3:发送一个请求,这里是把请求封装成一个任务,其实这个请求是一个异步请求*/
            Call call = httpClient.newCall(request);
            /*step 4:开始异步请求*/
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.e(TAG, "onFailure: " + e.toString());
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    /*step 5:获取响应体*/
                    Log.e(TAG, "onResponse: " + response.body());
                }
            });
    

    2.OkHttp3进行POST请求的简单使用:

    其实post请求和get请求都是类似的就是多了传入参数的方法,这里就不一步一步写了,直接贴代码了;

     /*step 1: 同样的需要创建一个OkHttpClick对象*/
            OkHttpClient okHttpClient = new OkHttpClient();
    
            /*step 2: 创建  FormBody.Builder*/
            FormBody formBody = new FormBody.Builder()
                    .add("name", "dsd")
                    .build();
    
            /*step 3: 创建请求*/
            Request request = new Request.Builder().url("http://www.baidu.com")
                    .post(formBody)
                    .build();
    
            /*step 4:建立联系 创建Call对象*/;
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.e(TAG, "onResponse: " + response.body().string());
                }
            });
    

    3.OkHttp3进行POST文件上传:

    这里的写法都差不多,就直接贴代码了,下面会有注意事项的;

          // step 1: 创建 OkHttpClient 对象
            OkHttpClient okHttpClient = new OkHttpClient();
    
            //step 2:创建 RequestBody 以及所需的参数
            //2.1 获取文件
            File file = new File(Environment.getExternalStorageDirectory() + "test.txt");
            //2.2 创建 MediaType 设置上传文件类型
            MediaType MEDIATYPE = MediaType.parse("text/plain; charset=utf-8");
            //2.3 获取请求体
            RequestBody requestBody = RequestBody.create(MEDIATYPE, file);
    
            //step 3:创建请求
            Request request = new Request.Builder().url("http://www.baidu.com")
                    .post(requestBody)
                    .build();
    
            //step 4 建立联系
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    // TODO: 17-1-4  请求失败
                }
    
                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    // TODO: 17-1-4 请求成功
                }
            });
    
    参数 说明
    text/html HTML格式
    text/plain 纯文本格式
    text/xml XML格式
    image/gif gif图片格式
    image/jpeg jpg图片格式
    image/png png图片格式
    application/xhtml+xml XHTML格式
    application/xml XML数据格式
    application/atom+xml Atom XML聚合格式
    application/json JSON数据格式
    application/pdf pdf格式
    application/msword Word文档格式
    application/octet-stream 二进制流数据

    4.OkHttp3异步上传Multipart文件

    这个应用场景要说明一下,一般上传图片到服务器是时候,还要添加一些其他的字段,比如ID什么的,这里就是简单的举例说明一下:

        OkHttpClient mOkHttpClient = new OkHttpClient();
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("title", "wangshu")
                .addFormDataPart("image", "wangshu.jpg",
                        RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/wangshu.jpg")))
                .build();
        Request request = new Request.Builder()
                .header("Authorization", "Client-ID " + "...")
                .url("https://api.imgur.com/3/image")
                .post(requestBody)
                .build();
       mOkHttpClient.newCall(request).enqueue(new Callback() {
           @Override
           public void onFailure(Call call, IOException e) {
               // TODO: 17-1-4  请求失败
           }
           @Override
           public void onResponse(Call call, Response response) throws IOException {
               // TODO: 17-1-4 请求成功
           }
       });
    

    4.设置提升

    1.设置一些基本的请求参数

     OkHttpClient.Builder builder = new OkHttpClient.Builder()
                    .connectTimeout(15, TimeUnit.SECONDS)//链接超时
                    .writeTimeout(15, TimeUnit.SECONDS)//写入超时
                    .readTimeout(20, TimeUnit.SECONDS);//读取超时
    
    OkHttpClient httpClient = builder.build();//构建出OKHttpClient对象
    

    2.添加公共的请求参数

    2.1添加到请求链接的尾部
            Request publicRequest = new Request.Builder()
                    .url("https://github.com/hongyangAndroid")
                    .build();
    
            HttpUrl httpUrl = publicRequest
                    .url()
                    .newBuilder()
                    .addQueryParameter("version", "1.0")
                    .addQueryParameter("code", "android")
                    .build();
    
            Request request = publicRequest.newBuilder()
                    .method(publicRequest.method(), publicRequest.body())
                    .url(httpUrl)
                    .build();
    

    这个request的Url请求地址就是加上了公共请求参数的地址了,其实就是先创建了一个去收集所有的公共参数,然后在重新构建一个request在进行拼接最后出来的就是拼接好的了;

    2.2添加在请求form表单里

    这种方式一般不会用。。。

            Request publicRequest = new Request.Builder()
                    .url("https://github.com/hongyangAndroid")
                    .build();
    
            FormBody formBody = new FormBody.Builder()/*这个就是表单了*/
                    .add("version", "1.0")
                    .add("code", "android")
                    .build();
    
            /*默认添加表单后不能添加新的form表单,需要先将RequestBody转成String去拼接*/
            String formString = bodyToString(publicRequest.body());
            formString += ((formString.length() > 0) ? "&" : "") + bodyToString(formBody);
    
            Request request = publicRequest.newBuilder()
                    .method(publicRequest.method(), publicRequest.body())
                     //添加到请求里
                     //string转回成RequestBody
                    .post(RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), formString))
                    .build();
    
        /*转换的方法*/
        private static String bodyToString(final RequestBody request) {
            try {
                final RequestBody copy = request;
                final Buffer buffer = new Buffer();
                if (copy != null) copy.writeTo(buffer);
                else return "";
                return buffer.readUtf8();
            } catch (final IOException e) {
                return "did not work";
            }
        }
    
    2.3添加在请求head
            Request request = publicRequest.newBuilder()
                    .method(publicRequest.method(), publicRequest.body())
                    .addHeader("version", "1.0")
                    .addHeader("code", "android")
                    .build();
    
    
    2.4关于拦截器
    2.4.1日志拦截器
    public class LogInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
    
            Request request = chain.request();
            Log.e("url", String.format("Sending request %s on %s %n %s", request.url(), chain.connection(), request.headers()));
            return chain.proceed(request);
        }
    }
    

    这是一个简单的日志拦截器,作用是拦截打印所有日志,添加的话直接addInterceptor(new LogInterceptor())就可以了,这个里面其实可以重新定制请求的所有信息


    关于进阶上的内容以后用到了在添加上去。。。


    2017年10月04日添加
    关于OkHttp3缓存的使用

    • 首先说明一点,对于OkHttp3缓存的策略,基本上都是针对于GET请求的,因为GET请求都是一些持久的请求,不像POST请求用于交互,所以这里添加的都是针对于GET请求的一些操作。

    关于缓存的内容有两种方案:

    1.一种方案是:

    这种方案是把缓存直接存入到指定目录当中,不论

    相关文章

      网友评论

          本文标题:OkHttp3的使用

          本文链接:https://www.haomeiwen.com/subject/hwdysxtx.html