将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,它只是给了你另一种选择:用最熟悉的方式描述请求,剩下的交给框架。

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

相关推荐
dd聊技术5 分钟前
LLM 说"你这篇和已有文章 92% 相似",我去查了——它编的
后端
正在走向自律8 分钟前
从只写接口到独立交付前后端,飞算JavaAI能给Java后端工程师多少溢价?
java·springboot·ai编程·全栈开发·java求职·飞算javaai·金九银十
多喝水身体棒39 分钟前
Spring Boot 自动配置原理,看完终于不慌了
面试·程序员
a努力。40 分钟前
LangChain Agent消息链路全解析
java·前端·javascript
行百里er42 分钟前
Redis 持久化——RDB 快照 vs AOF 日志
redis·后端
SL_staff1 小时前
物模型是设备的数字身份证:属性、事件、服务如何决定IoT系统扩展性
java·物联网·全栈
资深技术分享员1 小时前
Geejing WebBuilder 日志、在线用户、系统监控,出问题时的三个第一现场
java·运维·数据库
卓怡学长1 小时前
w202springboot基于B_S架构的图书信息管理系统
java·spring boot·spring·intellij-idea
走到天涯海角1 小时前
用springBoot写几个简单的接口
java·spring boot·intellij-idea
troy1281 小时前
Java 技术栈全景指南:从基础到微服务的完整知识体系
java·开发语言·微服务