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

来源:互联网 发布:股票委托交易软件讲解 编辑:程序博客网 时间:2024/05/02 02:22

一、HTTP协议初级探索:

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

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

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

2、HTTP与Android之间的关系:

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、客户端连接服务器实现内部的原理如下:


    分析上图,步骤如下:
    • 第一步:在浏览器客户端中得到用户输入的内容。 
    • 第二步:浏览器得到这个网址之后,内部会将这个域名发送到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协议请求详解:

    这里写图片描述

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

      这里写图片描述

      • 请求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) 
        响应头也是一些键值对,如下所示: 
        这里写图片描述

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

      • 响应体 (Response Body) 
        响应体是服务端向客户端传输的实际的数据信息,本质就是一堆字节流,可以表示文本,也可以表示图片或者其他格式的信息,如下所示: 
        这里写图片描述


    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请求。



  • 1 0
    原创粉丝点击