1.简介
Jodd是对于Java开发更便捷的开源迷你框架,包含工具类、实用功能的集合,总包体积不到1.7M,堪称是Java的"瑞士军刀"。
官网:https://jodd.org/
jodd的gitHub: https://github.com/oblac
2.Jodd提供的功能
2.1)提供操作Java bean,
2.2)可以从各种数据源加载 Bean,
2.3)简化 JDBC操作,
2.4)剖析 SQL 查询,
2.5)处理时间与日期,
2.6)操作格式化 String,
2.7)搜索本地硬盘上的文件,
2.8)帮助处理 Servlet 请求等。
2.9)包含一个很小但实用的基于JSP的MVC框架。
3.Jodd组成
3.1Jodd工具包
高性能的工具集合
-
TypeConverter 一个强大的类型转换工具
-
BeanUtil 高效的 Bean 工具,支持嵌套的属性,以及标准的集合类
-
Base64/Base32
-
JDateTime 增强的时间类
-
IO 快速高性能的各种 Buffer、Writer、OutputStream
-
Wildcard 通配符工具
-
Servlet Servlet 工具,JSP 的标签、函数扩展
-
FindFile/ClassFinder 强大的文件/类搜索工具,支持通配符&正则表达式匹配
-
Cache 简单易用的 LRU、LRU、FIFO 缓存
-
StringUtil 强大的字符串处理工具
3.2Madvoc
轻量级快速开发MVC框架
-
自动扫描 Actions & Results
-
参数自动注入,支持嵌套的属性注入,支持标准集合参数的注入
-
自动导出需要输出的参数
-
支持通配符/正则表达式路由地址
-
支持 REST 风格的 URL
-
支持通过配置文件设置 Action 的拦截器
-
开放的 API,可轻松扩展
3.3HTTP
轻量级Http客户端
-
基于socket
-
支持 cookies
-
支持上传文件
-
支持自定义 HTTP 头
-
支持 gzip
-
支持 Basic authentication
3.4Props
增强的properties
-
支持 UTF-8 编码
-
支持插值操作
-
支持 ini 类型的区段
-
支持使用 += 附加值
-
支持多行模式
3.5Email
易用的 Email 接收发送工具,基于 javax.mail
-
支持 SSL
-
支持添加附件
-
支持 POP3、IMAP
-
IMAP 接受模式支持定义过滤器
-
支持解析 EML 文件
3.6Petite
轻量级 IoC 容器
3.7Db & DbOom
轻量级 ORM 框架
3.8Lagarto
高性能的 xml/html 解析框架
3.9Jerry
HTML 解析框架,Java 中的 jQuery,基于 Lagarto
3.4.0VTor
基于注解的字段验证框架
可设置多配置
易扩展
3.4.1Proxetta
高性能的代理生成器
4.结构
4.1工具类模块:
jodd-core 一些工具类,包括 Printf、JDateTime、StringUtil、Fast buffers 等等
jodd-bean BeanUtil以及类型检查转换工具
jodd-props 更强大的Java Properties替代
jodd-email 更简单易用的e-mail收发
jodd-upload 处理HTTP上传
jodd-servlets 一些Servlet相关的工具类, 附带一套漂亮的JSP标签库
jodd-http 轻巧的HTTP客户端
4.2框架模块:
jodd-madvoc 一个轻量级MVC框架
jodd-petite 一个依赖注入容器
jodd-lagarto HTML/XML解析器,包含Jerry和CSSelly ,让你像jQuery一样筛选HTML节点
jodd-lagarto-web Lagarto的Web扩展,包含Decora、HtmlStapler等等
jodd-proxetta 帮你实现动态代理,获取函数参数名
jodd-dboom 数据库访问的轻量级封装,可看作一个简单的ORM
jodd-json JSON序列化、反序列化
jodd-vtor 一个基于注解的字段验证框架
5.使用jodd-http的一个bug
http调用的方式有很多种,比如Apache HttpCient工具包,OkHttps,RestTemplate,但是本文是Jodd的主场,以上方式就不在赘述。
5.1依赖
<dependency>
<groupId>org.jodd</groupId>
<artifactId>jodd-http</artifactId>
<version>5.0.2</version>
</dependency>
5.2jodd-http不支持“中文”的bug
"老外写的东西真是狗,连中文都不支持,还是国产的开源工具好用,就比如说Hutool",由于之前我对jodd有所了解,所以一次在项目中使用jodd-http模块跟同事对http的接口,项目对接调试中就遇到发送POST居然中文乱码了,然后有花了我一早上的时间去看了下它的源码,结果没我完美的解决了。
解决方案如下:
新增HttpRequestExtend类继承HttpRequest:
package xxxxx(包名放在自己的工程路径下);
import jodd.http.HttpRequest;
import jodd.net.HttpMethod;
import lombok.extern.slf4j.Slf4j;
import java.io.UnsupportedEncodingException;
import java.util.Base64;
/**
* @author zlf
* @description:
* @time: 2021/12/17 10:31
*/
@Slf4j
public class HttpRequestExtend extends HttpRequest {
public HttpRequestExtend() {
super();
}
public static HttpRequestExtend post(String destination) {
return (HttpRequestExtend) (new HttpRequestExtend()).method(HttpMethod.POST).set(destination);
}
@Override
public HttpRequest body(byte[] content, String contentType) {
Base64.Encoder encoder = Base64.getEncoder();
String body = null;
try {
body = new String(content, "UTF-8");
} catch (UnsupportedEncodingException var5) {
log.error("转码异常!");
}
//String encodedText = encoder.encodeToString(body.getBytes());
//log.info("base64编码数据为:{}",encodedText);
this.contentType(contentType);
return this.body(body);
}
/**
* 请求参数base64编码
* @param paramStr
* @return
*/
public String base64EncoderParamStr(String paramStr) {
Base64.Encoder encoder = Base64.getEncoder();
String encodedText = null;
try {
paramStr = new String(paramStr.getBytes(), "UTF-8");
} catch (UnsupportedEncodingException var5) {
log.error("转码异常!");
}
encodedText = encoder.encodeToString(paramStr.getBytes());
log.info("base64编码数据为:{}",encodedText);
return encodedText;
}
}
JoddHttpUtil类 :
package xxxxx(包名放在自己的工程路径下);
import com.alibaba.fastjson.JSON;
import jodd.http.HttpRequest;
import jodd.http.HttpResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/**
* @author zlf
* @version 1.0
* @date 2021/12/15 13:44
*/
@Component
@Slf4j
public class JoddHttpUtil {
/**
* 发送Get请求
*
* @param url : 请求的连接
* @param params :请求参数,无参时传null
* @return
*/
public static String sendGet(String url, Map<String, String> params) {
HttpRequest request = HttpRequest.get(url);
if (params != null) {
request.query(params);
}
HttpResponse response = request.send();
String respJson = response.bodyText();
return respJson;
}
/**
* 发送Post请求-json数据
*
* @param url : 请求的连接
* @param params :请求参数,无参时传null
* @return
*/
public static String sendPostToJson(String url, Map<String, Object> params) {
HttpRequest request = HttpRequest.post(url);
request.contentType("application/json");
request.charset("utf-8");
//参数详情
if (params != null) {
request.body(JSON.toJSONString(params));
}
HttpResponse response = request.send();
String respJson = response.bodyText();
return respJson;
}
/**
* 发送Post请求
*
* @param url : 请求的连接
* @param params :请求参数,无参时传null
* @return
*/
public static String sendPost(String url, Map<String, Object> params) {
HttpRequest request = HttpRequest.post(url);
//参数详情
if (params != null) {
request.form(params);
}
HttpResponse response = request.send();
String respJson = response.bodyText();
return respJson;
}
/**
* 发送Delete请求
*
* @param url : 请求的连接
* @param params :请求参数,无参时传null
* @return
*/
public static String sendDelete(String url, Map<String, Object> params) {
HttpRequest request = HttpRequest.delete(url);
if (params != null) {
request.form(params);
}
HttpResponse response = request.send();
String respJson = response.bodyText();
return respJson;
}
/**
* 发送Post请求-json数据
*
* @param url : 请求的连接
* @param body :请求参数,无参时传null
* @return
*/
public String sendPostBodyToJson(String url, String body) {
log.info("url参数:{},请求体:{}", url, body);
HttpRequestExtend request = HttpRequestExtend.post(url);
request.contentType("application/json");
request.charset("UTF-8");
//参数详情
if (body != null) {
//bodyText以请求头的的编码方式设置编码,而body的方法的编码使用的是ISO8859-1的编码格式,所以有中文会乱码(重写body方法)
request.body(body.getBytes(), "application/json");
}
HttpResponse response = request.send();
String respJson = response.bodyText();
log.info("同步响应结果:{}", respJson);
return respJson;
}
/**
* 发送Post请求-json数据
*
* @param url : 请求的连接
* @param paramStr :请求参数,无参时传null
* @return
*/
public String sendPostQueryParamsOfBase64Str(String url, String paramStr) {
log.info("url参数:{},请参数:{}", url, paramStr);
HttpRequestExtend request = HttpRequestExtend.post(url);
//request.contentType("application/json");
request.charset("UTF-8");
request.query("base64Str", request.base64EncoderParamStr(paramStr));
HttpResponse response = request.send();
String respJson = response.bodyText();
String result = null;
try {
result = new String(respJson.getBytes(), "UTF-8");
} catch (UnsupportedEncodingException var5) {
log.error("解码异常!");
}
//之前跟同事对的时候请求中文乱码问题解决了,好像这个响应的中文乱码还在,有兴趣的小伙伴可以去看下这个问题哈
log.info("同步响应结果:{}", result);
return result;
}
}
上面的这个JoddHttpUtil工具类也可以拓展发送POST请求传JSON/XML的个是的参数,这个就看自己的项目需求了,然后使用上面的工具类就可在在你项目中进行http接口的调用了。