Android 中的Http

文章路线。先解释下http,与https的区别,然后列出http请求里面包含什么。

然后分析android中的源码。

接着写下连接完成后的解析过程。

涉及知识点, http, https, TCP连接过程, JSON, 序列化。

借鉴:http和https的区别

http和https

先讲下http 与 https的区别与关系。谈到这个,大家估计就会说https比http安全。但是为什么安全呢?原因是https在http的基础上加了一个SSL层进行加密。 所以说https相当于http的安全版。

HTTPS与HTTP之间的区别:

1 https协议需要到ca申请证书,一般免费的证书不多,需要交费

2 http是超文本传输协议,信息是明文传输,而https则是具有安全性的ssl加密传输协议

3 http和https使用的是完全不同的连接方式,包括用的端口也是不同的,http用的是80, https用的是443.

4 http的连接是比较简单的,是无状态的,HTTPS是右 SSL + HTTP协议构建的可进行加密传输,身份认证的网络协议。比http安全。

最最关键的一点就是SSL层加密。所以这点要好好解释:对于加密这点,,有加密就得有解密这个是必须的。SSL是网景公司提出来的安全保密协议,在浏览器和web服务器之间构造安全通道来进行数据传输,SSL运行在TCP/IP层与应用层之间,为应用层提供加密数据通道。它采用了RC4,MD5,以及RSA等加密算法,使用40位的秘钥,适用于商业信息的加密。

HTTPS协议就是使用SSL在发送方把原始数据进行加密,然后在接收方进行解密,加密和解密需要发送方和接收方通过交换公知的秘钥来实现。因此所传输的数据不容易被黑客截获并解密。但是也正是因为多了这么些处理,加密和解密的过程是需要消耗系统大量的开销的,严重降低机器的性能。只有http工作效率的10%,所以https一般在安全性较强的情况下用。因为一般来说不是所有的数据都要那么高的安全保密级别。。通常在支付系统,银行系统对账户信息要求会比较高,会采用https。

1http请求包里都有什么

http 数据包

http的请求由四个部分构成,请求行,请求头,空行和请求数据。

请求行

请求行,由三部分组成, 请求方法 请求url http版本,他们是用空格符号分开的。比如 GET /index.html HTTP/1.1

其中请求方法是个比较重要的点,有8种。

get:向特定的资源发出请求,一般用于数据截获,他只会获取资源,并不会对资源进行更改,不会影响资源的状态。

    get请求一般是以查询字符串的形式附在URL里面,如果数据是英文字母或者数字的话,原样发送,如果是空格的话,转换为+,如果是中文的话或者其他字符的话,就直接把字符进行base64加密,得出如 %E4%BD%A0%E5%A5%BD ,存在一定的安全隐患。

         get提交的数据大小是有限的,因为get是通过URL来进行提交数据,那么,get可提交的数据限制就直接跟URL的长度有直接的欢喜。然而在事实上,URL不存在参数上限的问题,但是,IE等浏览器,自行对其进行了限制。

post:向指定的资源提交数据进行处理请求,比如提交表单或者上传文件。 数据被包含在请求体中,post请求可能会导致新的资源的创建或者已有资源的修改。

        根据http规范,post表示可能修改服务器上的资源的请求。

        post是将表单中的数据放在from的数据体中,表单中的参数值是通过 request body发送给服务器,post的所有操作对于用户而言是不可见的,。

        post理论上是没有限制的,可以大量的传输数据。



put:用于向服务器发送请求,如果URL不存在,则要求服务器根据请求创建资源,如果存在,服务器就接收请求内容,并修改url原始版本。

delete:请求服务器删除request-url所表示的资源。

connect:http/1.1协议中预留给能够将连接改为管道方式的代理服务器。

head:向服务器索要与get请求相一致的响应,只不过响应体不会被返回。这一方法可以在不必传输整个应用内容的情况下,就可以获取包含在响应消息头中的元信息。

oprions:返回服务器针对特定资源所支持的http请求方法,也可以利用向web服务器发送的 '*'请求来进行测试,服务器的功能性。

delete:请求服务器删除request-url 所标识的资源。

get,put,post,delete

  • get请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。
  • put 是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。
  • post同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。
  • delete就是用来删除某一个资源的,该请求就像数据库的delete操作。

请求行的三大元素,只讲方法即可。其余的url和http版本,很简单。

请求头标

请求头标由关键字/键值对组成,每行一对,关键字和值用冒号分开

请求头标通知服务器有关于客户端的功能和标识,典型的请求头有,User-Agent客户端厂家和版本

Accept 客户端可识别的内容类型列表

Content-Length附加到请求的数据字节数。

空行

最后一个请求头标之后是一个空行,发送回车符和退行通知服务端以下不再有头标

请求数据

使用post传送数据,最常用的是content-type 和 content-length头标。


2http响应包里面有什么

web服务器解析请求,定位指定资源,服务器将资源副本写至套接字,在此处由客户端读取。一个响应由四个部分组成,状态行,响应头标, 空行,响应数据。

状态行

状态行由三个标记组成, Http版本,响应代码和响应描述。

http版本指的是,向客户端知名其可理解的最高版本

响应代码,3位的数字代码,之处请求的成功或者失败,如果失败会给出原因。

响应描述:为相应代码的可读性解释。

其中响应代码有下面的规则:

1xx 信息,请求收到了,继续处理

2XX 成功,行为被成功接收理解和采纳

3XX 重定向,为了完成请求,必须进一步执行的动作

4XX 客户端错误,请求包含语法错误或者请求无法实现

5XX 服务端错误,服务器不能实现一种明显无效的请求。

响应头标

就像请求头标一样,之处服务器的功能,标识出响应数据的细节。

空行

最后一个响应头标之后是一个空行,发送回车符和退行,表明服务器以下不会再有头标。

响应数据

HTML文档和图像等,也就是HTML本身。

Http模型是无状态的,表明在处理一个请求的时候,Web服务器并不会记住来自同一客户端的请求。

更多具体的规则请看链接中的文章。

3 http是如何连接服务端的

android网络通信之-Http(Android操作HTTP实现与服务器通信)

首先先简略说一下,一个硬件如何和另外一个硬件进行数据传输。截图如下


好吧,物理层面的目前就这些吧。也就是数据通过了咱们的一些物理方面的原因传到了其他设备上。

那么看看软件层面。就拿http说。http是手机联网常用的协议之一,是建立在TCP协议之上的一种协议。

http最显著的特点就是客户端发送的每次请求都需要服务端回送响应,请求结束后就会主动释放。因此,http具有短连接无状态的特性。那么如果要保持客户端程序的在线状态的话,就需要不断地向服务器发送连接请求。即使不需要获取任何数据,每隔一段时间就要像服务器发送所谓的保持连接的请求,来让服务端知道客户端实则是在线的。对于服务端如果长时间没有接到客户端的请求,认定是下线,,对于客户端,长时间接不到服务端的回复,认为是网络断开。

涉及代码:

private void post(){
    try{
        URL url = new URL(mMsgContent.url);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        //設置輸入流採用字节流
        connection.setDoInput(true);
        //设置输出流采用字节流
        connection.setDoOutput(true);
        //设置post
        connection.setRequestMethod("POST");
        //post是不允许缓存的
        connection.setUseCaches(false);
        //设置meta参数
        connection.setRequestProperty("Content-Type", "application/x-www-urlrncode");
        connection.setRequestProperty("Charset", "utf-8");
        //连接服务端发送消息
        connection.connect();

        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
        outputStream.writeBytes("param" + URLEncoder.encode("卡卡", "utf-8"));
        //清空缓存
        outputStream.flush();
        outputStream.close();


        //接收工作开始
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        StringBuilder resut = new StringBuilder("");
        String nextLine = null;
        if ((nextLine = bufferedReader.readLine()) != null) {
            resut.append(nextLine);
        }

        bufferedReader.close();
        connection.disconnect();
    }catch (Exception e) {
        e.printStackTrace();
    }
}

private void get(){
    try {
        URL url = new URL(mMsgContent.url);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStreamReader reader = new InputStreamReader(connection.getInputStream());//向服務器發送消息
        BufferedReader bufferedReader = new BufferedReader(reader);
        StringBuilder stringBuilder = new StringBuilder("");
        String readLine = null;
        while ((readLine = bufferedReader.readLine()) != null) {
            stringBuilder.append(readLine);
        }
        //關閉輸入流
        reader.close();
        //斷開連接
        connection.disconnect();
    }catch (Exception e) {
        e.printStackTrace();
    }
}

static class Content {
    public String url = "";
    enum  HttpMethod {GET, POST};
    public HttpMethod mMethod = HttpMethod.GET;
}

当然还有另外的API也可以完成这个操作。叫httpClient。这种不多做讨论了就。






















猜你喜欢

转载自blog.csdn.net/weixin_28774815/article/details/80880696