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

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

01 引言

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

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

02 简介

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

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

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

目前 1.1kstars,已入选 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 配置模式

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

04 同类Forest

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

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

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

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

05 小结

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

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

相关推荐
大牧师1 小时前
Nest.js 微服务入门教程
开发语言·javascript·后端·微服务·node.js·nest.js·nest
凤山老林1 小时前
企业级文件服务中台:Spring Boot 集成 MinIO 实现分片存储、生命周期管理与多租户隔离
java·spring boot·后端·minio·文件服务
青山木1 小时前
Hot 100 --- 买卖股票的最佳时机
java·数据结构·算法·leetcode·贪心算法
程序员良辰1 小时前
Eclipse Memory Analyzer(MAT)入门教程:从生成 Heap Dump 到定位 Java 内存问题
java·ide·eclipse·tomcat·idea
深圳市益普科技有限公司1 小时前
半导体MES的数字孪生:虚拟调试如何把上线风险提前清零
java·开发语言
IT_陈寒1 小时前
Redis的订阅丢失消息?你可能忘了这个配置
前端·人工智能·后端
星栖与芯1 小时前
STM32MP157 M4 指针避坑(三):生命周期与内存踩踏——HardFault 重灾区
java·网络·stm32
Maynor9961 小时前
「原子弹爆炸」级别:Astra 复刻游戏合集(含实机截图)
java·linux·运维·数据库·gpt·游戏
CV艺术家1 小时前
openssL生成免费的证书
java·linux·服务器