Java开发之开源工具

标签: Java 分类: Java 创建时间:2019-09-18 08:25:47 更新时间:2024-11-15 10:49:43

在使用Java开发的时候,难免会用到别人写的若干的库,有些东西很小,但是很实用。

1.HttpClient

HttpClient主要用来进行http调用,简单方便,还能创建连接池,提高并发数和节约资源。在调用时,容易发生Read time out 异常。捕获方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**
* 发送Post请求
*
* @param httpPost
* @return
*/
private static String sendHttpPost(HttpPost httpPost) {

CloseableHttpClient httpClient = null;
CloseableHttpResponse response = null;
// 响应内容
String responseContent = null;
try {
// 创建默认的httpClient实例.
httpClient = getHttpClient();
// 配置请求信息
httpPost.setConfig(requestConfig);
// 执行请求
response = httpClient.execute(httpPost);
// 得到响应实例
HttpEntity entity = response.getEntity();

// 可以获得响应头
// Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE);
// for (Header header : headers) {
// System.out.println(header.getName());
// }

// 得到响应类型
// System.out.println(ContentType.getOrDefault(response.getEntity()).getMimeType());

// 判断响应状态
if (response.getStatusLine().getStatusCode() >= 300) {
throw new Exception(
"HTTP Request is not success, Response code is " + response.getStatusLine().getStatusCode());
}

if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
responseContent = EntityUtils.toString(entity, CHARSET_UTF_8);
EntityUtils.consume(entity);
}

}catch (SocketTimeoutException|ConnectTimeoutException ex){
logger.error("sendHttpPost请求超时");
responseContent="请求超时";
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 释放资源
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return responseContent;
}

问题

(1) 生僻字乱码
今天使用HttpClient库发起Get请求,出现了一个生僻字“騄”,返回前台之后就显示了乱码。

但是在浏览器中直接打开这个get请求,发现并不会出现乱码。

本来以及是SpringBoot返回的问题,设置了produces = “application/json;charset=utf-8”,还是不行。

解决方法,因为原始请求为gb2312编码

(1) 新建转换方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static String handleEntity(HttpEntity entity, String charset)
throws IOException {
if (entity == null)
return null;

ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];

long count = entity.getContentLength();
long curCount = 0;
int len = -1;
InputStream is = entity.getContent();
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
curCount += len;
}

byte[] data = outStream.toByteArray();
outStream.close();
is.close();
return new String(data, charset);
}

(2) 将EntityUtils.toString(entity,”utf-8”),改为handleEntity(entity,”gbk”)

1
2
// responseContent = EntityUtils.toString(entity,"GBK");
responseContent=handleEntity(entity,"gbk");
参考文章:
1.【Spring】解决 @ResponseBody返回中文字符串乱码以及生僻字被强制以unicode方式显示问题
2.Http请求返回结果报UnsupportedCharsetException (我使用了这个代码进行了EntityUtils.toString)
3.踩坑记:httpComponents 的 EntityUtils
4.EntityUtils.tostring 中文乱码
5.SpringBoot的restTemplate整合HttpClient连接池及配置 (这个是连接池相关的内容)
6.HttpClient在传参和返回结果的中文乱码问题 (这里有说明如何进行发送端配置请求编码格式)
7.java HttpClientUtil (这是我HttpClinetUtil的主要参考代码,说是参考,其实都是Copy过来的,也就是简单的做了下修改,至于源码到底是不是正确的,以及为什么正确的,我都没有深究)

2.org.apache.commons.lang

lang包可以用 RandomStringUtils.randomAlphanumeric(16) 生成16位的随机字符串,还包括了其他的有用的类和工具,常用的有ArrayUtils和StringUtils,具体可以参见 参考文章(1)

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>

3.JustAuth

我在研究使用 jeecg-boot 的时候,遇到了这个授权认证的组件,集成了超过13种的国内外通用平台的认证方式。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。