5--安卓网络编程之OKHttp3的使用

零、前言

安卓的网络编程,服务端的知识是必不可少的,否则不知道该请求什么url,或不明白服务端是什么样的,总像是拼图少了一半
还好本人会些SpringBoot压箱底,这里提供了可访问的URL供大家测试,以及后端的具体实现的链接,感兴趣的可以看一下
本文安卓端基本上是根据慕课网上hyman的Android网络框架-OkHttp使用 敲的,懒得看文章的可以去看看视频
不过版本OKHttp3.X和视频中2.X稍有不同,还有本文服务端使用SpringBoot与视频不同

本文测试的url为已在服务器上,可访问:

GET请求测试地址:http://www.toly1994.com:8089/swords/find/21
POST请求测试地址:http://www.toly1994.com:8089/swords/postFind 参数:id=26
具体url的创建方法可详见:SpringBoot篇:SpringBoot-07-之数据库JPA(CRUD)

POST请求体中添加文本:http://www.toly1994.com:8089/PostString
具体url的创建方法可详见:SpringBoot篇:SpringBoot-02-之参数传递

POST请求体中上传文件:http://www.toly1994.com:8089/PostFile
通过模拟表单上传文件:http://www.toly1994.com:8089/upload
具体url的创建方法可详见:SpringBoot篇:SpringBoot-02-之参数传递

依赖

implementation 'com.squareup.okhttp3:okhttp:3.11.0'

一、GET请求

注:回调的Callback在子线程执行,不能更新UI

private void doGet() {
    //1.获取OkHttpClient对象
    OkHttpClient okHttpClient = new OkHttpClient();
    //2.获取Request对象
    Request request = new Request.Builder().get().url("http://www.baidu.com").build();
    //3.将Request封装为Call对象
    Call call = okHttpClient.newCall(request);
    //4.执行Call
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e(TAG, "onFailure: " + e);
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            Log.e(TAG, "onResponse: " + response.body().string());
        }
    });
}

将访问百度的服务器,服务器返回的内容体便是百度首页的html

9414344-bd812437b255b7de.png
百度首页html.png

二、POST请求
private void doPost() {
    //1.获取OkHttpClient对象
    OkHttpClient okHttpClient = new OkHttpClient();
    //2.构造RequestBody
    FormBody body = new FormBody.Builder().add("id", "26").build();
    Request request = new Request.Builder().url(Cons.BASE_URL+"swords/postFind").post(body).build();
    //3.将Request封装为Call对象
    Call call = okHttpClient.newCall(request);
    //4.执行Call
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e(TAG, "onFailure: " + e);
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String result = response.body().string();
            Log.e(TAG, "onResponse: " + result);
            runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result));
        }
    });
}
9414344-58a3a1cd3ebc6262.png
post请求.png

三、POST请求的请求体中添加文本
    private void doPostStr() {

        //1.获取OkHttpClient对象
        OkHttpClient okHttpClient = new OkHttpClient();
        //2.构造RequestBody
        RequestBody body = RequestBody.create(MediaType.parse("text/plain;chaset=utf-8"),
                "轻轻的我走了,\n" +
                "正如我轻轻的来;\n" +
                "我轻轻的招手,\n" +
                "作别西天的云彩。\n" +
                "\n" +
                "那河畔的金柳,\n" +
                "是夕阳中的新娘;\n" +
                "波光里的艳影,\n" +
                "在我的心头荡漾。\n);
        Request request = new Request.Builder().url(Cons.BASE_URL+"PostString").post(body).build();
        //3.将Request封装为Call对象
        Call call = okHttpClient.newCall(request);
        //4.执行Call
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e(TAG, "onFailure: " + e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();
                Log.e(TAG, "onResponse: " + result);

                runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result));

            }
        });
    }
9414344-fcd06fe1c988d752.png
post请求body中加入文本.png

四、通过流传输文件
private void doPostFile() {
    File file = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera/iv_500x400.png");
    //1.获取OkHttpClient对象
    OkHttpClient okHttpClient = new OkHttpClient();
    //2.构造Request--任意二进制流:application/octet-stream
    Request request = new Request.Builder()
            .url(Cons.BASE_URL + "PostFile")
            .post(RequestBody.create(MediaType.parse("application/octet-stream"), file)).build();
    //3.将Request封装为Call对象
    Call call = okHttpClient.newCall(request);
    //4.执行Call
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e(TAG, "onFailure: " + e);
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String result = response.body().string();
            Log.e(TAG, "onResponse: " + result);
            runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result));
        }
    });
}
9414344-133edfb4e0ab6147.png
上传文件.png

五、通过模拟表单上传文件:MultipartBody
/**
 * 模拟表单上传文件:通过MultipartBody
 */
private void doUpload() {
    File file = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera/iv_500x400.png");
    RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
    //1.获取OkHttpClient对象
    OkHttpClient okHttpClient = new OkHttpClient();
    //2.获取Request对象
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("file", "test.jpg", fileBody)
            .build();
    Request request = new Request.Builder()
            .url(Cons.BASE_URL + "upload")
            .post(requestBody).build();
    //3.将Request封装为Call对象
    Call call = okHttpClient.newCall(request);
    //4.执行Call
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e(TAG, "onFailure: " + e);
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            String result = response.body().string();
            Log.e(TAG, "onResponse: " + result);
            runOnUiThread(() -> ToastUtil.showAtOnce(MainActivity.this, result));
        }
    });
}

六、下载文件:
private void doDownload() {
    //1.获取OkHttpClient对象
    OkHttpClient okHttpClient = new OkHttpClient();
    //2.获取Request对象
    Request request = new Request.Builder().get().url(Cons.BASE_URL + "imgs/test.jpg").build();
    //3.将Request封装为Call对象
    Call call = okHttpClient.newCall(request);
    //4.执行Call
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e(TAG, "onFailure: " + e);
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            File file = new File(Environment.getExternalStorageDirectory(), "download.jpg");
            InputStream is = response.body().byteStream();
            FileOutputStream fos = new FileOutputStream(file);
            byte[] buf = new byte[102];
            int len = 0;
            while ((len = is.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
            fos.close();
            is.close();
        }
    });
}
9414344-7df3f3e0e6d84424.png
下载本地.png

七、在安卓端显示图片:

有了流,一切都好办:response.body().byteStream()
关于Bitmap的预处理等操,这里就不多说了,有兴趣的可见1-MI-Android多媒体之Bitmap:

private void showImg() {
    //1.获取OkHttpClient对象
    OkHttpClient okHttpClient = new OkHttpClient();
    //2.获取Request对象
    Request request = new Request.Builder().get().url(Cons.BASE_URL + "imgs/test.jpg").build();
    //3.将Request封装为Call对象
    Call call = okHttpClient.newCall(request);
    //4.执行Call
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.e(TAG, "onFailure: " + e);
        }
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            InputStream is = response.body().byteStream();
            Bitmap bitmap = BitmapFactory.decodeStream(is);
            runOnUiThread(()->{
                mIdIvShow.setImageBitmap(bitmap);
            });
        }
    });
}
9414344-a841caf9c74384f1.png
安卓显示.png

后记:捷文规范
1.本文成长记录及勘误表
项目源码日期备注
V0.1--无2018-10-205--安卓网络编程之OKHttp3的使用
2.更多关于我
笔名QQ微信爱好
张风捷特烈1981462002zdl1994328语言
我的github我的简书我的CSDN个人网站
3.声明

1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值