HTTP 请求格式与RestTemplate

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
  1. 请求行
  2. 请求标头
  3. 空行
  4. 请求体

响应:

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}
  1. 状态行
  2. 响应标头
  3. 空行
  4. 响应体

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校验:服务端单方面使用非对称加密,然后客户端产生一个随机数用服务端公钥加密返回给服务端。然后双方就使用该随机数对称加密进行通信。

主要分三步:

  1. 客户端向服务器端索要证书并验证公钥;
  2. 双方协商生成"对话密钥";
  3. 双方采用"对话密钥"进行加密通信;

其中,证书保证了公钥的可信与安全;公钥保证了“对话秘钥”传输的安全,对话秘钥保证了通信报文的安全。

一般打开网页显示:您的连接不是私密连接;一种可能就是网站返回的证书,浏览器去CA验证发现不一致。

还有一种情况,能打开发现没有锁标志,这是因为https的网页里面含有非https的连接(既http连接)

RFC:请求意见稿(英语:Request for Comments,缩写:RFC),又翻译作意见征求,意见请求,请求意见稿是由互联网工程任务组(IETF)发布的一系列备忘录。文件收集了有关互联网相关信息,以及UNIX和互联网社群的软件文件,以编号排定。

2xx 都代表成功(那没事了)
3xx 都代表重定向(redirect, 请求两次)
4xx 都代表资源未找到,启动失败(我方)
5xx 都代表服务器内部错误,或错误代码(服务端)

Spring 框架下发送请求

URL 格式

protocol://hostname[:port]/path/[?query]#fragment
  1. query 查询参数, 请求时携带的参数, 用&隔开, 名和值用=隔开.
  2. 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");

三次握手

双方需要维护一个序号;
买东西要先下单, 再付款;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值