apisix 自定义lua插件 webservice转restful 解析返回xml数据为json字符串

将webservice接口调用转化restfull接口 如果重新些restfull接口的话,定义各种DTO类型就是一个很大的工作量。考虑到webservcie已经定义了很多类型,所以打算采用反射的方式将webservice接口和方法去不提取出来,转化为restfull接口。 代码 using System; using System.Collections.Generic; using System.IO; using System.Linq; ... 阅读详情

apisix.tree:https://download.youkuaiyun.com/download/FSWZYC/88541181
apisix.xml2lua:https://download.youkuaiyun.com/download/FSWZYC/88541178

--
-- Licensed to the Apache Software Foundation (ASF) under one or more
-- contributor license agreements.  See the NOTICE file distributed with
-- this work for additional information regarding copyright ownership.
-- The ASF licenses this file to You under the Apache License, Version 2.0
-- (the "License"); you may not use this file except in compliance with
-- the License.  You may obtain a copy of the License at
--
--     http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
local core = require("apisix.core")
local http = require("resty.http")
local xml2lua = require("apisix.xml2lua")
local handler = require("apisix.tree")

local plugin_name = "webservice-proxy"

local schema = {
    type = "object",
    properties = {
        namespace = {
            type = "string",
            minLength = 1,
        },
        method_name = {
            type = "string",
            minLength = 1,
        },
        url = {
            type = "string",
            minLength = 1,
        },
    },
    required = { "namespace", "method_name", "url"},
}

local _M = {
    version = 0.1,
    priority = 9999,
    name = plugin_name,
    schema = schema,
}

function _M.check_schema(conf)
    return core.schema.check(schema, conf)
end



function _M.access(conf, ctx)
    ngx.req.read_body()
    --core.log.warn(ngx.req.get_body_data())
    local bodyData = ngx.req.get_body_data();
    local parameter = ""
    if bodyData ~= nil then
        for k, v in pairs(core.json.decode(ngx.req.get_body_data())) do
            parameter = parameter .. "<web:" .. k .. ">" .. v .. "</web:" .. k .. ">\n"
        end
    end
    -- 示例调用
    local method = "POST"
    local headers = {
        ["Content-Type"] = "text/xml;charset=utf-8",
        -- 添加其他必要的请求头
    }
    local body = [[
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="%s">
           <soapenv:Header/>
           <soapenv:Body>
              <web:%s>
                 %s
              </web:%s>
           </soapenv:Body>
        </soapenv:Envelope>
    ]]

    local request_xml = string.format(body, conf.namespace, conf.method_name, parameter, conf.method_name)
    local response, err = Call_webservice(conf.url, method, headers, request_xml)
    if err then
        core.log.warn("failed to call webservice: ", err)
        -- 处理错误情况
        return 500, err;
    else
        -- 处理正常情况
        local hadle_new = handler:new()
        local parser = xml2lua.parser(hadle_new)
        parser:parse(response)
        local myTable = hadle_new.root
        local envelope = myTable["Envelope"]["Body"];

        --handler.root = nil
        return 200, core.json.encode(envelope);
    end

end

function Call_webservice(url, method, headers, body)
    -- 创建 HTTP 客户端
    local httpc = http.new()

    -- 发起请求
    local res, err = httpc:request_uri(url, {
        method = method,
        headers = headers,
        body = body
    })

    -- 检查请求是否成功
    if not res then
        core.log.err("failed to request: ", err)
        return nil, err
    end

    -- 返回响应
    return res.body, nil
end

return _M

详解 APISIX Lua 动态调试插件 inspect Lua 动态调试是很重要的辅助功能。我们可以通过 APISIX inspect 插件来做很多事情。 原文链接 为什么需要 Lua 动态调试插件? Apache APISIX 有很多 Lua 代码,如何在运行时不触碰源代码的情况下,检查代码里面的变量值? 修改 Lua 源码来调试有如下缺点: 生产环境不允许也不应该修改源码 修改源码需要 reload,使得业务功能失效 容器环境难以修改源码 产生的临时代码容易忘记回滚,导致维护问题 很多时候我们不仅仅需要在 阅读详情

相关推荐

使用lua开发apisix自定义插件并发布

接到老大需求:需要对cookie进行操作,遂查询apisix的自带插件,发现有,但不满足,于是自己开发了一个插件并部署,把开发部署流程写在这里打个日志怕以后忘掉。

牛哥哥的博客 2628

移动API开发-web service-cxf-rest

本文介绍了Webservice,CXF,Restful api,以及CORS解决Ajax跨域调用api问题

doctorvian的博客 431

apisix lua插件开发记录

经过插件的请求的各拦截点见官方文档:https://apisix.apache.org/docs/apisix/architecture-design/apisix/需要重启apisix容器,但脚本都是在容器镜像里的。一开始未理解check_schema的作用,未实现它,结果发现在schema中定义的默认参数并没有生效。apisix的默认日志等级是warn级别,也就是说你在lua中加的info级别是在apisix日志中看不到。可以这样:把脚本的目录挂载到Pod里,然后修改脚本后,重启Pod就行了。

丰年留客的专栏 1023

用Apache Axis实现Web Service(一)

Web Service的优点就不废话了,大家都知道。如果你还不知道,这篇文章不适合你。 Apache Axis是Apache SOAP的第三代版本,在运行速度、灵活性、稳定性等多个方面都远远超过后者。更重要的是,Axis支持WSDL(Web Service Description Language,由IBM、MS制定的Web Service描述语言规范,得到了业界最广泛的支持)。Apach

Brookes的专栏 2894

无需二次开发,SOAP-to-REST 简化企业用户的业务迁移和整合

Web Service 由万维网联盟 (W3C) 定义为一种软件系统,旨在支持通过网络进行可互操作的计算机间交互。Web Service 完成特定任务或任务集,并且由名称为 Web Service 描述语言 (WSDL) 的标准 XML 表示法中的服务描述进行描述。服务描述提供了与服务交互必需的所有详细信息,包括消息格式(用于详细说明操作)、传输协议和位置。其他系统使用 SOAP 消息与 Web Service 进行交互,通常是通过将 HTTP 与 XML 序列化和其他 Web 相关标准一起使用。

ApacheAPISIX的博客 752

lua实现调用webservice

lua实现webservice调用 通过gsoap 实现 C/C++ 调用web service

Apisix插件开发干货总结

apisix插件开发的介绍,包括插件文件的结构及可以实现的逻辑

wuawua1的博客 2286

lnet:一个轻量级的 Lua httpserver,用于轻松开发 Web 服务

网络更新 2015-03-28 现在支持多httpserver! 参见“httpserver.lua”。 网络更新 2015-03-25 现在支持cosocket! 什么是cosocket? 'cosocket' 是 lnet httpserver 中 http 处理程序的套接字 API wapper。 它提供了 tcp/udp 块操作,但实际上在 lnet httpserver 线程中是非阻塞的。 是的,“cosocket”这个名字的意思是“协程套接字”。 我们在执行一些块操作(如连接等)时退出正在运行的 corouine,并在套接字准备好时恢复。 要使用 cosocket,你必须在你的 lua 代码中明确要求 'lnet.cosocket',它返回一个对象: 本地套接字 = 需要“lnet.cosocket” tcp = Socket:tcp(ip, port) -- 创建

使用Axis创建Web Service服务

先简短的说一下Web Service的概念,简略的总结一下:所谓Web Service就是客户端以标准的SOAP消息将服务请求发给服务提供者,不论服务提供者用什么样的技术,Java、EJB、或者.NET执行相应的程序得到结果,然后将结果以SOAP消息返回给服务请求者。      下面以Axis为例,创建一个简单的Web Service。首先到http://ws.apache.org/axis

打工仔的程序人生 1049

8台 × 8卡 910B NPU之顶尖大模型选型分析

本文对比了2026年主流大语言模型在昇腾910B NPU集群上的部署方案。重点评估了GLM5、MiniMax M2.5、Kimi K2.5、DeepSeek V3.2和Qwen 3.5旗舰版等候选模型,从部署需求(显存占用)、能力表现(基准测试、多模态支持)和NPU生态适配度三个维度进行分析。结果显示DeepSeek V3.2综合表现最优:支持BF16/W8A8/INT4量化,在4TB显存环境下可实现2000+ TPS,首token延迟<100ms,且具备官方NPU支持。备选方案Qwen 3.5旗舰版

FeelTouch Labs 755

国家基因组科学数据中心(NGDC)---组学原始数据如何上传GSA

在发表文章之前我们需要将测序的原始数据上传到一个公共库,并在文中提供accession number,实现数据的公开共享,这是国际惯例。以前我们上传数据时只能上传到美国国立生物技术信息中心(NCBI)、欧洲生物信息学研究所(EBI)、日本核酸数据库(DDBJ),现在中国科学院北京基因组研究所(国家生物信息中心)国家基因组科学数据中心 (CNCB-NGDC)—中国的 "NCBI" 已经建立并日渐完善。组学原始数据归档库(GSA)是组学原始数据汇交、存储、管理与共享系统,是国内首个被国际期刊认可的组学数据发布平

sisichen 1万+

API接口之webservice接口

一、准备工作:apache cxf,axis,httpclient等,目前流行是用cxf,本节也是用cxf实现 1.引入apache cxf包,点击----->apache-cxf-2.6.16下载 2.下载完成后解压放入项目lib目录下重新编译,如下图 二、实现方法: 1.webservice在项目中的配置,如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springfram

swebin的专栏 1万+

kettle连接达梦资源库数据库插件

kettle自定义插件plugin database plugin 达梦插件 dm插件

weixin_42122126的博客 2169

Axis 调用Soap代理模式设计

axis.jar commons-discovery.jar commons-logging.jar jaxrpc.jar 1.  Soap方法定义接口 public interface SoapService { public String getDatabaseConfiguration(); } 2. 代理执行Soap定义的方法 public class Soa

luozhangwen的专栏 2040

Verilog——反相器

反相器代码: module inv( A, Y );//A,Y是端口 //定义端口属性 input A; output Y; //定义输入输出关系 assign Y=~A;//Y等于A的反 endmodule //inv是module的名字

weixin_41788560的博客 9500

解决Matlab激活后License checkout failed问题的详细步骤与避坑指南

本文详细解析了Matlab激活后出现License checkout failed错误的常见原因及解决方案,重点介绍了如何正确找到并运行激活程序,避免用户名填写错误等常见问题。文章还提供了多次激活与疑难排解的实用建议,帮助用户顺利完成Matlab激活过程。

weixin_33670786的博客 581

从原理到操作,让你在 Apache APISIX 中代理 Dubbo3 服务更便捷

本文为大家介绍了如何借助 Apache APISIX 实现 Dubbo Service 的代理,通过引入 dubbo-proxy 插件便可为 Dubbo 框架的后端系统构建更简单更高效的流量链路。

阿里巴巴中间件 298

新能源场站必看:一次调频与AGC/AVC的协同控制逻辑解析(含典型拓扑图)

本文深度解析了新能源场站中一次调频与AGC/AVC的协同控制逻辑。针对电网频率与电压稳定需求,详细阐述了三者在响应时序、控制目标上的分工与配合,并重点剖析了以RCL-0923装置为核心的指令融合架构与典型拓扑,为场站实现高效、稳定的协同运行提供了清晰的实践指导。

brown的博客 1059

编写WebService如此简单 - lua/python/c++

<br />基于starcore编写webservice,非常简单,不需要了解WSDL的细节,starcore仅为一共享库,很容易嵌入到其它应用中。<br />可以采用starcore支持的脚本语言,目前为python,lua和c++;语法风格一致。<br /> <br />lua的例子,仅需9行有效代码<br />require "libstarcore"<br />Service=libstarcore._InitSimple("WebServiceCallServer","123",0,3040)<b

srplab's blog 4644

液滴碰撞壁面的过程背景论文——bouncing反弹,spreading扩展,splashing飞溅。铺展过程介绍。还存在很多未解之谜。

【1993-德国-Phenomena of liquid drop impact on solid and liquid surfaces】液滴碰撞壁面的过程背景——bouncing反弹,spreading扩展,splashing飞溅。还存在很多未解之谜。还存在很多未解之谜。不同液滴形状碰撞过程。

qq_15963745的博客 199

45、使用 sqlread 函数将数据从数据库表导入 MATLAB

本文详细介绍了如何使用 MATLAB 中的 `sqlread` 函数从不同类型的数据库(如 Microsoft SQL Server 和 SQLite)中导入数据。文章涵盖了 `sqlread` 的基本语法、输入输出参数、使用示例以及注意事项,并通过多个实例演示了自定义导入选项、元信息检索和数据类型转换等内容。此外,还总结了导入数据库数据的通用流程及最佳实践建议,帮助用户更高效地进行数据分析和处理工作。

bash7scripter的博客 133

webservice 实例 创建与 调用

webservice 实例 创建与调用 序webservice 选型配置代码webservice 接口层接口实现实体webservice 挂靠配置启动服务测试服务测试:测试地址客户端生成环境配置代码生成 序 对接SAP系统,指定要用webservice 做对接。不然打死也不用webservice,感觉webService也实现不怎么流行了, 过程中遇到了不少问题。 就java webservice而言,框架就有不下十种。网上的教程更是五花八门,零零碎碎,并且很多误导。 本博将记录下项目里用的webservi

Richy的博客 890

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

webservice结合spring实现restful风格

webservice:是一种远程资源调用技术,通过调用远程系统的方法,主要进行必要数据的查询。 webservice三要素:soap,wsdl,uddi soap:这个是简单对象传输协议就是通过http+xml进行数据的传输。 wsdl:是webservice的使用说明书 有五个节点:服务视图,服务协议和参数的描述,服务实现,参数描述,参数类型描述。 uddi:目录 现在实现web

TalkLessDoMore的博客 1448

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

云原生 API 网关 APISIX 入门教程

它可以减少对你的端点的调用次数,也可以通过缓存上游的响应来改善对你的 API 请求的延迟。在很多时候,我们的 API 并不是处于一个非常安全的状态,它随时会收到不正常的访问,一旦访问流量突增,可能就会导致你的 API 发生故障,这个时候我们就可以通过速率限制来保护 API 服务,限制非正常的访问请求。我们这里主要了解的是 API 网关层的缓存,也就是 APISIX 提供的 API 缓存,它也可以和其他插件一起使用,目前支持基于磁盘的缓存,也可以在插件配置中指定缓存过期时间或内存容量等。

雨中深巷的油纸伞 1713

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Apache APISIX插件开发实战:如何用Lua编写自定义插件的完整教程

Apache APISIX作为高性能API网关,其强大的插件系统允许开发者通过Lua语言快速构建自定义功能。本文将为您提供从零开始开发APISIX插件的完整指南,涵盖插件结构、核心方法和最佳实践。 ## 🎯 为什么选择APISIX插件开发 Apache APISIX插件系统基于OpenResty和LuaJIT,提供极高的性能和灵活性。您可以在请求处理的各个阶段插入自定义逻辑,包括路由、访问控

gitblog_00038的博客 424

API、REST、RESTFUL

API API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。 [1] 用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。 百度百科 REST REST软件架构是由Roy Thomas Fielding博士在2000年首次提出的。REST软件架构是一个抽象的概念,是一种为了实现这一互联网的超媒体分布式系统的行动指南。 百度百科..

Jiao的博客 373
上一篇: java 调用webservice 并解析xml为json字符
下一篇: jsva json字符串 XML互转
FSW...
博客等级 码龄7年 18粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值