当前位置: 首页 > news >正文

知行之桥EDI系统HTTP签名验证

本文简要概述如何在知行之桥EDI系统中使用 HTTP 签名身份验证,并将使用 CyberSource 作为该集成的示例。

API 概述

首字母缩略词 API 代表“应用程序编程接口”。这听起来可能很复杂,但真正归结为 API 是一种允许两个不同实体相互通信的软件。自开发以来,API 已迅速成为全球企业、行业和服务使用的常用通信方法。

知道了这一点,知行之桥EDI系统在构建时就考虑到了 API。使用应用程序中的专用端口,用户可以设计和创建从公共 API 端点或基于 REST 的 API 发送和接收数据的流。在实践中,大多数(如果不是全部)RESTful API目前都使用HTTP作为传输层,因为HTTP的基础设施、服务器和客户端库已经被广泛使用。

这些流可以通过使用知行之桥EDI系统的许多专用端口中的几个来实现。这些端口允许用户指定他们希望面向哪个 API 端点,以便 POST 某些 JSON 数据或提交 GET 请求以接收特定报告。但是,当 API 需要 HTTP 签名身份验证等身份验证方法时,它可能会变得有点棘手。使用此方法在知行之桥EDI系统中发送适当的请求需要的不仅仅是拖放和操作,稍后将更详细地解释。

HTTP签名认证是什么以及如何使用?

商业 API 通常需要某种形式的安全性,以便不是任何人都可以访问他们可以提供的数据。保护 API 的最常见方法是使用共享密钥。每次调用 API 时,都必须提供此密钥。但是,此方法不提供确保所传输数据完整性的方法。在这些情况下,HTTP 签名身份验证允许提高 API 的安全性。

HTTP 签名身份验证通常以两种不同的方式使用。

  • 允许发送方通过证明他们拥有密钥来请求访问资源。

  • 允许发送方确认发送的邮件内容正确无误,并且在传输或存储过程中未被更改。

以 CyberSource API 为例。API 文档要求 REST HTTP 请求必须包含您发送给 CyberSource 的签名请求标头。此签名由发送方加密,并在 API 收到时解密,以确保发送请求的用户有权访问指定的资源。

在知行之桥EDI系统中,这可以通过使用 REST 端口和脚本端口来实现,该脚本包含自定义脚本,该脚本为 HTTP 签名生成所需的标头和加密。然后,脚本端口将这些消息标头发送到 REST 端口,然后 REST 端口使用这些标头(包括签名)来处理 REST 请求。

REST 端口

REST 端口允许用户使用 HTTP 协议与交易伙伴发送或接收数据,其操作与 Postman 非常相似。用户及其客户端都可以建立一个公共 API 端点,双方都可以从该 API 进行 POST 或 GET 数据。

将 REST 端口拖放到工作流中时,设置页面将打开并显示如下所示的内容。

此处应提供有关要与之交互的 API 的详细信息,例如请求方法和唯一的 API 端点 URL、身份验证以及所需的任何自定义标头。如果 API 需要,也可以提供服务器身份验证凭据。

但是,如果 API 要求在所有请求中使用 HTTP 签名身份验证,该怎么办?以 CyberSource 为例,其 API 要求使用 HTTP 签名身份验证发送所有请求。

在 REST 端口中使用 HTTP 签名身份验证比在端口设置中创建消息头、提供 URL 然后提交请求要复杂得多。主要区别在于如何获取加密的签名字符串作为 REST 端口中的消息标头传递。这就是自定义脚本和Script端口发挥作用的地方。

CyberSource API

CyberSource API 是一个非常大型的业务 API,专为作为电子商务信用卡支付系统管理公司运营的公司而开发。他们的 API 允许用户执行诸如处理付款、管理发票以及在此用例中报告等操作。

本文中的所有 API 参考都可以在 CyberSource API 文档中找到,该文档位于此处。 https://developer.cybersource.com/docs/cybs/en-us/tms/developer/all/rest/tms-developer/intro.html

如果使用本文通过知行之桥EDI系统实现 CyberSource API,请花时间确保您已创建并按顺序创建所有必要的凭据和密钥。

此示例所需的两个密钥是 Encoded Secret Key 和 Secret Key in UUID Format。这两个密钥都可以在 CyberSource 商务中心内找到,网址为:https://ubctest.cybersource.com/ebc2/

Script 端口

在了解了 CyberSource 的要求以及知行之桥EDI系统如何处理这些要求之后,是时候介绍Script 端口了。此端口允许您生成签名字符串,并将其作为消息标头传递到流中的 REST 端口。概括地说,Script 端口中的过程如下所示:

  • 创建解码密钥的字节数组(在 CyberSource Business Center 中生成)。

  • 创建一个基于解码的密钥字节数组的 HMACSHA256 对象,然后使用此

  • 最后,从上一步中 HMACSHA256 对象的字节数组生成一个 base-64 编码的字符串。

使这变得棘手的是,加密的签名字符串以及密钥 ID、签名算法和标头名称构成了签名标头的实际值。但是,所有这些都可以在Script 端口中使用 ArcScript 来完成。

示例工作流

在介绍了一般 API 信息、HTTP 签名以及如何在此过程中使用知行之桥EDI系统之后,现在是时候转向使用 CyberSource API 的示例 HTTP 签名身份验证流程了。强烈建议在继续之前下载知行之桥EDI系统,并导入此工作流。

示例工作流由 Script 端口和 REST 端口组成。

分解

CyberSource API 要求在请求中传递特定的 HTTP 标头。这些标头是:

  • v-c-merchant-id v-c-商家 ID

  • Date 日期

  • Host 主机

  • Signature 签名

v-c-merchant-id、Date 和 Host 是直截了当的。但是,签名标头是它变得更加复杂的地方。

Signature 标头由多个名称-值对或参数组成,由 keyid、algorithm、headers 和 signature 组成。标头名称-值对只是所有必需标头的字符串,而签名名称-值对是哈希签名,它是标头字段及其值的 base-64 哈希编码。

通过将这些 HTTP 标头连接在一起形成一个字符串,并使用具有共享密钥的对称算法 (hmac-sha256) 获取该字符串的加密哈希值,从而生成 HTTP 请求的数字签名。最后,对加密的字节进行base-64编码,得到签名字符串。

下面的代码块显示了使用 CyberSource API 时生成的 HTTP 签名标头的示例。如上所述,签名标头由多个名称-值对组成,签名名称-值对包含上述 base-64 编码的签名字符串。

v-c-merchant-id: mymerchantid
Date: Fri, 12 Jul 201900:44:13 GMT
HOst: apitest.cybersource.com
Signature: keyid="6d75ffad-ed36-4a6d-85af-5609185494f4", algorithm="HmacSHA256", headers="host date (request-target) v-c-merchant-id", signature="eQkzhzu

脚本编写

了解 Script 端口以及它如何利用 HTTP 签名身份验证后,是时候更深入地挖掘脚本本身并了解脚本编写过程的每个步骤中发生的情况了。

专为 CyberSource API 设计的 HTTP 签名身份验证脚本可分为四个主要部分。

  • 解码编码的密钥

  • 将十六进制密钥暂存为 Base-64 编码的HMACSHA256哈希

  • 设置邮件头

  • 生成哈希签名

接下来的四个部分将更详细地介绍这些步骤。

解码编码的密钥

脚本中的第一步是从 CyberSource Business Center 获取的解码密钥设置为脚本中的项目。然后,使用 encDecode 操作将该编码的密钥解码为十六进制值。

使用 encEncode 或 encDecode 操作时,可以使用“informat”和“outformat”属性指定输入和输出格式。默认的格式是 base64,这是原始密钥在这里编码的,所以在这种情况下不需要指定格式。但是,outformat 已设置为“HEX”。

在这种情况下,此操作还需要一个“in”项,然后需要一个指定的“out”项。这是指将哪个项目传递到操作中,以及操作完成处理后输出项目的所需名称。

此过程的最后一步是将解码的密钥(现在为十六进制值)设置为全局项,以便它可以在脚本范围内的任何位置使用。十六进制值必须以“0x”为前缀,以告知分析引擎它正在处理常量,而不是标识符或保留字。然后,此十六进制值稍后用于创建 base-64 编码的HMACSHA256哈希。

<!-- encoded secret key in base64 encoding to HEX --> 
<arc:set attr="encodedKey.data" value="JIVAFb/fO0WmocDuc3EvSjNiye7tif/aj+STWdFi/sU="/> 
<arc:set attr="encodedKey.outformat" value="HEX"/> 
<!-- setting decodedGlobal and setting value to hex key to be available globally --> 
<arc:set attr="decodedGlobal.data" value="" /> 
<arc:call op="encDecode" in="encodedKey" out="decodedKey"> 
<arc:set attr="decodedGlobal.data" value="0x[decodedKey.decodeddata]" /> 
</arc:call>

将编码的密钥暂存为 base-64 编码的 HMACSHA256 哈希

脚本中的下一步是为后续步骤做准备。在脚本结束时,必须将每个标头字段名称的字符串及其关联值以及十六进制键编码为 base-64。在此步骤中,必须设置要编码的输入数据 (encIn) 的参数。必须在此处指定输入格式、hmackey、算法、位数和输出格式。

然后,此数据稍后将由 encEncode 操作处理,其中将以 Base64 编码。

<!-- encoding the hex key to HMACSHA256 --> 
<arc:set attr="encIn.format" value="HMAC" /> 
<arc:set attr="encIn.hmackey" value="[decodedGlobal.data]" /> 
<arc:set attr="encIn.hmacalgorithm" value="SHA" /> 
<arc:set attr="encIn.hmacbits" value="256" /> 
<arc:set attr="encIn.outformat" value="BASE64" />

设置消息头

配置解码的密钥和编码参数后,现在可以将消息头添加到脚本端口中创建的消息中,以便能够在 REST 端口中验证它们。

需要注意的一点是,API 密钥在脚本的这一部分中定义,但它也可以在之前的任何步骤中定义,因为它在最后一节之前不会使用

在此处使用 arc:set 关键字,可以定义所需的标头,例如 MerchantID、HeaderDate 和 HeaderHost。

<!-- API secret key. this is the secret key in UUID format -->
<arc:set attr="apiSecret.key" value="b84ba2d7-1a4b-4814-b757-2f747ccab086" /> 
<arc:set attr="Report.Date" value=[_|utcnow(yyyy-MM-dd)] />
<!-- Setting custom headers. Make sure you replace the merchant ID with your ID --> 
<arc:set attr="Fileload.header:MerchantID" value="nsoft_test1" /> 
<arc:set attr="Fileload.header:myCustomHeader" value="?organizationId=[Fileload.header:MerchantID]&reportDate=[Report.Date]&reportName=test" /> 
<arc:set attr="Fileload.header:HeaderDate" value= [_|date(r)] /> 
<arc:set attr="Fileload.header:HeaderHost" value="apitest.cybersource.com" />

此处还定义了一个 myCustomHeader,其中包含 MerchantID、报告日期和报告名称。创建此标头,以便可以在 REST 端口的 URL 中将其作为查询字符串的一部分引用,如下所示: https://apitest.cybersource.com/reporting/v3/report-downloads[_message.header:MyCustomHeader]

定义这些标头后,可以在标头值字段中使用 _message.header 语法在 REST 端口中引用它们。

创建哈希签名

最后一步是创建哈希签名。这是用于验证消息内容或提交请求的实体的真实性的内容。如前所述,数字签名是通过将所有 HTTP 标头连接在一起形成一个字符串来获得的。然后,使用第二步中设置的 hmac-sha256 算法,使用解码的密钥通过该字符串获取加密哈希值。最后,所有内容都以 base-64 编码,从而生成签名字符串。

此过程可以分为两个不同的部分:

  • 设置和连接标头

  • 对标头字符串进行编码以生成签名字符串

使用 arc:set 关键字,将所有标头及其值连接在一起为一个字符串。在本例中,将执行此操作并将其设置为 encIn 项(要编码的项)的 data 属性。在此步骤中,特别是使用 CyberSource API,标头字段的放置顺序必须与在消息标头中传递的顺序相同。

这里需要注意的一件事是,包含一个名为“request-target”的标头。request-target 标头值是小写的 HTTP 谓词,后跟空格,然后是资源路径(减去主机)。以下示例显示了对“/reporting/v3/report-downloads”资源的 GET 请求。在请求目标值中包含查询字符串和请求 ID。在本例中,已在 myCustomHeader 值中定义了查询字符串。

(request-target): get /reporting/v3/report-downloads[Fileload.header:myCustomHeader]
在这种情况下,为每个单独的标头包含一个新行也很重要,但不要在字符串末尾包含任何换行符 (\n)。
<arc:set attr="encIn.data">host: [Fileload.header:HeaderHost]
(request-target): get /reporting/v3/report-downloads[Fileload.header:myCustomHeader]
date: [Fileload.header:HeaderDate]
v-c-merchant-id: [Fileload.header:MerchantID]</arc:set>
此块完成脚本中的最后两个进程。首先,调用 encEncode 操作,并将之前定义为 encIn 的所有数据作为操作的输入参数传入。输出(在本例中定义为 encOut)包含所有输入数据,但现在它是 base64 编码的。

然后,arc:set 关键字用于创建由 keyid、algorithm、headers 和 signature 组成的签名标头。为了从 encEncode 操作访问编码数据,必须引用输出项的“encodeddata”属性。

在这种情况下,签名标头设置为 [encOut.encodeddata],其计算结果为实际编码的签名字符串。

成功的签名标头应如下所示:

Signature: keyid="6d75ffad-ed36-4a6d-85af-5609185494f4", algorithm="HmacSHA256", headers="host date (request-target)
v-c-merchant-id", signature="eQkzhzu8UHEQmpBTVMibdNpPw1aLunmY41ckyLKoOjs="
<!-- generating signature hash -->
<arc:call op="encEncode" in="encIn" out="encOut">
<arc:set attr="Fileload.header:signature">keyid="[apiSecret.key]", algorithm="HmacSHA256", headers="host (request-target) date v-c-merchant-id", signature="[encOut.encodeddata]"</arc:set> 
</arc:call><!-- push the output -->
<arc:push item="Fileload" />

最后,使用 arc:push 关键字将包含所有标头和签名的整个项目从脚本端口中推出。然后,此文件将发送到 REST 端口,在该端口中可以发出 HTTP 请求,在本例中为 GET 请求。

结论

本文的目的是帮助了解知行之桥EDI系统是如何围绕 API 构建的,以及它如何使用预构建的连接器和自定义脚本与 API 集成,以及如何使用知行之桥EDI系统来遵守 API 的特定身份验证要求,例如 HTTP 签名身份验证。

此脚本包含专为与 CyberSource API 集成而开发的 ArcScript,我们提供的方式可以轻松操作,以适应可能需要 HTTP 签名身份验证的许多其他用例。

了解更多 EDI 相关信息,请阅读:EDI是什么?

阅读原文:知行之桥EDI系统HTTP签名验证

相关文章:

知行之桥EDI系统HTTP签名验证

本文简要概述如何在知行之桥EDI系统中使用 HTTP 签名身份验证&#xff0c;并将使用 CyberSource 作为该集成的示例。 API 概述 首字母缩略词 API 代表“应用程序编程接口”。这听起来可能很复杂&#xff0c;但真正归结为 API 是一种允许两个不同实体相互通信的软件。自开发以…...

C++ DAY08 异常

概念 异常事件&#xff08;如&#xff1a;除 0 溢出&#xff0c;数组下标越界&#xff0c;所要读取的文件不存在 , 空指针&#xff0c;内存不足 等等&#xff09; 在 C 语言对错误的处理是两种方法&#xff1a; 一是使用整型的返回值标识错误&#xff1b; 二是使用 errn…...

vscode导入STM32CubeIDE工程文件夹未定义警告清除方法

0 前言 在我们使用vscode去编辑STM32CubeIDE的工程文件时&#xff0c;经常会出现一些类型未定义、头文件路径无效的问题&#xff0c;无法正常使用且非常影响观感。本文介绍如何设置vscode导入的STM32CubeIDE配置文件&#xff0c;解决这一问题。 1 vscode导入STM32CubeIDE工程…...

SparkSQL之Optimized LogicalPlan生成过程

经过Analyzer的处理&#xff0c;Unresolved LogicalPlan已经解析成为Analyzed LogicalPlan。Analyzed LogicalPlan中自底向上节点分别对应Relation、Subquery、Filter和Project算子。   Analyzed LogicalPlan基本上是根据Unresolved LogicalPlan一对一转换过来的&#xff0c;…...

Java中有几种基本数据类型以及转换方式【Java面经(1)】

问&#xff1a;Java中有几种基本数据类型呢&#xff1f;以及它们之间的转换方式。详细介绍下 总共有8种基本数据类型 byte 、short 、long 、float 、double 、boolean 、char 详细类型以及字节数&#xff1a; 基本数据类型的转换方式 自动类型转换&#xff1a;小–>大 byt…...

JVM虚拟机:JVM调优第一步,了解JVM常用命令行参数

本文重点 从本文课程开始&#xff0c;我们将用几篇文章来介绍JVM中常用的命令行的参数&#xff0c;这个非常重要&#xff0c;第一我们可以通过参数了解JVM的配置&#xff0c;第二我们可以通过参数完成对JVM的调参。以及后面的JVM的调优也需要用到这些参数&#xff0c;所以我们…...

CSS特效019:图标图片悬浮旋转一周

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…...

requests请求django接口跨域问题处理

参考&#xff1a; https://zhuanlan.zhihu.com/p/416978320 https://blog.csdn.net/SweetHeartHuaZai/article/details/130983179 使用httpx代替requests import httpxheaders {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3…...

#Js篇:Promise

定义 Promise是异步操作解决方案&#xff0c;为异步操作提供统一接口。 Promise英文意思是“承诺”&#xff0c;表示其他手段无法改变。 返回 所有异步任务都返回一个Promise实例。 Promise实例有一个then方法&#xff0c;用于指定下一步的回调函数。 状态 异步操作未完…...

【数据库篇】关系模式的表示——(2)规范化

范式&#xff1a;范式是符合某一种级别的关系模式的集合 规范化&#xff1a;是指一个低一级的范式的关系模式&#xff0c;通过模式的分解转换为若干个高一级范式的关系模式的集合。 1NF 每个分量必须是不可分开的数据项&#xff0c;满足这个条件的关系模式就是1NF。 2NF 若…...

【C++那些事儿】类与对象(3)

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我之前看过一套书叫做《明朝那些事儿》&#xff0c;把本来枯燥的历史讲的生动有趣。而C作为一门接近底层的语言&#xff0c;无疑是抽象且难度颇…...

spark的算子

spark的算子 1.spark的单Value算子 Spark中的单Value算子是指对一个RDD中的每个元素进行操作&#xff0c;并返回一个新的RDD。下面详细介绍一些常用的单Value算子及其功能&#xff1a; map&#xff1a;逐条映射&#xff0c;将RDD中的每个元素通过指定的函数转换成另一个值&am…...

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷7

1、一袋小球中有15个白球&#xff0c;3个红球和2个黑球。在随机从袋子中拿出至少&#xff08;&#xff09;个小球后&#xff0c;才可以保证至少拿出了5个白球 A、5 B、10 C、8 D、15 答案&#xff1a;B 2、以下选项中&#xff0c;数值最接近十进制数114的是&#xff08; &…...

MySQL MHA高可用架构搭建

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;博主会及时修改&#xff09; MySQL MHA高可用架构搭建 MHA&#xff08;Master HA&#xff09;是一款开源的 MySQL 的高可用程序&#xf…...

UE小计:顶部工具栏按钮添加下拉列表,大纲列表、资源管理窗口右键添加按键

下拉列表 void FYouPluginsModule::StartupModule() {FYouToolStyle::Initialize();FYouToolStyle::ReloadTextures();FYouToolCommands::Register();PluginCommands MakeShareable(new FUICommandList);PluginCommands->MapAction(FYouToolCommands::Get().PackByCloudAc…...

git stash 用法总结

目录 1&#xff0c;介绍场景1&#xff1a;场景2&#xff1a; 2&#xff0c;常用命令2.1&#xff0c;基础2.2&#xff0c;进阶1&#xff0c;存储时指定备注2&#xff0c;通过索引来操作指定的存储3&#xff0c;修改存储规则 2.3&#xff0c;查看 stash 修改的具体内容 1&#xf…...

Linux操作系统之apt常用命令记录

文章目录 apt 命令apt 语法apt 常用命令列出所有可更新的软件清单命令升级软件包列出可更新的软件包及版本信息升级软件包&#xff0c;升级前先删除需要更新软件包安装指定的软件命令&#xff1a;安装多个软件包&#xff1a;更新指定的软件命令显示软件包具体信息,例如&#xf…...

TCP 重传、滑动窗口、流量控制、拥塞控制的剖析

TCP 是一个可靠传输的协议&#xff0c;那它是如何保证可靠的呢&#xff1f; 为了实现可靠性传输&#xff0c;需要考虑很多事情&#xff0c;例如数据的破坏、丢包、重复以及分片顺序混乱等问题。如不能解决这些问题&#xff0c;也就无从谈起可靠传输。 那么&#xff0c;TCP 是…...

LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain

思维之树&#xff08; Tree of Thoughts ToT&#xff09;是一个算法&#xff0c;它结合了普林斯顿大学和谷歌DeepMind在本文中提出的大型语言模型&#xff08;LLMs&#xff09;和启发式搜索。看起来这个算法正在被实现到谷歌正在开发的多模式生成AI Gemini中。 现在&#xff0…...

Drools 7 Modify 和对象直接赋值差异

modify代表修改fact&#xff0c;会再次触发符合条件的rule对象直接修改只是java 操作&#xff0c;不会会再次触发符合条件的rule 以下为测试代码-drl部分 package org.drools.learnimport org.drools.learn.ModifyTest.Message;global java.util.List listrule "Stateles…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...