JHHK

欢迎来到我的个人网站
行者常至 为者常成

15、HTTP(三)

目录

快速开始

一、常用请求方法

get
post
head
option

二、请求头字段

user-agent: 识别终端类型
Reference:这个请求是由哪个请求带来的 防止盗链
range:多线程断点下载
Content-Type: application/x-www-form-urlencoded 和 multipart/form-data(上传文件必须是这种+post)
Accept: 能够接受的响应内容类型。text/plain 或者 text/html 或者 json Connection:keey-alive:想要优先使用的连接类型
Cookie:使http的状态保留,比如存储sessionId

请求头有标准头也有非标准头,维基百科搜索headers

三、响应头字段

Content-Type:text/html;charset=utf-8 与 请求头的Accept字段呼应
Location:http://www.w3.org 用来重定向
Connection:close 针对该连接预期的选项与请求头的Connection呼应
Set-Cookie 与请求头的Cookie字段呼应

四、状态码

200:成功

302:重定向,重定向是后台人员控制的
304:就是服务器告诉客户端我这里没更新 你使用缓存就行.客户端一般会对HTML css静态资源进行缓存

401:缺乏身份验证
403:服务器有能力提供请求,但拒绝授权访问
404:服务器端无法找到所请求的资源

502:从上游服务器(如tomcat)中接收到的响应是无效的
503:服务器停机维护或者已超载

状态码后台人员是可以随意返回的

请求方法

RFC 7231, section 4: Request methods:描述了8种请求方法
GET、HEAD、POST、PUT、DELETE、CONNECT、OPTIONS、TRACE

RFC 5789, section 2: Patch method:描述了PATCH方法

GET 常用于读取的操作,请求参数直接拼接在URL的后面(浏览器对URL是有长度限制的)
POST 常用于添加、修改、删除的操作,请求参数可以放到请求体中(没有大小限制)
HEAD 请求得到与GET请求相同的响应,但没有响应体。
使用场景举例:在下载一个大文件前,先获取其大小,再决定是否要下载。以此可以节约带宽资源
OPTIONS 用于获取目的资源所支持的通信选项,比如服务器支持的请求方法
OPTIONS * HTTP/1.1
PUT 用于对已存在的资源进行整体覆盖
PATCH 用于对资源进行部分修改(资源不存在,会创建新的资源)
DELETE 用于删除指定的资源
TRACE 请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
CONNECT 可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道(tunnel);
可以用来访问采用了 SSL (HTTPS) 协议的站点

OPTIONS演示

LC:~ LC$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
^]
telnet> 
OPTIONS * HTTP/1.1

HTTP/1.1 400 
Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS
Content-Length: 0
Date: Mon, 04 Jan 2021 05:43:01 GMT
Connection: close

Connection closed by foreign host.

头部字段

头部字段可以分为4种类型

请求头字段(Request Header Fields) 有关要获取的资源或客户端本身信息的消息头
响应头字段(Response Header Fields) 有关响应的补充信息,比如服务器本身(名称和版本等)的消息头
实体头字段(Entity Header Fields) 有关实体主体的更多信息,比如主体长度(Content-Length)或其MIME类型
通用头字段(General Header Fields) 同时适用于请求和响应消息,但与消息主体无关的消息头

一、请求头字段

user-agent 识别终端类型,比如下载一个安装包,根据user-agent的不同提供不同平台的安装包
Reference 可以防止盗链,reference指定的域名不是我允许的域名,不响应
请求头有标准头也有非标准头,维基百科搜索headers
range:多线程断点下载

img img

q值越大,表示优先级越高
如果不指定q值,默认是1.0(1.0是最大值)

为什么请求头会传多个编码方式并且指定优先级?
因为有可能客户端支持的编码 后台不支持

img

二、响应头字段

img img img

如果服务器返回的文本为

response.setHeader("Content-Type","text/html;charset=UTF-8");
response.getWriter().write("<h1 style=\"color:red\">登录成功!!!</h1>");

img

如果服务器返回的文本为

response.setHeader("Content-Type","text/plain;charset=UTF-8");
response.getWriter().write("<h1 style=\"color:red\">登录成功!!!</h1>");

img

状态码(Status Code)

一、状态码 在RFC 2616 10.Status Code Definitions规范中定义
状态码指示HTTP请求是否已成功完成

状态码可以分为5类
信息响应:100~199
成功响应:200~299
重定向:300~399
客户端错误:400~499
服务器错误 :500~599

二、常见状态码

100 Continue 请求的初始部分已经被服务器收到,并且没有被服务器拒绝。
客户端应该继续发送剩余的请求,如果请求已经完成,就忽略这个响应
允许客户端发送带请求体的请求前,判断服务器是否愿意接收请求(服务器通过请求头判断)
在某些情况下,如果服务器在不看请求体就拒绝请求时,客户端就发送请求体是不恰当的或低效的
200 OK 请求成功
302 Found 请求的资源被暂时的移动到了由Location头部指定的URL上
304 Not Modified 说明无需再次传输请求的内容,也就是说可以使用缓存的内容
400 Bad Request 由于语法无效,服务器无法理解该请求
401 Unauthorized 由于缺乏目标资源要求的身份验证凭证
403 Forbidden 服务器端有能力处理该请求,但是拒绝授权访问
404 Not Found 服务器端无法找到所请求的资源
405 Method Not Allowed 服务器禁止了使用当前HTTP方法的请求
406 Not Acceptable 服务器端无法提供与Accept-Charset以及Accept-Language指定的值相匹配的响应
408 Request Timeout 服务器想要将没有在使用的连接关闭
一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下
500 Internal Server Error 所请求的服务器遇到意外的情况并阻止其执行请求
501 Not Implemented 请求的方法不被服务器支持,因此无法被处理
服务器必须支持的方法(即不会返回这个状态码的方法)只有 GET 和 HEAD
502 Bad Gateway 作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
503 Service Unavailable 服务器尚未处于可以接受请求的状态
通常造成这种情况的原因是由于服务器停机维护或者已超载

form提交

action:请求的URI
method:请求方法(GET、POST)
enctype:POST请求时,请求体的编码方式
application/x-www-form-urlencoded(默认值)
用&分隔参数,用=分隔键和值,字符用URL编码方式进行编码 multipart/form-data
文件上传时必须使用这种编码方式

一、使用默认值

请求头
Content-Type: application/x-www-form-urlencoded

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/test/login" method="post" enctype="application/x-www-form-urlencoded">
    <div>用户名<input type="text" name="username"></div>
    <div>密 码<input type="text" name="password"></div>
    <button type="submit">登录</button>
</form>
</body>
</html>
POST /test/login HTTP/1.1
Host: localhost:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Referer: http://localhost:8080/test/login.html
Content-Length: 25
Cookie: JSESSIONID=8659B528E94575790C24FF65FCD22A44

username=123&password=456

二、使用multipart/form-data方式

参考RFC 1521

img

请求头
Content-Type: multipart/form-data; boundary=xxx

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/test/login" method="post" enctype="multipart/form-data">
    <div>用户名<input type="text" name="username"></div>
    <div>密 码<input type="text" name="password"></div>
    <button type="submit">登录</button>
</form>
</body>
</html>

请求报文

POST /test/login HTTP/1.1
Host: localhost:8080
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryDVASM7rilHOKLYzd
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Referer: http://localhost:8080/test/login.html
Content-Length: 240
Cookie: JSESSIONID=8659B528E94575790C24FF65FCD22A44

------WebKitFormBoundaryDVASM7rilHOKLYzd
Content-Disposition: form-data; name="username"

123
------WebKitFormBoundaryDVASM7rilHOKLYzd
Content-Disposition: form-data; name="password"

456
------WebKitFormBoundaryDVASM7rilHOKLYzd--

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.