将cURL 命令直接变成 Java 代码?用JQuick-Curl搞起来

关注我的公众号:【编程朝花夕拾】,可获取首发内容。

01 引言

平时习惯了使用类似Postman测试接口,直接将curl命令复制到工具里就可以自动转化,完成接口调试。如果要将curl直接使用在Java中,这样就免去了OkHttp/RestTemplate工具类的再次翻译,该如何实现呢?

本节介绍一款专门用来将curl集成在Java中,可以 通过Feign接口一样调用的框架:JQuick-Curl。

02 简介

JQuickCurl 是一款面向 Java 的 curl 命令式 HTTP 客户端框架:把浏览器、Postman 或终端中可复用的原生 curl 命令直接解析为 Java 请求,支持注解与 XML 双配置、变量替换、条件渲染、文件传输、批量执行和动态代理调用。

底层用 OkHttp 发请求,用 ANTLR 解析 curl 语法。它不是调用系统的 curl 进程,而是把 curl 命令解析成 Java 原生的 HTTP 调用逻辑。

GitHub地址:github.com/dromara/jqu...

目前 1.1k的stars,已入选 Awesome Java HTTP Clients 精选列表,属于 dromara 开源组织项目。

03 小试牛刀

3.1 Maven依赖

xml 复制代码
<dependency>
    <groupId>io.github.paohaijiao</groupId>
    <artifactId>jquick-curl</artifactId>
    <version>2.3.0</version>
</dependency>

3.2 注解模式

在使用注解模式之前,先来定义三个接口:

定义curl接口

java 复制代码
public interface UserService {

    @JCurlCommand("curl -X GET 'http://localhost:8080/user?id=${id}'")
    User getUser(Long id);

    @JCurlCommand("curl -X POST 'http://localhost:8080/update?id=${id}&name=${name}'")
    String update(Long id, String name);

    /**
     * 注意:jquick-curl 的 ${} 占位符替换只做参数 toString(),不会把 POJO 序列化为 JSON。
     * 因此这里接收调用方序列化好的 JSON 字符串,否则 -d body 会是 User 的 lombok toString 文本,
     * 服务端 @RequestBody 反序列化失败返回 400。
     */
    @JCurlCommand("curl -X POST 'http://localhost:8080/register' -H 'Content-Type: application/json' -d '${json}'")
    String register(String json);
}

关键注解:@JCurlCommand

占位符:${}

其他就是curl的命令了

测试类

java 复制代码
public class UserCurlTest {

    @Test
    void test01() {
        UserService proxy = JCurlInvoker.createProxy(UserService.class);
        User user = proxy.getUser(1L);
        System.out.println(user);
        // User(id=1, name=ws, age=27, birthDate=null)
    }

    @Test
    void test02() {
        UserService proxy = JCurlInvoker.createProxy(UserService.class);
        String ws = proxy.update(2L, "ws");
        System.out.println(ws);
        // id = 2 的用户ws updated
    }

    @Test
    void test03() {
        UserService proxy = JCurlInvoker.createProxy(UserService.class);
        User user = new User();
        user.setId(RandomUtil.randomLong(100));
        user.setName("ws" + user.getId());
        user.setAge(RandomUtil.randomInt(50));

        String ws = proxy.register(JSONUtil.toJsonStr(user));
        System.out.println(ws);
        // 注册成功:User(id=69, name=ws69, age=34, birthDate=null)
    }
}

调用过程中会打印项目信息:

3.3 XML 配置模式

类似 MyBatis 的 Mapper.xml,把 curl 命令写在 XML 文件里,支持变量替换、条件渲染。适合接口数量多、需要集中管理的项目。

04 同类Forest

我本人自己很少curl的方式开发项目,所以jquick-curl对于自己而言用起来反而非常别扭。使用较多的反而是另一款框架:Forest

Forest 是 dromara 社区的另一个 Java HTTP 客户端框架,比 JQuick-Curl 资历老,生态更成熟。两个框架解决的是同一类问题,但思路不同。

两类框架怎么选呢?取决于团队的使用习惯:

  • 团队里 curl 用得溜,前后端测试都能看懂 curl 命令 → JQuick-Curl
  • Spring Boot 重度项目,想要 Feign 的体验但不依赖 Spring Cloud → Forest
  • 需要把请求定义从代码里抽出来做配置化管理 → JQuick-Curl 的 XML 模式
  • 需要 OAuth2、SSE、复杂模板表达式等高级特性 → Forest 更成熟

05 小结

如果你的日常开发中大量涉及第三方 HTTP 接口对接,并且团队里 curl 命令是通用的调试语言,JQuick-Curl 值得一试。它不替代 Forest,也不替代 OkHttp,它只是给了你另一种选择:用最熟悉的方式描述请求,剩下的交给框架。

感兴趣的老铁可以深入了解一下!

相关推荐
猿究院_夏燊4 小时前
Spring Bean 生命周期
java·后端·spring
Wang's Blog4 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
信誓旦旦的程序猿4 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
砚底藏山河5 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
Jlzn88885 小时前
华东电芯分选通道数怎么配才不堵线
java·人工智能·架构·自动化·制造
香吧香5 小时前
GRPC连接机制---长连接分析
java·网络与传输协议
CCblandy5 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
我是人✓5 小时前
SpringBoot项目的五种创建方式
java·spring boot·后端
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 阿里云 OSS 入门案例:从创建 Bucket 到上传拿到可访问 URL
java·阿里云·交友
裕晟资质规划7 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全