HTTP 格式
请求:
GET /more HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
- 请求行
- 请求标头
- 空行
- 请求体
响应:
HTTP/1.1 200 OK
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Sat, 02 Oct 2021 08:14:53 GMT
Expires: Sat, 02 Oct 2021 08:14:53 GMT
Server: BWS/1.1
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
{"code":200,"notice":0,"follow":0,"forward":0,"msg":0,"comment":0,"pushMsg":null}
- 状态行
- 响应标头
- 空行
- 响应体
Http/2
伪头部字段
伪头部字段是http2内置的几个特殊的以”:”开始的key,用于替代HTTP/1.x中请求行/响应行中的信息,比如请求方法,响应状态码等,内置的伪头部字段列表如下:
:method # GET/POST....
:scheme # http/https
:authority # Host
:path # Url
:status # 200/404
Https
非对称加密
https://blog.csdn.net/howeres/article/details/112387222
非对称加密是单向的加解密。
Http+SSL
Https在TCP连接建立后,还需SSL协议握手,成功后才发起请求,其余和http一致,http只需TCP建立连接后就可以发起请求。
CA(Certification Authority 签发证书、认证证书、管理已颁发证书的机关)
SSL校验:服务端单方面使用非对称加密,然后客户端产生一个随机数用服务端公钥加密返回给服务端。然后双方就使用该随机数对称加密进行通信。
主要分三步:
- 客户端向服务器端索要证书并验证公钥;
- 双方协商生成"对话密钥";
- 双方采用"对话密钥"进行加密通信;
其中,证书保证了公钥的可信与安全;公钥保证了“对话秘钥”传输的安全,对话秘钥保证了通信报文的安全。
一般打开网页显示:您的连接不是私密连接;一种可能就是网站返回的证书,浏览器去CA验证发现不一致。
还有一种情况,能打开发现没有锁标志,这是因为https的网页里面含有非https的连接(既http连接)
RFC:请求意见稿(英语:Request for Comments,缩写:RFC),又翻译作意见征求,意见请求,请求意见稿是由互联网工程任务组(IETF)发布的一系列备忘录。文件收集了有关互联网相关信息,以及UNIX和互联网社群的软件文件,以编号排定。
2xx 都代表成功(那没事了)
3xx 都代表重定向(redirect, 请求两次)
4xx 都代表资源未找到,启动失败(我方)
5xx 都代表服务器内部错误,或错误代码(服务端)
Spring 框架下发送请求
URL 格式
protocol://hostname[:port]/path/[?query]#fragment
- query 查询参数, 请求时携带的参数, 用
&
隔开, 名和值用=
隔开. - fragment 喵点, 指定网络资源中的片段, 如定位到网页中的某一名词解释, 又或者网页滚动的位置.
使用 RestTemplate 发送请求
RestTemplate restTemplate = new RestTemplate();
String url = "https://www.baidu.com/s";
// 1. POST 表单要使用 MultiValueMap 而非普通的 HashMap
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
paramMap.add("para1", "001");
paramMap.add("para2", "002");
String responseBody = restTemplate.postForObject(url, paramMap, String.class);
// 2. path
URI http = // 占位符形似
UriComponentsBuilder.newInstance()
.scheme("http")
.host("example.com")
.path("/hotels/{hotel}/bookings/{booking}")
.build()
.expand("42", "21")
.encode()
.toUri();
// 3. getParam
// UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
// builder.queryParam("wd", "hello world");
// URI uri = builder.build().encode().toUri();
URI uri = // get参数形式(仅)
UriComponentsBuilder.fromHttpUrl(url)
.queryParam("wd", "hello world")
.build()
.encode()
.toUri();
// HttpEntity 包含 { headers: 实体标头 | body: 实体主体 } <请求体类型>
// ResponseEntity 也是一种 HttpEntity
HttpEntity<?> entity = new HttpEntity<>(new Object(),new HttpHeaders());
ResponseEntity<String> response =
restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
String body = response.getBody();
// 4. JDK 自带 URLEncoding 转换 (!!!需要注意别把 "http://../../" 也给encode了)
URLEncoder.encode(token, StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20");
三次握手
双方需要维护一个序号;
买东西要先下单, 再付款;