Dify——HTTP 请求节点(货币换算示例)

HTTP 请求节点

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

该节点支持常见的 HTTP 请求方法:

  • GET,用于请求服务器发送某个资源。
  • POST,用于向服务器提交数据,通常用于提交表单或上传文件。
  • HEAD,类似于 GET 请求,但服务器不返回请求的资源主体,只返回响应头。
  • PATCH,用于在请求-响应链上的每个节点获取传输路径。
  • PUT,用于向服务器上传资源,通常用于更新已存在的资源或创建新的资源。
  • DELETE,用于请求服务器删除指定的资源。

HTTP 请求 API 的核心通讯步骤

(为了接下来调用API,首先简单的理解HTTP的通讯过程,如果你对此不理解或者不感兴趣,可以直接阅读下一部分“一个简单的调用”,不会影响整个实验)

HTTP请求API的通讯过程,本质是客户端与服务器基于TCP协议,通过“请求-响应”模式完成数据交互的全过程,核心可拆分为5个步骤。

HTTP请求API的核心通讯步骤

  1. 建立TCP连接
    客户端(如浏览器、APP)会先与API服务器的指定端口(默认80端口,HTTPS为443端口)建立TCP连接,这个过程通过“三次握手”完成,确保连接可靠。
  2. 发送HTTP请求
    连接建立后,客户端向服务器发送HTTP请求。请求内容主要包含三部分:
  • 请求行:指定请求方法(如GET、POST)、API路径(如/api/user)和HTTP协议版本(如HTTP/1.1)。
  • 请求头:携带附加信息,如Content-Type(数据格式)、Authorization(身份验证)等。
  • 请求体(可选):仅在POST、PUT等方法中存在,用于传递具体数据(如JSON格式的用户信息)。
  1. 服务器处理请求
    服务器接收到请求后,会按以下流程处理:
  • 解析请求行、请求头,确认请求合法性(如权限校验)。
  • 执行对应的业务逻辑(如查询数据库、处理数据)。
  • 生成需要返回给客户端的响应数据。
  1. 返回HTTP响应
    服务器处理完成后,向客户端返回HTTP响应。响应内容同样包含三部分:
  • 状态行:包含HTTP协议版本、状态码(如200表示成功,404表示资源不存在)。
  • 响应头:携带服务器信息(如Server: Nginx)、数据格式(如Content-Type: application/json)等。
  • 响应体:核心数据,通常以JSON、XML等格式返回(如用户信息列表)。
  1. 关闭/复用TCP连接
  • 若使用HTTP/1.0,响应返回后会直接关闭TCP连接。
  • 若使用HTTP/1.1或HTTP/2,默认会开启“Keep-Alive”模式,连接会被复用,减少后续请求的连接耗时。

关键补充概念

  • 请求方法:不同方法对应不同操作,常见的有GET(查询数据)、POST(提交数据)、PUT(修改数据)、DELETE(删除数据)。
  • 响应状态码:分5大类,2xx(成功)、3xx(重定向)、4xx(客户端错误)、5xx(服务器错误),是判断请求结果的核心依据。
  • HTTPS差异:若为HTTPS请求,会在TCP连接建立后、发送HTTP请求前,额外增加“TLS握手”步骤,实现数据加密传输,保障安全性。

调用API实现汇率换算

这是一个免费在线汇率换算器,支持人民币、美元、欧元等200多种世界货币和比特币等加密货币的实时转换。提供准确的实时汇率,支持中文货币名称,让您轻松进行全球货币换算。

接口地址: https://v2.xxapi.cn/api/exchange

请求参数

参数名传递参数传入位置类型参数说明
from源货币query必传支持货币代码或中文名称,如:USD、CNY、美元、人民币
to目标货币query必传支持货币代码或中文名称,如:USD、CNY、美元、人民币
amount金额query必传需要转换的金额

请求示例

import requests

url = "https://v2.xxapi.cn/api/exchange?from=USD&to=CNY&amount=100"

payload = {}
headers = {
'User-Agent': 'xiaoxiaoapi/1.0.0'
}

response = requests.request("GET", url, headers = headers, data = payload)

print(response.text)

URL(Uniform Resource Locator)是API的“访问地址”,这里由「基础路径」和「查询参数」两部分组成:

组成部分内容与含义
基础路径https://v2.xxapi.cn/api/exchange —— 标识这是“货币兑换API”的核心接口地址,服务器通过这个路径识别要执行的功能。
查询参数(?后)&分隔的3个参数,是客户端向服务器传递的“业务数据”:
- from=USD:原始货币类型为「美元」(USD是美元的ISO代码)
- to=CNY:目标货币类型为「人民币」(CNY是人民币的ISO代码)
- amount=100:原始金额为100(单位:美元)

请求体(payload):payload = {}

payload是HTTP请求中「向服务器传递的正文数据」,通常用于POST/PUT等需要“提交数据”的请求(如提交表单、上传文件)。

  • 这里payload为空字典,因为本次是GET请求(仅获取数据,不修改服务器状态),所有业务参数已通过URL的查询字符串传递,无需在正文里附加数据。

请求头(headers):headers = {'User-Agent': 'xiaoxiaoapi/1.0.0'}

headers是HTTP请求的“元数据”,用于告诉服务器「请求的来源、格式、能力」等信息,这里仅设置了User-Agent

  • User-Agent:标识“请求来自哪个客户端”,格式通常是「客户端名称/版本号」。
    服务器可能会通过User-Agent做两件事:① 验证请求是否来自合法客户端(防止恶意请求);② 针对不同客户端返回适配的数据(如手机端vs电脑端)。
    这里xiaoxiaoapi/1.0.0表示请求来自名为“xiaoxiaoapi”的客户端,版本是1.0.0。

发送请求并接收响应:response = requests.request("GET", url, headers=headers, data=payload)

这行代码是核心,调用requests库的request方法发送HTTP请求,并接收服务器返回的response对象。
关键参数解析:

  • "GET":HTTP请求方法,代表“从服务器获取数据”,适合查询类场景(如查汇率、查天气),且参数会暴露在URL中(前面的查询参数就是例子)。
    对比:如果是POST方法,参数会放在payload(请求正文)中,更适合传递敏感数据(如密码、支付信息)。
  • url:目标API地址(前面解析过)。
  • headers:请求头(携带User-Agent)。
  • data=payload:请求正文(这里为空,因为是GET请求)。

打印响应结果:print(response.text)

response是服务器返回的“响应对象”,包含状态码、响应头、响应正文等信息。response.text会将响应正文以字符串形式返回。
运行代码后,打印的结果就是文档中的JSON字符串:

{"code":200,"msg":"数据请求成功","data":{"amount":100,"from":"USD","rate":7.1137296096,"result":711.37296096,"to":"CNY","update_at":1761894300000},"request_id":"0f93a5d7bfd97b8b78374052"}

返回示例

// 货币代码可以查看https://xxapi.cn/doc/allrates
{
    "code": 200,
    "msg": "数据请求成功",
    "data": {
        "amount": 100,
        "from": "USD",
        "rate": 7.3325486852,
        "result": 733.25486852,
        "to": "CNY",
        "update_at": 1736700600000
    },
    "request_id": "821d95235d5917f746600d0b"
}

响应正文是标准的JSON格式(键值对结构),每个字段都有明确的业务含义:

一级字段类型含义与子字段解析
code数字HTTP请求的“业务状态码”:
- 200 代表「请求成功」(若为4xx/5xx则代表错误,如404=接口不存在)。
msg字符串状态描述:数据请求成功 是对code=200的文字解释,方便开发者理解。
data对象核心业务数据(兑换结果),包含6个子字段:
- amount=100:原始金额(100美元)
- from=USD:原始货币(美元)
- rate=7.1137296096:实时汇率(1美元=7.1137296096人民币)
- result=711.37296096:兑换结果(100美元≈711.37人民币)
- to=CNY:目标货币(人民币)
- update_at=1761894300000:汇率数据更新时间(毫秒级时间戳,需转换为正常时间,如用Python的time库转换)。
request_id字符串请求唯一标识(0f93a5d7bfd97b8b78374052),用于排查问题(如向API服务商反馈错误时提供该ID)。

一个简单的调用

通过请求示例我们可以知道只需要满足请求值就可以获取到返回

通过浏览器直接访问
https://v2.xxapi.cn/api/exchange?from=USD&to=CNY&amount=100

浏览器返回
{"code":200,"msg":"数据请求成功","data":{"amount":100,"from":"USD","rate":7.1120637997,"result":711.20637997,"to":"CNY","update_at":1761901500000},"request_id":"72da6f33a96f95aca866b4ff"}

结构
https://v2.xxapi.cn/api/exchange?from=源货币&to=目标货币&amount=金额

类似的要查询10000人民币对日元可以如下构造请求
https://v2.xxapi.cn/api/exchange?from=CNY&to=JPY&amount=10000

浏览器返回
{"code":200,"msg":"数据请求成功","data":{"amount":10000,"from":"CNY","rate":21.68840044179673,"result":216884.0044179673,"to":"JPY","update_at":1761901500000},"request_id":"1c4bc75961722a2cc6a70cf4"}

在HTTP 请求节点中使用API

在Git字段中填写准备好的请求
https://v2.xxapi.cn/api/exchange?from=CNY&to=JPY&amount=10000

HTTP 请求节点会返回四个输出变量
body         string         响应内容
status_code number          响应状态码
headers     object          响应头列表(JSON)
files       Array[File]     文件列表

直接回复模块中可以看见和浏览器返回了一样的内容

Dify中组合传递参数

首先在开始创建三个变量分别为

  • source_currency 原始货币
  • target_currency 目标货币
  • amount 金额

在HTTP请求节点中将GET中的参数替换为变量

执行前记得输入对应的参数数据

格式化输出

在这里返回的是Json格式,我们可以使用Python来整理输出

import json
import time

def main(arg1: str):
    raw_json_str = arg1
    parsed_data = json.loads(raw_json_str)
    return {
        "result": parsed_data,
    }

效果如下

最终效果

工作流下载:

https://pan.baidu.com/s/16NF9w_IbeInX6msrbaQVJQ?pwd=hczf 提取码: hczf