Node.js(Next.js)调用SOAP API并获取JSON响应方案咨询
在Next.js中调用SOAP API并将响应转为JSON格式
我来帮你调整代码,实现在Next.js中调用SOAP API并获取JSON响应的需求。你的原代码已经走对了第一步,但还有几个关键步骤需要补充——比如缺少SOAP API必需的请求头、没有解析响应的XML内容并转换为JSON。
第一步:安装XML转JSON的依赖
SOAP API返回的是XML格式,我们需要用xml2js库把它转换成JSON。在你的Next.js项目中安装这个依赖:
npm install xml2js # 或者用yarn yarn add xml2js
第二步:调整后的完整代码
下面是补全后的代码,包含请求头修正、XML解析和错误处理:
import xml2js from 'xml2js'; async function fetchHourlyTransactions() { // 注意替换为你的实际登录凭证 const login = "your-actual-login"; const password = "your-actual-password"; const xml = `<?xml version='1.0' encoding='utf-8'?> <soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'> <soap:Body> <HourlyTransactions xmlns='https://secure.myterminals.com/ConfigStatusSyncService'> <StartTime>2020-12-17 00:00</StartTime> <EndTime>2020-12-18 00:00</EndTime> <Login>${login}</Login> <Password>${password}</Password> </HourlyTransactions> </soap:Body> </soap:Envelope>`; try { const res = await fetch("https://secure.myterminals.com/ConfigStatusSyncService/DataQuery.asmx", { method: "POST", headers: { "Content-Type": "text/xml; charset=utf-8", // SOAP API必需的头,指定要调用的方法 "SOAPAction": "https://secure.myterminals.com/ConfigStatusSyncService/HourlyTransactions" }, body: xml, }); // 检查HTTP响应状态 if (!res.ok) { throw new Error(`请求失败,状态码: ${res.status}`); } // 读取响应的XML文本内容 const xmlResponse = await res.text(); // 初始化XML解析器,配置让JSON结果更简洁 const parser = new xml2js.Parser({ explicitArray: false, // 避免单个元素被转成数组 ignoreAttrs: true // 忽略XML中的属性 }); // 把XML转换成JSON const jsonResponse = await parser.parseStringPromise(xmlResponse); // 提取实际的业务数据(根据SOAP响应结构调整路径) const transactionData = jsonResponse['soap:Envelope']['soap:Body'].HourlyTransactionsResponse.HourlyTransactionsResult; console.log("JSON格式的交易数据:", transactionData); return transactionData; } catch (error) { console.error("调用SOAP API时出错:", error); throw error; } } // 示例:在Next.js的API路由中调用(pages/api/transactions.js 或 app/api/transactions/route.js) export async function GET() { try { const data = await fetchHourlyTransactions(); return Response.json(data); } catch (error) { return Response.json({ error: error.message }, { status: 500 }); } }
关键调整说明
- 添加SOAPAction请求头:几乎所有SOAP API都要求这个头来明确指定要调用的方法,Postman会自动帮你填充,但手动发送请求时必须自己添加。这里的取值是你的方法命名空间加上方法名,和XML中的
HourlyTransactions元素的命名空间一致。 - 解析XML到JSON:使用
xml2js的parseStringPromise方法异步解析XML,配置参数让生成的JSON结构更符合日常使用习惯——不会把单个节点转成数组,也不会保留XML的属性。 - 错误处理:增加了HTTP状态检查和全局try-catch,方便你排查请求失败的原因(比如凭证错误、网络问题等)。
- Next.js适配:如果是在客户端组件中调用这个函数,记得加上
'use client'指令;如果遇到跨域问题,可以在next.config.js中配置反向代理,把请求转发到SOAP API地址。
注意事项
- 务必替换代码中的
your-actual-login和your-actual-password为你的真实凭证。 - 如果API返回的XML结构和示例不同,需要调整提取数据的路径(比如打印
jsonResponse查看完整结构后修改)。
内容的提问来源于stack exchange,提问作者Nasir Khan
相关产品推荐
相关产品推荐

