前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2--安卓网络编程之http协议简介+小案例引入

2--安卓网络编程之http协议简介+小案例引入

作者头像
张风捷特烈
发布2018-10-18 11:40:19
7380
发布2018-10-18 11:40:19
举报
零、前言
1.初衷

安卓一大堆网络框架,会用倒是会用,但总觉得封装得太多,就太表象了,这让我看不清网络的内在。 就像买了一份拼图,买来就是拼好的,我还不知道碎片是什么样子的,这样放着不管就可以了吗?真的不想自己拼一拼? 为了更清晰的认识网络,打算从起点来看一下安卓的安卓网络编程

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

访问返回Json地址:http://www.toly1994.com:8089/swords/find/21 访问返回图片地址:http://www.toly1994.com:8080/imgs/logo/BroadcastReceiver.jpg 具体url的创建方法可详见:SpringBoot篇:SpringBoot-07-之数据库JPA(CRUD)


一、HTTP----超文本传输协议(HyperText Transfer Protocol)

1.HTTP一种基于TCP/IP协议的网络传输协议。 2.HTTP用于服务端传输超文本到客户端,是一种应用层的传输协议。 HTTP协议工作于客户端/服务端架构(B/S架构)上: 客户端通过URL(统一资源定位符)WEB服务器发送请求,WEB服务器根据请求,向客户端发送响应信息 WEB服务器:Apache服务器,IIS服务器、Tomcat、Nginx、Jetty等 客户端:浏览器、联网的App、游戏客户端等

1.http请求测试:

http请求.png

请求头:浏览器发送给服务器
代码语言:javascript
复制
#请求行:使用HTTP/1.1协议发送GET方式请求,访问域名下的/swords/find/21资源
GET /swords/find/21 HTTP/1.1
#请求的域名和端口
Host: localhost:8080
#维持长连接
Connection: keep-alive
Pragma: no-cache
#浏览器缓存类型
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
#浏览器的厂商信息
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/69.0.3497.100 Safari/537.36
#浏览器可接收的数据类型:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
#声明浏览器支持的编码类型
Accept-Encoding: gzip, deflate, br
#声明浏览器支持的语言
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
2.响应头:服务器发送给浏览器
代码语言:javascript
复制
#返回内容类型
Content-Type: application/json;charset=UTF-8
#时间
Date: Mon, 15 Oct 2018 00:26:33 GMT
#分块编码
Transfer-Encoding: chunked
3.响应体
代码语言:javascript
复制
{"id":21,
"name":"Excalibur",
"info":"Excalibur是传说中不列颠国王亚瑟王从湖之仙女那得到的圣剑。
此剑在是精灵在阿瓦隆(Avalon)所打造,剑锷由黄金所铸、剑柄上镶有宝石,并因其锋刃削铁如泥",
"imgurl":"http://localhost:8080/imgs/timg.jpg",
"create_time":"2018-07-17T08:29:36.000+0000",
"modify_time":"2018-07-17T08:29:36.000+0000",
"origin":"亚瑟王"}

http请求测试.png


二、请求网络并接收服务器返回的数据
添加网络访问权限
代码语言:javascript
复制
<uses-permission android:name="android.permission.INTERNET"/>
使用安卓原生网络API请求网络大致步骤:

1.创建URL对象url:new URL(String path) 2.使用url连接并获取HttpURLConnection对象conn:url.openConnection() 3.为conn对象设置请求信息:conn.setXXX() 4.校验响应码,200代表请求成功:conn.getResponseCode() 5.通过conn获取服务器传来的输入流:conn.getInputStream() 6.对流进行操作:java的基础----IO流

1.点击按钮是执行代码:

注意需要新开线程执行请求网络,不然异常:android.os.NetworkOnMainThreadException

代码语言:javascript
复制
String path = "http://192.168.43.60:8080/swords/find/21";
//新开线程访问网络
new Thread(() -> {
    String result = getRes(path);
    Log.e(TAG, "onViewClicked: " + result);
}).start();
2.请求网络核心代码:
代码语言:javascript
复制
/**
 * 通过url访问服务器,并接收服务器响应数据
 *
 * @param path url
 */
private String getRes(String path) {
    InputStream is = null;
    try {
        //1.创建URL对象url
        URL url = new URL(path);
        //2.使用url连接并获取HttpURLConnection对象conn
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //3.为conn对象设置请求信息
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        //4.校验响应码,200代表请求成功
        if (conn.getResponseCode() == 200) {
            //5.通过conn获取服务器传来的输入流
            is = conn.getInputStream();
            //6.对流进行操作
            StringBuilder sb = new StringBuilder();
            int len = 0;
            byte[] buf = new byte[1024];
            while ((len = is.read(buf)) != -1) {
                sb.append(new String(buf, 0, len));
            }
            return sb.toString();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return "error";
}

安卓请求网络.png

3.引申:可以通过输入网址来获取不同的返回值,并用TextView显示,如:

引申.png

你也可以请求一下百度的服务器,可以看出是返回了一个Html的源码,浏览器便是解析这份源码,渲染成视图展现出来的。

请求百度首页.png

三、请求网络,加载图片

可见请求一个url时,服务器会返回一个字节流,图片也是二进制,当然也能顺着服务器过来。 按照上面的实例,看看流过来的是什么?图片地址:http://www.toly1994.com:8080/imgs/logo/BroadcastReceiver.jpg

不出所料,是乱码,但能读出来就成功了一半

网络图片文字显示.png

显示图片

核心在于流的使用:通过流创建Bitmap对象:BitmapFactory.decodeStream(InputStream is)

1.点击按钮是执行代码:
代码语言:javascript
复制
new Thread(() -> {
    Bitmap img = decodeImg(mIdEtUrl.getText().toString());
    runOnUiThread(() -> {
        mIdIvImg.setImageBitmap(img);
        });
    }).start();
2.请求网络核心代码:
代码语言:javascript
复制
/**
 * 通过url返回一个Bitmap
 * @param path url
 * @return 图片
 */
private Bitmap decodeImg(String path) {
    InputStream is = null;
    OutputStream os = null;
    try {
        //1.创建URL对象url
        URL url = new URL(path);
        //2.使用url连接并获取HttpURLConnection对象conn
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        //3.为conn对象设置请求信息
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        //4.校验响应码,200代表请求成功
        if (conn.getResponseCode() == 200) {
            //5.通过conn获取服务器传来的输入流
            is = conn.getInputStream();
            //6.对流进行操作
            return BitmapFactory.decodeStream(is);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}

网络图片.png


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

项目源码

日期

备注

V0.1--无

2018-10-15

2--安卓网络编程之http协议简介+小案例引入

2.更多关于我

笔名

QQ

微信

爱好

张风捷特烈

1981462002

zdl1994328

语言

我的github

我的简书

我的CSDN

个人网站

3.声明

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、前言
    • 1.初衷
      • 2.本文测试的url为已在服务器上,可访问:
      • 一、HTTP----超文本传输协议(HyperText Transfer Protocol)
        • 1.http请求测试:
          • 请求头:浏览器发送给服务器
            • 2.响应头:服务器发送给浏览器
              • 3.响应体
                • 添加网络访问权限
                • 使用安卓原生网络API请求网络大致步骤:
            • 二、请求网络并接收服务器返回的数据
              • 1.点击按钮是执行代码:
                • 2.请求网络核心代码:
                  • 3.引申:可以通过输入网址来获取不同的返回值,并用TextView显示,如:
                  • 三、请求网络,加载图片
                    • 不出所料,是乱码,但能读出来就成功了一半
                      • 显示图片
                        • 1.点击按钮是执行代码:
                          • 2.请求网络核心代码:
                          • 后记:捷文规范
                            • 1.本文成长记录及勘误表
                              • 2.更多关于我
                                • 3.声明
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档