Android - 网络请求之OKHttp3

作者: Allens_Jiang | 来源:发表于2017-12-28 18:07 被阅读426次
    老婆保佑,代码无BUG

    目录

    • 引用
    • 基础用法
      • GET
      • post
        • 使用FormBody传递键值对参数
        • 使用RequestBody传递Json或File对象
        • 使用MultipartBody同时传递键值对参数和File对象
        • 自定义RequestBody实现流的上传
    • 设置请求头
    • 下载文件
    • 封装

    一.引用

    OKHttp官网

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

    二.基础用法

    GET

       private void initget() {
            //创建okHttpClient对象
            OkHttpClient mOkHttpClient = new OkHttpClient();
    
            //创建一个Request
            final Request request = new Request.Builder()
                    .url("http://apis.juhe.cn/mobile/get?phone=18856907654&key=5778e9d9cf089fc3b093b162036fc0e1")
                    .build();
            //new call
            Call call = mOkHttpClient.newCall(request);
            //请求加入调度
            call.enqueue(new Callback() {
                @Override
                public void onFailure(@NonNull Call call, IOException e) {
    
                }
    
                @Override
                public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                    if (response.isSuccessful()) {//回调的方法执行在子线程。
                        String htmlStr = response.body().string();
                        Logger.e("htmlStr--->" + htmlStr);
                        Logger.e("response.code()==" + response.code());
                    }
                }
            });
        }
    

    POST

    (1)使用FormBody传递键值对参数

    
        private void initPost() {
            OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
            FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
            formBody.add("phone", "18856907654");//传递键值对参数
            formBody.add("key", "5778e9d9cf089fc3b093b162036fc0e1");//传递键值对参数
            Request request = new Request.Builder()//创建Request 对象。
                    .url("http://apis.juhe.cn/mobile/get")
                    .post(formBody.build())//传递请求体
                    .build();
        }
    

    (2)使用RequestBody传递Json或File对象

     private void initPost1() {
            OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
            MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
            String jsonStr = "{\"phone\":\"18856907654\",\"key\":\"5778e9d9cf089fc3b093b162036fc0e1\"}";//json数据.
            RequestBody body = RequestBody.create(JSON, jsonStr);
            Request request = new Request.Builder()
                    .url("http://apis.juhe.cn/mobile/get")
                    .post(body)
                    .build();
         
        }
    

    (3) 使用MultipartBody同时传递键值对参数和File对象

        private void initPost2() {
            OkHttpClient client = new OkHttpClient();
            MultipartBody multipartBody =new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("phone","18856907654")//添加键值对参数
                    .addFormDataPart("key","5778e9d9cf089fc3b093b162036fc0e1")
    //                .addFormDataPart("file","fileName",RequestBody.create(MediaType.parse("file/*"), new File("/user/allens/desktop/meinv.png")))//添加文件
                    .build();
            final Request request = new Request.Builder()
                    .url("http://apis.juhe.cn/mobile/get")
                    .post(multipartBody)
                    .build();
    
         
    

    (4)自定义RequestBody实现流的上传

      private void initPost3() {
            RequestBody body = new RequestBody() {
                @Override
                public MediaType contentType() {
                    return null;
                }
    
                @Override
                public void writeTo(BufferedSink sink) throws IOException {//重写writeTo方法
                    FileInputStream fio = new FileInputStream(new File("fileName"));
                    byte[] buffer = new byte[1024 * 8];
                    if (fio.read(buffer) != -1) {
                        sink.write(buffer);
                    }
                }
            };
    
            OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
            Request request = new Request.Builder()
                    .url("http://www.baidu.com")
                    .post(body)
                    .build();
        }
    

    三.设置请求头

    Request request = new Request.Builder()
                    .url("http://www.baidu.com")
                    .header("User-Agent", "OkHttp Headers.java")
                    .addHeader("token", "myToken")
                    .build();
    
    

    四.下载文件

    在OKHttp中并没有提供下载文件的功能,但是在Response中可以获取流对象,有了流对象我们就可以自己实现文件的下载。代码如下:
    这段代码写在回调接口CallBack的onResponse方法中:

        InputStream  is = response.body().byteStream();//从服务器得到输入流对象
       
    

    五.封装

    封装地址,点击查看

    参看

    鸿洋Android OkHttp完全解析 是时候来了解OkHttp了

    OKHttp使用详解

    相关文章

      网友评论

        本文标题:Android - 网络请求之OKHttp3

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