JavaWeb~带你了解HTTP

目录

一.URL及协议

二.urlencode和urldecode

三.HTTP协议格式

四.HTTP的请求方法(get和post)

Q:Get和Post的区别?

五.HTTP的状态码

六.HTTP的头信息(Header)


一.URL及协议

  • url中的请求数据:请求路径?key1=value&key2=value2

1).网络数据传输,都需要使用同样的协议,双方约定好的统一规范(封装和解析数据格式规范)

        协议:数据格式的约定

        目标:学习http协议里面的格式,结合理论实操,进行程序调试

        http协议格式本身+http数据(数据中包含自己的数据格式)

2).再次回顾URL

  1. 域名:基于DNS解析为IP
  2. IP:网络中定位主机的地址(逻辑地址)
  3. PORT:端口号,定位某个主机中唯一的进程(应用程序)
  4. http请求的访问路径:

                服务路径定位资源

                url是全路径(绝对路径)

                uri包含了url这种全路径,还包含相对路径,应用上下文是uri,服务路径是uri,两者加在一起也是uri,都是相对路径

特殊的注意事项:输入域名进行访问,其实是访问/这个路径的资源,/也有资源?

浏览器中,不输入端口号,是因为http协议的默认端口是80


二.urlencode和urldecode

 / ? : 中文等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现。

比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义。

转义的规则如下:

        将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式

"+" 被转义成了 "%2B"

urldecode就是urlencode的逆过程

urlencode工具

注:有时候显示的是中文,但是实际上都是%XY的形式进行传输的

  • 所以,项目路径尽量避免中文


三.HTTP协议格式

HTTP请求

  • 首行: [方法] + [url] + [版本]
  • Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  • Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度;

 

HTTP响应

  • 首行: [版本号] + [状态码] + [状态码解释]
  • Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
  • Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.

 

常见的Http工具

  1. 抓包工具:fiddler,charles,浏览器自带的开发者工具
  2. http请求模拟工具:postman

四.HTTP的请求方法(get和post)

Q:Get和Post的区别?

  • 1.请求形式

get的请求数据只能放在url中,post的数据可以放在url和请求体中

  • 2.传输数据的大小

get方法传输的数据量会受到限制,虽然在HTTP协议中没有硬性限制,但是特定的服务器和浏览器对url的长度有限制,而get是通过url传输数据的,所以会因此受到限制,一般传输数据量不超过2KB

post方法理论上没有限制,实际上post能传输的数据量取决于服务器的设置和内存大小

总的来说,get的传输数据量会受到限制,post的数据量则可以很大

  • 3.传输数据的类型

get方法只允许传输ascii码字符(就是想要传中文要转码),post方法则无限制,也允许二进制数据

  • 4.安全性

get传输的参数安全性低,因为数据会显示在url中,所有人可见,而且会被缓存和保留在浏览器历史中;post的数据则不会显示在url中,并且参数不会被缓存和保存在浏览器历史或者web服务日志中。

什么时候用get,什么时候用post呢?

1.有安全性要求的话,用post

2.如果有中文,用post好一点,用get由于只能传输ascii码,还要进行编码和解码的操作


五.HTTP的状态码

  • 这些状态码是服务端返回给用户端状态码,是服务端自己设置的,这些状态码的含义都是站在服务端的角色上看的,在用户端的角色上就不一定。比如200在服务端是正确的,但是客户端受到的数据不一定是他们想要的正确的数据

  • 400错误包括http协议格式,请求数据的格式,数据类型等错误

  • 服务端通过uri和(资源/服务)建立映射关系(大小写敏感),根据uri去找,找不到

  • uri已经映射到了,但是服务端提供的请求方法(如get,post方法),不包含客户端的请求的方法(如来了一个poooo方法)

  • 一般是服务端抛异常的时候


六.HTTP的头信息(Header)

  • Content-Type: 数据类型(text/html等)——(消息体body的格式,告诉对方该用什么方式解析)
  • Content-Length: Body的长度——(消息体的长度)
  • Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
  • User-Agent: 声明用户的浏览器版本信息——(一般在请求体中,告诉服务端我客户端用的什么浏览器)
  • referer: 当前页面是从哪个页面跳转过来的;(在请求体中,告诉服务器当前页面是从哪里跳转过来的)
  • location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
  • Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值