Dify调用Java的三种实现方式

 更新时间:2025年06月06日 08:26:23   作者:Java中文社群  
在一些复杂的业务中,我们可能需要使用 Dify 调用外部程序(如 Java 程序),因为这样才能满足业务的特殊需求,那么问题来了,使用 Dify 调用 Java 程序的实现方式有哪些呢?今天我们就来盘点一下,需要的朋友可以参考下

引言

在一些复杂的业务中,我们可能需要使用 Dify 调用外部程序(如 Java 程序),因为这样才能满足业务的特殊需求。

例如,当我们使用 Dify 实现“AI 简历自动筛选器”的时候,我们首先会使用 AI 筛选出符合招聘要求的简历,然后再将简历存放到公司的“人才库”系统中,完成后续流程的招聘需要(预约面试、面试评价、发送 Offer 等操作),这个时候就需要让 Dify 调用 Java 程序了。

那么问题来了,使用 Dify 调用 Java 程序的实现方式有哪些呢?今天我们就来盘点一下。

1.解决方案概述

Dify 调用 Java 程序的解决方案有以下几种:

  • 通过 “HTTP 请求” 的方式调用 Java 程序。
  • 通过 “自定义工具” 的方式调用 Java 程序。
  • 通过 MCP 的方式调用 Java 程序。

接下来,我们分别来看。

2.HTTP请求

HTTP 请求允许通过 HTTP 协议发送服务器请求,适用于获取外部数据、webhook、生成图片、下载文件等情景。它让你能够向指定的网络地址发送定制化的 HTTP 请求,实现与各种外部服务的互联互通。

它的使用也很简单,我们只需要在 Dify 的工作流中添加“HTTP 请求”节点即可,如下图所示:

它的参数配置包含以下这些:

当然,我们也可以利用它来发送文件给 Java 程序,并且可以自定义失败重试配置和错误异常配置。

对于被调用方 Java 来说,只需要提供一个 HTTP 接口即可,当然生成环境要考虑添加 APIKey 以保证调用的安全性,这里提供一个简单的 Java 服务接口:

import com.ai.difyhttpserver.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/it")
public class InterviewController {
    @RequestMapping("/add")
    public boolean add(User user) {
        // 执行数据库添加操作
        System.out.println(user.toString());
        return true;
    }
}

3.自定义工具

自定义工具的调用方式,需要先把 Java 程序发不成 Dify 中的自定义工具,才能正常调用,如下图所示:

配置的 Schema 需要满足 OpenAPI 协议,配置如下:

{
  "openapi": "3.1.0",
  "info": {
    "title": "html to image tools",
    "description": "Generate image files based on HTML code",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "http://192.168.3.94:8080"
    }
  ],
  "paths": {
    "/html2img/gen": {
      "get": {
        "description": "Generate image files based on HTML code",
        "operationId": "html2image",
        "parameters": [
          {
            "name": "html",
            "in": "query",
            "description": "HTML code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {

    }
  }
}

同样,Java 服务器端只需要提供一个可以使用 HTTP 协议访问的接口即可。

4.MCP通讯

这种通讯方式实现最麻烦,有点大炮打蚊子的感觉,但也可以实现 Dify 调用 Java 程序,此时要求先试用 Java 程序,例如 Spring AI 实现一个 MCP 服务器端,然后再使用 Dify 添加支持 MCP 调用的 Agent 策略,来调用 Java 的 MCP 服务,如下图所示:

安装 Agent 策略(支持 MCP 工具)如下图所示:

MCP SSE 选装,非必须,可以为后续 Agent 提供 MCP 工具列表,方便 LLM 正确理解和调用工具。

配置MCP服务地址

Dify 只支持 HTTP 协议的 MCP 服务调用,它的配置格式如下:

{
  "server_name1": {
    "transport": "sse",
    "url": "http://127.0.0.1:8000/sse",
    "headers": {},
    "timeout": 50,
    "sse_read_timeout": 50
  },
  "server_name2": {
    "transport": "sse",
    "url": "http://127.0.0.1:8001/sse"
  },
  "server_name3": {
    "transport": "streamable_http",
    "url": "http://127.0.0.1:8002/mcp",
    "headers": {},
    "timeout": 50
  },
  "server_name4": {
    "transport": "streamable_http",
    "url": "http://127.0.0.1:8003/mcp"
  }
}

支持配置多个 MCP 服务,或者是以下 JSON 格式也支持:

{
  "mcpServers": {
      "server_name1": {
        "transport": "sse",
        "url": "http://127.0.0.1:8000/sse",
        "headers": {},
        "timeout": 50,
        "sse_read_timeout": 50
      },
      "server_name2": {
        "transport": "sse",
        "url": "http://127.0.0.1:8001/sse"
      },
      "server_name3": {
        "transport": "streamable_http",
        "url": "http://127.0.0.1:8002/mcp",
        "headers": {},
        "timeout": 50
      },
      "server_name4": {
        "transport": "streamable_http",
        "url": "http://127.0.0.1:8003/mcp"
      }
    }
}

配置Agent

Agent 需要配置的项目比较多,首先是 Agent 策略:

然后是 LLM,选择合适的大模型即可,之后配置 MCP 工具和 HTTP 地址,如下图所示:

之后配置指令和查询问题:

测试MCP调用

我们创建的是一个 ChatFlow,执行效果如下:

执行符合预期。

Spring AI 实现 MCP 服务器端参考我之前发的文章,这里就不再赘述。

小结

Dify 调用 Java 程序的实现方式有 3 种:HTTP 请求、自定义工具、MCP 通讯方式。其中最简单、最灵活的实现方式为 HTTP 请求方式;自定义工具适合偏工具性质(而非业务性质)的调用;MCP 适合一次性注入多个工具方法给 Dify 使用的场景。

以上就是Dify调用Java的三种实现方式的详细内容,更多关于Dify调用Java方式的资料请关注脚本之家其它相关文章!

相关文章

  • 在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

    在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

    在MyBatis的XML映射文件中,<trim>元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示例展示了如何在UPDATE、SELECT、INSERT和SQL片段中使用<trim>元素,以实现动态的SQL构建,感兴趣的朋友一起看看吧
    2025-01-01
  • jxl操作excel写入数据不覆盖原有数据示例

    jxl操作excel写入数据不覆盖原有数据示例

    网上很多例子,都是用Jxl读或者写excel,本文实现的功能就是将数据源in.xls的第几行第几列数据写入到out.xls的第几行第几列,不覆盖out.xls其他原有的数据。
    2014-03-03
  • Java微信公众平台之自定义菜单

    Java微信公众平台之自定义菜单

    这篇文章主要为大家详细介绍了Java微信公众平台之自定义菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • JDBC实现学生管理系统

    JDBC实现学生管理系统

    这篇文章主要为大家详细介绍了JDBC实现学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • JPA中EntityListeners注解的使用详解

    JPA中EntityListeners注解的使用详解

    这篇文章主要介绍了JPA中EntityListeners注解的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • java图形界面AWT编写计算器

    java图形界面AWT编写计算器

    这篇文章主要为大家详细介绍了基于java语言下图形界面AWT编写计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Spring的自定义扩展标签NamespaceHandler解析

    Spring的自定义扩展标签NamespaceHandler解析

    这篇文章主要介绍了Spring的自定义扩展标签NamespaceHandler解析,在很多情况下,我们需要为系统提供可配置化支持,简单的做法可以直接基于Spring的标准Bean来配置,Spring提供了可扩展Schema的支持,这是一个不错的折中方案,需要的朋友可以参考下
    2023-12-12
  • GC参考手册二java中垃圾回收原理解析

    GC参考手册二java中垃圾回收原理解析

    由于有个垃圾回收机制,java中的额对象不在有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存<BR>
    2022-01-01
  • Spring MVC url提交参数和获取参数

    Spring MVC url提交参数和获取参数

    本文重要讲述通过url提交参数和获取参数的具体操作与实现。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • JAVA构造函数不能使用void关键字问题

    JAVA构造函数不能使用void关键字问题

    这篇文章主要介绍了JAVA构造函数不能使用void关键字问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论