零、前言
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.更多关于我
笔名 | 微信 | 爱好 | |
---|---|---|---|
张风捷特烈 | 1981462002 | zdl1994328 | 语言 |
我的github | 我的简书 | 我的CSDN | 个人网站 |
3.声明
1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持
网友评论