前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5--安卓网络编程之OKHttp3的使用

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

作者头像
张风捷特烈
发布2018-11-07 11:24:50
1.2K0
发布2018-11-07 11:24:50
举报
零、前言

安卓的网络编程,服务端的知识是必不可少的,否则不知道该请求什么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-之参数传递

依赖

代码语言:javascript
复制
implementation 'com.squareup.okhttp3:okhttp:3.11.0'

一、GET请求

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

代码语言:javascript
复制
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

百度首页html.png


二、POST请求
代码语言:javascript
复制
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));
        }
    });
}

post请求.png


三、POST请求的请求体中添加文本
代码语言:javascript
复制
    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));

            }
        });
    }

post请求body中加入文本.png


四、通过流传输文件
代码语言:javascript
复制
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));
        }
    });
}

上传文件.png


五、通过模拟表单上传文件:MultipartBody
代码语言:javascript
复制
/**
 * 模拟表单上传文件:通过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));
        }
    });
}

六、下载文件:
代码语言:javascript
复制
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();
        }
    });
}

下载本地.png


七、在安卓端显示图片:

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

代码语言:javascript
复制
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);
            });
        }
    });
}

安卓显示.png


后记:捷文规范
1.本文成长记录及勘误表

项目源码

日期

备注

V0.1--无

2018-10-20

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

2.更多关于我

笔名

QQ

微信

爱好

张风捷特烈

1981462002

zdl1994328

语言

我的github

我的简书

我的CSDN

个人网站

3.声明

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.10.20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、前言
    • 本文测试的url为已在服务器上,可访问:
      • 一、GET请求
        • 二、POST请求
          • 三、POST请求的请求体中添加文本
            • 四、通过流传输文件
              • 五、通过模拟表单上传文件:MultipartBody
                • 六、下载文件:
                  • 七、在安卓端显示图片:
                  • 后记:捷文规范
                    • 1.本文成长记录及勘误表
                      • 2.更多关于我
                        • 3.声明
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档