Android HTTP协议请求网络(一)之认识探索

Android HTTP协议请求网络(二)之HttpClient方式

Android HTTP协议请求网络(三)之HttpURLConnection方式

gitHup整合Demo地址:https://github.com/aiyangtianci/NetworkRequestDemo


一、HTTP协议初级探索:

1、HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是Internet上目前使用最广泛的应用层协议,它基于传输层的TCP协议进行通信,HTTP协议是通用的、无状态的协议。

这几个名词有一种通俗的解释:

  • 通讯协议:双方对话的标准
  • 通用的:用了都说好,谁用谁知道
  • 无状态的:翻脸不认人
  • 超文本:除了文本,还可以是音频、视频

2、HTTP与Android之间的关系:

Android HTTP协议请求网络(一)之认识探索_第1张图片

3、HTTP学习的知识点:

Http协议基础概念、 请求响应模型、 提交请求的不同方法、 响应状态判断、 获取响应以及解析响应、 数据下载的实现方法、 数据上传的实现方法、 请求头详细内容、 响应头详细内容等

二、HTTP协议概念:

1、HTTP协议定义:
WWW是以Internet作为传输媒介的一个应用系统,WWW网上基本的传输单位是Web网页。WWW的工作是基于客户机/服务器计算模型,由Web浏览器和Web服务器构成,两者之间采用超文本传输协议HTTP进行通信。
HTTP协议时基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层的协议,是通用的、无状态的面向对象的协议。 
如果要实现网络互联我们要思考两个需要解决的技术问题:

  • 第一:浏览器和服务器是通过什么来连接的。
  • 第二:这种连接方式是怎么实现的。
通过Internet去发送到服务器当中,而Internet内部可以通过三种方式来实现发送信息和数据:
  • 第一种:HTTP协议,也是在工作中最常用的,是建立在TCP/IP基础上实现的。
  • 第二种:FTP协议
  • 第三种:TCP/IP协议,它也是最底层的协议,其它的方式必须是要通过它,但是要想实现这种协议必须要实现socket编程,这种方法是用来上传一些比较大的文件,视频,进行断点续传的操作。
2、客户端连接服务器实现内部的原理如下:
Android HTTP协议请求网络(一)之认识探索_第2张图片

分析上图,步骤如下:
  • 第一步:在浏览器客户端中得到用户输入的内容。 
  • 第二步:浏览器得到这个网址之后,内部会将这个域名发送到DNS上,进行域名解析。得到它的IP之后就会链接到指定的服务器上,假如服务器的地址是:221.104.13.32:80,从浏览器到服务器端口它使用到最底层的TCP/IP协议。 
  • 第三步:实现TCP/IP协议用Socket来完成,使用了Socket的套接字。 
  • 第四步:服务器端的80端口监听客户端的链接,这样客户端到服务器就链接上了。
  • 服务器接收到这些内容之后,并按照这些请求的路径找到对应的页面,进一步找到对应的网页内容,返回给客户端。
通俗一点讲,用户在浏览器输入网址,通过http协议发出去,网址经过DNS域名解析,解析成指定的ip地址,并在80端口上监听用户的请求。服务器监听到请求之后,会以三种方式返回给客户端:HTML、XML、JASON。
HTTP返回请求数据的三种方式:
  • 1、以HTML代码内容返回。 
  • 2、以XML字符串的形式返回,在以后的android开发中这种形式返回数据比较多。 
  • 3、以JSON对象形式返回,在网络流量上考虑JSON要比XML方式要好一些,便于解析。
在Android当中,一般使用xml和Json数据解析。


三、使用HTTP协议访问网络:

Android中的WebView控件已经在后台帮我们处理好了发送HTTP请求、接收服务响应、解析返回数据,以及最终的页面展示这几步工作,不过由于它封装得太好了,反而不能直观地看出HTTP协议是如何工作的。因此需要我们通过手动发送HTTP请求的方式,来更加深入的了解这一过程。

在Android上发送HTTP请求的方式一般有两种:HttpURLConnectionHttpCient。接下来几篇文章将陆续讲解实战用法并附带源码demo。



四、HTTP协议请求详解:

Android HTTP协议请求网络(一)之认识探索_第3张图片

  • 客户端->服务器 
    客户端向服务器发送请求主要包含以下信息:请求的Url地址、请求头以及可选的请求体,打开百度首页,客户端向服务器发送的信息如下所示:

    Android HTTP协议请求网络(一)之认识探索_第4张图片

    • 请求URL(Request URL) 
      上图中的Request URL就是请求的Url地址,即https://www.baidu.com,该Url没有附加其他的参数。其实可以通过?和&符向URL地址后面追加一系列的键值对参数,比如地址https://www.baidu.com/s?ie=utf-8&wd=Android,该Url包含两个键值对,ie=utf-8,以及wd=Android,ie和wd是key,utf-8和Android分别是其对应的value,服务端可以获取ie和wd所对应的value的值。由此我们可以看出,Url可以携带额外的数据信息。一般情况下,URL的长度不能超过2048个字符,即2KB,超过此限制的话服务器可能就不识别。

    • 请求头(Request Headers) 
      上图中Request Headers部分就是请求头,请求头其实也是一些键值对,不过这些键值通常都是W3C定义了的一些标准的Http请求头的名称,请求头包含了客户端想告诉服务端的一些元数据信息,注意是元数据,而不是数据,比如请求头User-Agent会告诉服务器这条请求来自于什么浏览器,再比如请求头Accept-Encoding会告诉服务器客户端支持的压缩格式。除了这些标准的请求头,我们还可以添加自定义的请求头。

    • 请求体(Request Body) 
      之前我们提到,URL的最大长度就是2048个字符,如果我们发送的数据很大,超过了2KB怎么办?我们可以将很大的数据放到请求体中,GET请求不支持请求体,只有POST请求才能设置请求体。请求体中可以放置任意的字节流,从而可以很方便地发送任意格式的数据,服务端只需要读取该输入流即可。

  • 服务器->客户端 
    服务器接收到客户端发来的请求后,会进行相应的处理,并向客户端输出信息,输出的信息包括响应头和响应体。

    • 响应头 (Response Headers) 
      响应头也是一些键值对,如下所示: 
      Android HTTP协议请求网络(一)之认识探索_第5张图片

      响应头包含了服务器想要告诉客户端的一些元数据信息,注意不是数据,是元数据,比如通过响应头Content-Encoding告诉客户端服务器所采用的压缩格式,响应头Content-Type告诉客户端响应体是什么格式的数据,再比如服务端可以通过多个Set-Cookie响应头向客户端写入多条Cookie信息,等等。刚刚提到的几个请求头都是W3C规定的标准的请求头名称,我们也可以在服务端向客户端写入自定义的响应头。

    • 响应体 (Response Body) 
      响应体是服务端向客户端传输的实际的数据信息,本质就是一堆字节流,可以表示文本,也可以表示图片或者其他格式的信息,如下所示: 
      Android HTTP协议请求网络(一)之认识探索_第6张图片


GET vs POST

Http协议支持的操作有GET、POST、HEAD、PUT、TRACE、OPTIONS、DELETE,其中最最常用的还是GET和POST操作,下面我们看一下GET和POST的区别。

GET:

  • GET请求可以被缓存。
  • 我们之前提到,当发送键值对信息时,可以在URL上面直接追加键值对参数。当用GET请求发送键值对时,键值对会随着URL一起发送的。
  • 由于GET请求发送的键值对时随着URL一起发送的,所以一旦该URL被黑客截获,那么就能看到发送的键值对信息,所以GET请求的安全性很低,不能用GET请求发送敏感的信息(比如用户名密码)。
  • 由于URL不能超过2048个字符,所以GET请求发送数据是有长度限制的。
  • 由于GET请求较低的安全性,我们不应该用GET请求去执行增加、删除、修改等的操作,应该只用它获取数据。

POST:

  • POST请求从不会被缓存。
  • POST请求的URL中追加键值对参数,不过这些键值对参数不是随着URL发送的,而是被放入到请求体中发送的,这样安全性稍微好一些。
  • 应该用POST请求发送敏感信息,而不是用GET。
  • 由于可以在请求体中发送任意的数据,所以理论上POST请求不存在发送数据大小的限制。
  • 当执行增减、删除、修改等操作时,应该使用POST请求,而不应该使用GET请求。

你可能感兴趣的:(Android,UI\HTTP框架)