网络问题处理
浏览器在访问钉钉开发文档的时候很慢
第一眼以为请求走的是代理。
通过 chrome 的控制台,查看这个页面有哪些请求。
通过检查 clash 设置后发现,所有的请求都是直连。
最后发现,是因为使用的禁用缓存插件,导致每次请求都下载 js 等静态资源。
通过 postman 请求返回乱码
1、postmand 端处理
curl --location 'http://dd:8080/sjjk/region'
postman 添加 Accept: application/json;charset=UTF-8
请求头即可。
curl --location 'http://dd:8080/sjjk/org' \
--header 'Accept: application/json;charset=UTF-8'
2、服务端处理
@RequestMapping("/region")
@ResponseBody
public String region() throws IOException {
InputStream in = ActionSjjk.class.getResourceAsStream("/sjjk/region.json");
try {
return StreamUtils.copyToString(in, StandardCharsets.UTF_8);
}finally {
in.close();
}
}
springboot 代码加入 produces = "application/json;charset=UTF-8"
@RequestMapping(value = "/region", produces = "application/json;charset=UTF-8")
@ResponseBody
public String region() throws IOException {
InputStream in = ActionSjjk.class.getResourceAsStream("/sjjk/region.json");
try {
return StreamUtils.copyToString(in, StandardCharsets.UTF_8);
}finally {
in.close();
}
}
请求 https 地址时报错
报错信息 : PKIX path building failed
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1496)
... 96 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)
... 102 more
问题排查过程
- 通过浏览器访问 https 地址,查看是谁颁发的证书
- 如果是自签发的证书,需要将证书加到 jdk 的信任列表中
- 如果是信任的机构颁发的,则需要通过域名访问(可以在 hosts 单独配置一条 host 记录)
问题原因
请求的 https 地址所使用的证书是自签发的,没有在 jdk 的信任列表中。
将自签发证书导入到 jdk 的信任列表
- 通过下面的命令查看问题
java SSLPoke baidu.com 443
- 执行脚本
# 导入证书到 jdk 的信任列表中
./java-cert-importer.sh baidu.com 443
# 删除证书
./java-cert-importer.sh baidu.com 443 -d
- 验证证书是否导入成功
java SSLPoke baidu.com 443
HTTP 状态码
1xx:信息性状态码,指示请求已被接收并继续处理。
100 Continue:服务器已接收请求的初始部分,客户端应继续发送剩余部分。
101 Switching Protocols:服务器要求客户端切换协议。
2xx:成功状态码,指示请求已成功被接收、理解、并接受。
200 OK:请求成功,返回请求的数据。
201 Created:请求成功并且服务器创建了新的资源。
204 No Content:请求成功,但没有返回任何内容。
3xx:重定向状态码,指示需要客户端采取进一步的操作才能完成请求。
301 Moved Permanently:请求的资源已永久移动到新位置。
302 Found:请求的资源暂时移动到其他位置。
304 Not Modified:客户端的缓存资源是最新的,无需重新传输。
4xx:客户端错误状态码,指示请求包含语法错误或无法完成请求。
400 Bad Request:请求有语法错误或参数错误。
401 Unauthorized:请求需要用户身份验证。
403 Forbidden:禁止访问。
404 Not Found:请求的资源不存在。
5xx:服务器错误状态码,指示服务器在处理请求时发生了错误。
500 Internal Server Error:服务器遇到了未知的错误。
503 Service Unavailable:服务器暂时无法处理请求,可能是过载或维护中。
504 Gateway Timeout:服务器作为网关或代理,未及时从上游服务器收到请求的响应。
400
- bad request 意思是 "错误的请求";
- invalid hostname 意思是 "不存在的域名"。
bad request
1、请求 URL 中包含特殊字符 {}
http://localhost:12581/ei/taskdesign.do?action=importport&filetype=json&taskid={654c76d6-ce5c-bbdd-cb35-2cdec155099e}
需要对 taskid
进行 encodeURI(taskid)
转义
invalid hostname