Http协议

Http协议

1. 引入:

    为什么需要http协议?

    我们使用浏览器进行浏览网页是需要浏览器与服务器来进行数据交换的,而当前在市场上的服务器和浏览器的种类多样,如果不规定一个统一的标准,那么两者之间的数据交换将十分不方便,针对不同的浏览器和服务器就要开发不同的代码,所以http协议因此而诞生了。

2. 什么是http协议

http协议: 对浏览器客户端 和  服务器端 之间数据传输的格式规范

2.1  怎么查看http协议的内容?

   使用谷歌浏览器的审查元素功能(右键 >审查元素)

或者火狐的插件(右键>firebug>网络)

例如谷歌浏览器中输入http://localhost:8080/

打开审查元素会有以下信息返回。

 

2.2 http协议的内容:

请求(浏览器-》服务器)

GET /day09/hello HTTP/1.1               -请求行

请求头:(由多个键值对组成)

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Accept-Encoding:gzip, deflate, br

Accept-Language:zh-CN,zh;q=0.9

Connection:keep-alive

Cookie:JSESSIONID=38BAE7598662AC856055EC1A2D445C31

Host:localhost:8080

Upgrade-Insecure-Requests:1

User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36

name=eric&password=123456             --实体内容(post请求才有,get请求在请求行中)

响应(服务器-》浏览器)

响应头

Content-Length:623

Content-Type:text/html;charset=ISO-8859-1

Date:Sun, 19 Nov 2017 11:39:36 GMT

Server:Apache-Coyote/1.1

3 Http请求

URL:  统一资源定位符。http://localhost:8080/day09/testImg.html。只能定位互联网资源。是URI的子集。

URI: 统一资源标记符。/day09/hello。用于标记任何资源。可以是本地文件系统,局域网的资源(//192.168.14.10/myweb/index.html),可以是互联网资源。

#请求方式

常见的请求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE 常用的请求方式: GET  和 POST

表单提交:

<form action="提交地址" method="GET/POST">

<form>

GET   vs  POST 区别

      1)GET方式提交

           a)地址栏(URI)会跟上参数数据。以?开头,多个参数之间以&分割。

GET /day09/testMethod.html?name=eric&password=123456 HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Referer: http://localhost:8080/day09/testMethod.html

Connection: keep-alive

          b)GET提交参数数据有限制,不超过1KB。

          c)GET方式不适合提交敏感密码。

         d)注意: 浏览器直接访问的请求,默认提交方式是GET方式

                 

    2)POST方式提交

            a)参数不会跟着URI后面。参数而是跟在请求的实体内容中。没有?开头,多个参数之间以&分割。

POST /day09/testMethod.html HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Referer: http://localhost:8080/day09/testMethod.html

Connection: keep-alive

name=eric&password=123456

           b)POST提交的参数数据没有限制。

           c)POST方式提交敏感数据。

#请求头键值对代表的信息

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8                    --浏览接受的数据类型

Accept-Encoding:gzip, deflate, br    --浏览器接受的数据压缩格式           

Accept-Language:zh-CN,zh;q=0.9   --浏览器接受的语言

Connection:keep-alive             --是否连接服务器

Cookie:JSESSIONID=38BAE7598662AC856055EC1A2D445C31

-- 浏览器保存的cookie信息

Host:localhost:8080           --当前请求访问的目标地址

Upgrade-Insecure-Requests:1    

User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36  --浏览器类型

4. 实体内容

只有post请求才有实体内容

5. HttpServletRequest对象

HttpServletRequest对象作用是用于获取请求数据。服务器把请求数据封装到此对象中,再把此对象传入servlet中便于servlet获取请求数据。

    核心的API:

      获取请求行信息:

request.getMethod();   请求方式

               request.getRequetURI()    请求资源

               request.getProtocol()   请求http协议版本

                           

获取请求头信息:

            request.getHeader("名称")   根据请求头获取请求值

            request.getHeaderNames()    获取所有的请求头名称

获取实体内容:

           request.getInputStream()   获取实体内容数据

6. Http响应

HTTP/1.1 200 OK                --响应行

Server: Apache-Coyote/1.1         --响应头(key-vaule)

Content-Length: 24

Date: Fri, 30 Jan 2015 01:54:57 GMT

                                   --一个空行

this is hello servlet!!!                  --实体内容

6.1 响应行

                #http协议版本

                    #状态码: 服务器处理请求的结果(状态)

           常见的状态:

                     200 :  表示请求处理完成并完美返回

                    302:   表示请求需要进一步细化。
                    404:   表示客户访问的资源找不到。

                    500:   表示服务器的资源发送错误。(服务器内部错误)

                           

      6.2 常见的响应头

Location: http://www.it315.org/index.jsp   -表示重定向的地址,该头和302的状态码一起使用。

Server:apache tomcat                 ---表示服务器的类型

Content-Encoding: gzip                 -- 表示服务器发送给浏览器的数据压缩类型

Content-Length: 80                    --表示服务器发送给浏览器的数据长度

Content-Language: zh-cn               --表示服务器支持的语言

Content-Type: text/html; charset=GB2312   --表示服务器发送给浏览器的数据类型及内容编码

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT  --表示服务器资源的最后修改时间

Refresh: 1;url=http://www.it315.org     --表示定时刷新

Content-Disposition: attachment; filename=aaa.zip --表示告诉浏览器以下载方式打开资源(下载文件时用到)

Transfer-Encoding: chunked

Set-Cookie:SS=Q0=5Lb_nQ; path=/search   --表示服务器发送给浏览器的cookie信息(会话管理用到)

Expires: -1                           --表示通知浏览器不进行缓存

Cache-Control: no-cache

Pragma: no-cache

Connection: close/Keep-Alive           --表示服务器和浏览器的连接状态。close:关闭连接 keep-alive:保存连接

7.HttpServletResponse对象

      HttpServletResponse对象修改响应信息:

响应行:

         response.setStatus()  设置状态码

响应头:

      response.setHeader("name","value")  设置响应头

实体内容:

      response.getWriter().writer();   发送字符实体内容

                                       response.getOutputStream().writer()  发送字节实体内容

总结:在servlet中,httpservlet对象负责封装http协议中请求的信息     ,servlet不能更改其中的信息,只能获取,而httpresponse对象专门用来设置响应数据,控制浏览器的状态。 

原文地址:https://www.cnblogs.com/ithome0222/p/7861973.html