三、Android网络开发

传送门

《一、Android Studio的安装和使用》
《二、Android界面开发》
《三、Android网络开发》
《四、狗狗大全应用实战》

视频教程

https://space.bilibili.com/249229063/channel/seriesdetail?sid=1930119

学习目标

  • 了解HTTP
  • OKHttp的使用
  • 网络数据解析

HTTP

维基百科:https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW: World Wide Web)服务器传输超文本到本地浏览器的传送协议。这里说的超文本,就是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本,可以理解成网页。所以,HTTP实际上就是一个规则,服务器和终端按照这套规则进行数据传输和解析。那这个规则是怎样的呢?这个规则主要定义了HTTP请求的数据结构和HTTP响应的数据结构。

HTTP请求

一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。请求数据部分可以没有,但其余部分必须有,例如:

-- 请求行,包括请求方法(这里为GET),URL(这里为/),协议版本(这里为HTTP/1.1)
GET / HTTP/1.1 
-- 请求头部
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
-- 空行

HTTP响应

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

-- 状态行
HTTP/1.1 200 OK
-- 消息报头
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 155
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close
-- 空行

-- 响应正文
<html>
  <head>
    <title>An Example Page</title>
  </head>
  <body>
    <p>Hello World, this is a very simple HTML document.</p>
  </body>
</html>

另外,通过HTTP协议传输的不一定是网页,还有其他的数据结构。例如,在浏览器中输入URL:https://api.github.com/users/uncleleonfan ,返回的结果是这种键值对形式的数据,我们称之为JSON数据:

{
  "login": "uncleleonfan",
  "id": 8477402,
  "node_id": "MDQ6VXNlcjg0Nzc0MDI=",
  "avatar_url": "https://avatars.githubusercontent.com/u/8477402?v=4",
  "gravatar_id": "",
  "url": "https://api.github.com/users/uncleleonfan",
  "html_url": "https://github.com/uncleleonfan",
  "followers_url": "https://api.github.com/users/uncleleonfan/followers",
  "following_url": "https://api.github.com/users/uncleleonfan/following{/other_user}",
  "gists_url": "https://api.github.com/users/uncleleonfan/gists{/gist_id}",
  "starred_url": "https://api.github.com/users/uncleleonfan/starred{/owner}{/repo}",
  "subscriptions_url": "https://api.github.com/users/uncleleonfan/subscriptions",
  "organizations_url": "https://api.github.com/users/uncleleonfan/orgs",
  "repos_url": "https://api.github.com/users/uncleleonfan/repos",
  "events_url": "https://api.github.com/users/uncleleonfan/events{/privacy}",
  "received_events_url": "https://api.github.com/users/uncleleonfan/received_events",
  "type": "User",
  "site_admin": false,
  "name": "Leon Fan",
  "company": null,
  "blog": "",
  "location": null,
  "email": null,
  "hireable": null,
  "bio": null,
  "twitter_username": null,
  "public_repos": 104,
  "public_gists": 0,
  "followers": 298,
  "following": 2,
  "created_at": "2014-08-18T08:14:59Z",
  "updated_at": "2021-12-19T07:16:30Z"
}

OKHttp

Github: https://github.com/square/okhttp

OKhttp是一个开源的网络库,它封装了Http请求和响应的方法,使用它,我们可以在Android应用中轻松的发送HTTP请求和获取HTTP响应。

使用方法:

1、给应用添加网络权限
如果Android应用要使用网络,需要在AndroidManifest.xml中声明使用网络的权限。

截屏2021-12-19 下午5.37.54.png

如果不声明网络权限,后续会在调用网络的过程中抛出权限异常:

E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
    Process: com.xuneng.helloworld, PID: 28405
    java.lang.SecurityException: Permission denied (missing INTERNET permission?)
        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:150)
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:103)
        at java.net.InetAddress.getAllByName(InetAddress.java:1152)
        at okhttp3.Dns$Companion$DnsSystem.lookup(Dns.kt:49)

2、添加Okhttp的依赖

找到项目app模块下的build.gradle, 添加对Okttp的依赖,并点击Sync Now同步按钮,下载OKhttp库。

截屏2021-12-19 下午5.17.34.png

3、发送请求

在MainActivity.java中创建发送请求到方法sendRequest()。
截屏2021-12-19 下午6.00.38.png
需要注意的是,在Android中,网络请求是耗时的IO操作,需要放到子线程中,主线程(UI线程)只做UI操作。通过enqueue的方法,网络请求将会在子线程中执行。
sendRequest方法完成后,就可以在MainActivity中的onCreate方法里调用,发起网络请求。
截屏2021-12-19 下午6.04.34.png

运行代码,如果请求成功,会执行的回调方法onResponse,打印出日志:

截屏2021-12-19 下午6.06.58.png

运行代码到模拟器前,可以检查下模拟器是否能够正常访问,方法是将URL https://api.github.com/users/uncleleonfan 复制粘贴到模拟器的浏览器,看是否能正常返回数据。如果模拟器不能正常返回,可以搜索下怎么解决模拟器网络问题,或者直接用电脑连Android手机,开启USB调试模式,将代码运行到真机上。

网络数据解析

OKhttp网络请求返回的是一个Response对象,怎么去解析这个Response对象,获取到我们要的数据呢?上面我们提到请求https://api.github.com/users/uncleleonfan 返回的是一个JSON数据格式,所以我们这里使用JSONObject来解析。

截屏2021-12-19 下午6.19.34.png

代码执行后的日志:

截屏2021-12-19 下午6.21.32.png

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值