Http协议基本知识

一,http协议简介

超文本传输协议,提供一种发布和接受HTML页面的方法。

 其中我们应该知道的是两个协议格式。客户端发送到服务器的请求协议,服务器发送给客户端的响应协议。

http的特点是:

  http是基于请求/响应模式的

  http是无状态协议

(http是一个客户端服务端请求和应答标准,默认端口都为80端口

URL:统一资源定位器,它包括:      协议名://域名:端口/路径。

二,请求协议

请求协议的格式:

  请求首行://请求方式,请求路径,协议版本。GET方式     /favicon.ico路径       HTTP/1.1协议版本

  请求头信息://请求头名称:请求头内容,即为key:value键值对格式   Host: 127.0.0.1:9000

  空行://用来与请求体分隔开

  请求体://get方式没有请求体,POST方式有请求体

 

2,GET请求

  HTTP默认的请求方法是GET

    没有请求体

    数据必须在1K内

    GET请求数据会暴露在浏览器的地址栏中

  GET请求常用操作:

    1.在浏览器的地址栏中直接给出URL

    2.点击页面上道德超链接也一定是GET请求

    3.提交表单是,表单默认使用GET请求,也可设置为POST方式

  GET操作的集体信息

   
GET 127.0.0.1:8090/login HTTP/1.1:GET请求,请求服务器路径为 127.0.0.1:8090/login ,协议为1.1
Host:localhost:请求的主机名为localhost;
*User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0:与浏览器和OS相关的信息。有些网站会显示用户的系统版本和浏览器版本信息,这都是通过获取User-Agent头信息而来的;
Accept: text
/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8:告诉服务器,当前客户端可以接收的文档类型,其实这里包含了*/*,就表示什么都可以接收;
Accept
-Language: zh-cn,zh;q=0.5:当前客户端支持的语言,可以在浏览器的工具选项中找到语言相关信息
Accept
-Encoding: gzip, deflate:支持的压缩格式。数据在网络上传递时,可能服务器会把数据压缩后再发送;
Accept
-Charset: GB2312,utf-8;q=0.7,*;q=0.7:客户端支持的编码;
Connection: keep
-alive:客户端支持的链接方式,保持一段时间链接,默认为3000ms;
Cookie: JSESSIONID
=369766FDF6220F7803433C0B2DE36D98:因为不是第一次访问这个地址,所以会在请求中把上一次服务器响应中发送过来的Cookie在请求中一并发送去过;这个Cookie的名字为JSESSIONID。

 

3,POST请求 

  post请求的特点:

    数据不会出现在地址栏中

    数据的大小没有上限

    有请求体

    请求体中如果存在中文,会使用URL编码

  http协议中参数的传递是使用键值对的方式进行传输,如果有多个键值对情况下需要用&进行分割。这样服务端在收到这样的的字符串的时候会先使用&进行分割键值对然后使用=分割参数值。

 

POST请求是可以有体的,而GET请求不能有请求体。

 

  • Referer: http://localhost:8080/hello/index.jsp请求来自哪个页面,例如你在百度上点击链接到了这里,那么Referer:http://www.baidu.com;如果你是在浏览器的地址栏中直接输入的地址,那么就没有Referer这个请求头了;
  • Content-Type: application/x-www-form-urlencoded表单的数据类型,说明会使用url格式编码数据;url编码的数据都是以“%”为前缀,后面跟随两位的16进制。
  • Content-Length:13请求体的长度,这里表示13个字节。
  • keyword=hello请求体内容!hello是在表单中输入的数据,keyword是表单字段的名字。

 

 Referer头的使用,可以统计网站访问信息,可以用来防盗链。

三,响应协议

  响应协议格式:

    响应首行

    响应头信息

    空行

    响应体

响应内容是由服务器发送给浏览器的内容,浏览器会根据响应内容来显示。遇到<img src=''>会开一个新的线程加载,所以有时图片多的话,内容会先显示出来,然后图片才一张张加载出来


  • HTTP/1.1 200 OK响应协议为HTTP1.1,状态码为201,表示请求成功,OK是对状态码的解释;
  • Server:WSGIServer/0.2 CPython/3.5.2:服务器的版本信息;
  • Content-Type: text/html;charset=UTF-8响应体使用的编码为UTF-8
  • Content-Length: 724响应体为724字节;
  • Set-Cookie: JSESSIONID=C97E2B4C55553EAB46079A4F263435A4; Path=/hello响应给客户端的Cookie

 

 

3.2 状态

响应头对浏览器来说很重要,它说明了响应的真正含义。例如200表示响应成功了,302表示重定向,这说明浏览器需要再发一个新的请求。

  • 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
  • 404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
  • 500:请求资源找到了,但服务器内部出现了错误;
  • 302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;
  • 解析状态码在HTTP中的应用

 

一个简单的服务端示例代码:

#服务端代码示例
import socket

sock = socket.socket()

sock.bind(("127.0.0.1",9000))

sock.listen(5)

while True:
    conn,addr = sock.accept()

    data=conn.recv(1024)
    print(data.decode("utf8"))
    with open("server_test.html",encoding="utf8") as f:
        data=f.read()
        conn.send(b"HTTP/1.1 201 OK\r\n\r\n %s" %data.encode("utf8"))

    conn.close()

#服务端html页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是一个测试段</title>
</head>
<h1>测试语句</h1>
<body>测试段内容,显示信息确认页面读取正常<br>
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495439831&di=36446826d88460cfa0c7662d8bac6e1a&imgtype=jpg&er=1&src=http%3A%2F%2F5.26923.com%2Fdownload%2Fpic%2F000%2F322%2F855cf0bca1a9b9e3067b8a575b430f26.jpg">

</body>
</html>

http传输协议传输数据都是bytes数据,一定要注意文件读取时编解码问题。

 

 

posted @ 2017-05-15 16:11  左岸边  阅读(398)  评论(0编辑  收藏  举报