美文网首页Java 杂谈Android开发Android开发
2--安卓网络编程之http协议简介+小案例引入

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

作者: e4e52c116681 | 来源:发表于2018-10-15 18:21 被阅读6次

零、前言

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
请求头:浏览器发送给服务器
#请求行:使用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.响应头:服务器发送给浏览器
#返回内容类型
Content-Type: application/json;charset=UTF-8
#时间
Date: Mon, 15 Oct 2018 00:26:33 GMT
#分块编码
Transfer-Encoding: chunked
3.响应体
{"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

二、请求网络并接收服务器返回的数据

添加网络访问权限
<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

String path = "http://192.168.43.60:8080/swords/find/21";
//新开线程访问网络
new Thread(() -> {
    String result = getRes(path);
    Log.e(TAG, "onViewClicked: " + result);
}).start();
2.请求网络核心代码:
/**
 * 通过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.点击按钮是执行代码:
new Thread(() -> {
    Bitmap img = decodeImg(mIdEtUrl.getText().toString());
    runOnUiThread(() -> {
        mIdIvImg.setImageBitmap(img);
        });
    }).start();
2.请求网络核心代码:
/**
 * 通过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----看到这里,我在此感谢你的喜欢与支持

相关文章

网友评论

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

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