`
leon1509
  • 浏览: 546047 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

groovy编写webservice服务端和客户端(含连接数据并输出JSON数据)

阅读更多
个人总结,网上几乎没有此方面资料,有一篇帖子,按照其内容无法运行。
注意:请以帖子内容为准,附件为参考

环境:windows7+jdk1.6.0.31+groovy1.8.6

1. 安装jdk和groovy并配置环境变量,略。
2. 安装groovyws0.5.2
命令行>:grape install org.codehaus.groovy.modules groovyws 0.5.2

3. 编写服务(这里写2个例子,一个是算术、一个是格式化日期):
  1)算术服务
class MathService {
	double add(double arg0, double arg1) {
		return (arg0 + arg1)
	}
	double square(double arg0) {
		return (arg0 * arg0)
	}
}

  2)格式化日期服务
class DateFormatService{
	String format(long time){
		new Date(time).format('yyyy年MM月dd日')
	}
}


3. 编写服务启动groovy脚本
import groovyx.net.ws.WSServer
@Grab(group='org.codehaus.groovy.modules', module='groovyws', version='0.5.2')
def server = new WSServer()
server.setNode("DateFormatService", "http://10.14.3.149:6980/DateFormatService")
server.start()
def s1 = new WSServer()
s1.setNode("MathService", "http://10.14.3.149:6980/MathService")
s1.start()


4. 编写客户端测试groovy脚本
import groovyx.net.ws.WSClient

@Grab(group='org.codehaus.groovy.modules', module='groovyws', version='0.5.2')
def printDate(){
	def proxy = new WSClient("http://10.14.3.149:6980/DateFormatService?wsdl", this.class.classLoader)
	proxy.initialize()
	println "今天是${proxy.format(new Date().time)}"
}
printDate()



============= 华丽的分割线 =================
补充:编写连接数据库的服务并返回JSON格式数据

DataService.groovy
import groovy.sql.Sql
import groovy.json.JsonOutput

class DataService{
	String poses(){
		def db = Sql.newInstance("jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.14.3.148)(PORT = 1521)))(CONNECT_DATA =(SID = orcl)))","ecard","ecard","oracle.jdbc.driver.OracleDriver")
		def poses = db.rows("select * from OCS_DM_Terminal ")
		def retJson = new JsonOutput()
		return retJson.toJson(poses)
	}
}


并添加到服务启动的groovy脚本中:
import groovyx.net.ws.WSServer
@Grab(group='org.codehaus.groovy.modules', module='groovyws', version='0.5.2')
def server = new WSServer()
server.setNode("DateFormatService", "http://10.14.131.114:6980/DateFormatService")
server.start()
def s1 = new WSServer()
s1.setNode("MathService", "http://10.14.131.114:6980/MathService")
s1.start()
def s2 = new WSServer()
s2.setNode("DataService", "http://10.14.131.114:6980/DataService")
s2.start()


调用方法1:
import groovyx.net.ws.WSClient

@Grab(group='org.codehaus.groovy.modules', module='groovyws', version='0.5.2')
def test(){
	def url = "http://10.14.131.114:6980/DataService?WSDL"
	def proxy = new WSClient(url, this.class.classLoader)
	proxy.initialize()
	def ret = proxy.poses()
	println ret.toString()
}

test()


输出结果:
[{"ID":181,"SYS_CODE":"02","CLIENT_ID":null,"GROUP_ID":24,"MERC_NO":41,"TYPE":null,"KIND":6,"STATIONNO":2,"NAME":null,"STATIONNO_ID":null,"DESCRIPTION":
null,"BANK_ID":"10019999","SET_DATE":"2011-10-08T08:32:29+0000","FLAG":"0","BLACK_FLAG":0,"CANCEL_BLACK_FLAG":0,"BLACK_LIST_ID":0,"TERM_NAME":null,"MENU
_VERSION":"0","BATCHNO":"000000"},{"ID":161,"SYS_CODE":"04","CLIENT_ID":null,"GROUP_ID":205,"MERC_NO":1,"TYPE":null,"KIND":6,"STATIONNO":4,"NAME":null,"
STATIONNO_ID":null,"DESCRIPTION":null,"BANK_ID":"55555555","SET_DATE":"2011-09-17T03:38:33+0000","FLAG":"1","BLACK_FLAG":0,"CANCEL_BLACK_FLAG":0,"BLACK_
LIST_ID":0,"TERM_NAME":null,"MENU_VERSION":"0","BATCHNO":"000000"},{"ID":101,"SYS_CODE":"01","CLIENT_ID":205,"GROUP_ID":124,"MERC_NO":1,"TYPE":"11","KIN
D":7,"STATIONNO":1,"NAME":null,"STATIONNO_ID":null,"DESCRIPTION":null,"BANK_ID":"22019999","SET_DATE":"2011-09-26T08:40:24+0000","FLAG":"0","BLACK_FLAG"
:0,"CANCEL_BLACK_FLAG":0,"BLACK_LIST_ID":0,"TERM_NAME":null,"MENU_VERSION":"0520110916170215","BATCHNO":"000012"},{"ID":102,"SYS_CODE":"02","CLIENT_ID":
26,"GROUP_ID":24,"MERC_NO":41,"TYPE":"11","KIND":8,"STATIONNO":1,"NAME":null,"STATIONNO_ID":null,"DESCRIPTION":null,"BANK_ID":"11019999","SET_DATE":"201
1-09-16T05:37:24+0000","FLAG":"1","BLACK_FLAG":0,"CANCEL_BLACK_FLAG":0,"BLACK_LIST_ID":0,"TERM_NAME":null,"MENU_VERSION":"0520110906111247","BATCHNO":"0
00000"},{"ID":121,"SYS_CODE":"01","CLIENT_ID":null,"GROUP_ID":124,"MERC_NO":1,"TYPE":null,"KIND":6,"STATIONNO":2,"NAME":null,"STATIONNO_ID":null,"DESCRI
PTION":null,"BANK_ID":"33019999","SET_DATE":"2011-10-08T01:34:28+0000","FLAG":"0","BLACK_FLAG":0,"CANCEL_BLACK_FLAG":0,"BLACK_LIST_ID":0,"TERM_NAME":nul
l,"MENU_VERSION":"0520110916170215","BATCHNO":"000000"},{"ID":141,"SYS_CODE":"01","CLIENT_ID":null,"GROUP_ID":124,"MERC_NO":41,"TYPE":null,"KIND":9,"STA
TIONNO":3,"NAME":null,"STATIONNO_ID":null,"DESCRIPTION":null,"BANK_ID":"33333333","SET_DATE":"2011-10-10T08:19:57+0000","FLAG":"0","BLACK_FLAG":0,"CANCE
L_BLACK_FLAG":0,"BLACK_LIST_ID":0,"TERM_NAME":null,"MENU_VERSION":"0","BATCHNO":"000000"},{"ID":201,"SYS_CODE":"02","CLIENT_ID":325,"GROUP_ID":24,"MERC_
NO":41,"TYPE":"11","KIND":8,"STATIONNO":3,"NAME":"\u89E6\u6478\u5C4F","STATIONNO_ID":"3","DESCRIPTION":null,"BANK_ID":"10010001","SET_DATE":"2011-10-09T
09:35:50+0000","FLAG":"0","BLACK_FLAG":0,"CANCEL_BLACK_FLAG":0,"BLACK_LIST_ID":0,"TERM_NAME":null,"MENU_VERSION":"0","BATCHNO":"000000"}]


调用方法2:
import groovyx.net.ws.WSClient
import groovy.json.JsonSlurper

@Grab(group='org.codehaus.groovy.modules', module='groovyws', version='0.5.2')
def test(){
	def url = "http://10.14.131.114:6980/DataService?WSDL"
	def proxy = new WSClient(url, this.class.classLoader)
	proxy.initialize()
	def ret = proxy.poses()
	def slurper = new JsonSlurper()
	def states = slurper.parseText(ret)

	states.each{
		println it.NAME
	}
//	println ret
}

test()


输出结果:
null
null
null
null
null
null
触摸屏


调用方法3:
import groovyx.net.ws.WSClient
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
import groovy.json.JsonBuilder

@Grab(group='org.codehaus.groovy.modules', module='groovyws', version='0.5.2')
def test(){
	def url = "http://10.14.131.114:6980/DataService?WSDL"
	def proxy = new WSClient(url, this.class.classLoader)
	proxy.initialize()
	def ret = proxy.poses()
	def slurper = new JsonSlurper()
	def states = slurper.parseText(ret)

	def x = new JsonBuilder (states)
	println x.toPrettyString()
	//println JsonOutput.prettyPrint(states.toString())

/*	states.each{
		println it.NAME
	}*/
//	println ret
}

test()


输出结果:
[
    {
        "GROUP_ID": 24,
        "TERM_NAME": null,
        "NAME": null,
        "DESCRIPTION": null,
        "CLIENT_ID": null,
        "STATIONNO": 2,
        "MENU_VERSION": "0",
        "BLACK_FLAG": 0,
        "MERC_NO": 41,
        "BATCHNO": "000000",
        "SET_DATE": "2011-10-08T08:32:29+0000",
        "ID": 181,
        "SYS_CODE": "02",
        "BANK_ID": "10019999",
        "BLACK_LIST_ID": 0,
        "STATIONNO_ID": null,
        "KIND": 6,
        "CANCEL_BLACK_FLAG": 0,
        "FLAG": "0",
        "TYPE": null
    },
    {
        "GROUP_ID": 205,
        "TERM_NAME": null,
        "NAME": null,
        "DESCRIPTION": null,
        "CLIENT_ID": null,
        "STATIONNO": 4,
        "MENU_VERSION": "0",
        "BLACK_FLAG": 0,
        "MERC_NO": 1,
        "BATCHNO": "000000",
        "SET_DATE": "2011-09-17T03:38:33+0000",
        "ID": 161,
        "SYS_CODE": "04",
        "BANK_ID": "55555555",
        "BLACK_LIST_ID": 0,
        "STATIONNO_ID": null,
        "KIND": 6,
        "CANCEL_BLACK_FLAG": 0,
        "FLAG": "1",
        "TYPE": null
    },
    {
        "GROUP_ID": 124,
        "TERM_NAME": null,
        "NAME": null,
        "DESCRIPTION": null,
        "CLIENT_ID": 205,
        "STATIONNO": 1,
        "MENU_VERSION": "0520110916170215",
        "BLACK_FLAG": 0,
        "MERC_NO": 1,
        "BATCHNO": "000012",
        "SET_DATE": "2011-09-26T08:40:24+0000",
        "ID": 101,
        "SYS_CODE": "01",
        "BANK_ID": "22019999",
        "BLACK_LIST_ID": 0,
        "STATIONNO_ID": null,
        "KIND": 7,
        "CANCEL_BLACK_FLAG": 0,
        "FLAG": "0",
        "TYPE": "11"
    },
    {
        "GROUP_ID": 24,
        "TERM_NAME": null,
        "NAME": null,
        "DESCRIPTION": null,
        "CLIENT_ID": 26,
        "STATIONNO": 1,
        "MENU_VERSION": "0520110906111247",
        "BLACK_FLAG": 0,
        "MERC_NO": 41,
        "BATCHNO": "000000",
        "SET_DATE": "2011-09-16T05:37:24+0000",
        "ID": 102,
        "SYS_CODE": "02",
        "BANK_ID": "11019999",
        "BLACK_LIST_ID": 0,
        "STATIONNO_ID": null,
        "KIND": 8,
        "CANCEL_BLACK_FLAG": 0,
        "FLAG": "1",
        "TYPE": "11"
    },
    {
        "GROUP_ID": 124,
        "TERM_NAME": null,
        "NAME": null,
        "DESCRIPTION": null,
        "CLIENT_ID": null,
        "STATIONNO": 2,
        "MENU_VERSION": "0520110916170215",
        "BLACK_FLAG": 0,
        "MERC_NO": 1,
        "BATCHNO": "000000",
        "SET_DATE": "2011-10-08T01:34:28+0000",
        "ID": 121,
        "SYS_CODE": "01",
        "BANK_ID": "33019999",
        "BLACK_LIST_ID": 0,
        "STATIONNO_ID": null,
        "KIND": 6,
        "CANCEL_BLACK_FLAG": 0,
        "FLAG": "0",
        "TYPE": null
    },
    {
        "GROUP_ID": 124,
        "TERM_NAME": null,
        "NAME": null,
        "DESCRIPTION": null,
        "CLIENT_ID": null,
        "STATIONNO": 3,
        "MENU_VERSION": "0",
        "BLACK_FLAG": 0,
        "MERC_NO": 41,
        "BATCHNO": "000000",
        "SET_DATE": "2011-10-10T08:19:57+0000",
        "ID": 141,
        "SYS_CODE": "01",
        "BANK_ID": "33333333",
        "BLACK_LIST_ID": 0,
        "STATIONNO_ID": null,
        "KIND": 9,
        "CANCEL_BLACK_FLAG": 0,
        "FLAG": "0",
        "TYPE": null
    },
    {
        "GROUP_ID": 24,
        "TERM_NAME": null,
        "NAME": "触摸屏",
        "DESCRIPTION": null,
        "CLIENT_ID": 325,
        "STATIONNO": 3,
        "MENU_VERSION": "0",
        "BLACK_FLAG": 0,
        "MERC_NO": 41,
        "BATCHNO": "000000",
        "SET_DATE": "2011-10-09T09:35:50+0000",
        "ID": 201,
        "SYS_CODE": "02",
        "BANK_ID": "10010001",
        "BLACK_LIST_ID": 0,
        "STATIONNO_ID": "3",
        "KIND": 8,
        "CANCEL_BLACK_FLAG": 0,
        "FLAG": "0",
        "TYPE": "11"
    }
]
  • ws.rar (919 Bytes)
  • 下载次数: 22
分享到:
评论

相关推荐

    基于遗传算法神经网络的抗乳腺癌候选药物优化建模.zip

    基于遗传算法神经网络的抗乳腺癌候选药物优化建模.zip

    ffmpeg修复flv+h265支持问题的文件修改包

    FFmpeg是一款功能强大的开源多媒体处理工具,广泛应用于视频和音频的编码、解码、转换以及流媒体处理。然而,由于历史原因和标准限制,原生的FFmpeg并不支持将H.265(高效视频编码)格式的视频流封装到FLV(Flash Video)容器中。FLV是一种常见的网络流媒体传输格式,但其最初设计时并未考虑现代高效的H.265编码标准。因此,当尝试将H.265编码的视频与FLV容器结合时,会出现“Video codec hevc not compatible with flv”的错误提示,表明FFmpeg无法识别这种组合。 为了解决这一问题,开发者通常需要对FFmpeg的源代码进行修改和扩展。一个名为“用于解决ffmpeg不支持flv+h265需要修改的文件.zip”的压缩包中包含了一些源代码文件,这些文件旨在扩展FFmpeg的功能,使其能够处理FLV容器中的H.265编码内容。压缩包中的三个关键文件分别是“flvdec.c”“flvenc.c”和“flv.h”,它们分别对应FLV的解码器、编码器和头文件。 flvdec.c:这是FFmpeg的FLV解码器源代码,经过修改后可能支持读取和解析包含H.265数据的FLV流。解码器的作用是从FLV容器中提取视频数据,并将其转换为可处理的原始像素格式。 flvenc.c:这个文件包含FLV编码器的源代码,经过调整后可能允许将H.265编码的视频流封装到FLV容器中。编码器负责将原始视频数据编码为H.265格式,并将其打包到FLV文件中。 flv.h:这是一个头文件,定义了FLV格式相关的常量、结构体和函数原型。修改该文件可能涉及添加或更新与H.265支持相关的定义和接口。 要应用这些修改,开发者需要重新编译FFmpeg源代码,并将修改后的版本替换原有的FFmpeg安装。这样,用户就可以使用定制版的FFmpeg来处理FLV+H.265的

    IBMPC服务器故障诊作业流程.docx

    IBMPC服务器故障诊作业流程.docx

    上行SC-FDMA协作通信系统中联合SFBC编码的物理层加密传输方案.zip

    上行SC-FDMA协作通信系统中联合SFBC编码的物理层加密传输方案.zip

    Python示例源码-Python自动绘图-大作业.zip

    Python示例源码-Python自动绘图-大作业.zip

    泛微协同OA助力流程管理4步走.pdf

    泛微协同OA助力流程管理4步走.pdf

    Python示例源码-从列表中随机选词-大作业.zip

    Python示例源码-从列表中随机选词-大作业.zip

    ios游戏开发--Cocos2D-x中的物理引擎名师公开课获奖课件百校联赛一等奖课件.pptx

    ios游戏开发--Cocos2D-x中的物理引擎名师公开课获奖课件百校联赛一等奖课件.pptx

    LabVIEW串口DataSocketTCPWeb专业知识讲座.pptx

    LabVIEW串口DataSocketTCPWeb专业知识讲座.pptx

    java前端开发毕业设计.docx

    java前端开发毕业设计.docx

    Labview串口通信开发实例.doc

    Labview串口通信开发实例.doc

    西门子PLC在大型项目包膜机中的智能控制与通讯协议应用 · 触摸屏程序

    内容概要:本文详细介绍了在一个大型包膜机项目中,西门子PLC的应用及其相关技术细节。项目采用西门子PLC作为核心控制器,配合气缸、机械手、模拟量等硬件设备,通过软件博图实现自动化控制。文中重点讨论了PLC的硬件配置、FB块的应用、Modbus RTU通讯的优化、威纶通触摸屏程序的构建以及PTO控制20个轴的具体实现方法。通过对各个部分的技术解析,展示了PLC在复杂工业环境中的卓越性能和稳定性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和控制系统有研究的人群。 使用场景及目标:适用于需要深入了解PLC在大型项目中的应用,特别是涉及气缸、机械手、模拟量等硬件设备的自动化控制系统的开发和维护。目标是提升生产效率和质量,确保系统的稳定性和可靠性。 其他说明:本文不仅提供了理论指导,还结合了实际案例,帮助读者更好地理解和掌握PLC在工业自动化中的应用。

    java笔试题以及答案.pdf

    java笔试题以及答案.pdf

    基于FLUENT超声振动流场的数值模拟.zip

    基于FLUENT超声振动流场的数值模拟.zip

    基于ANSYS的微流控芯片装载系统夹具建模与仿真分析.zip

    基于ANSYS的微流控芯片装载系统夹具建模与仿真分析.zip

    基于HyperWorks的重型自卸汽车车架有限元分析和改进设计.pdf

    基于HyperWorks的重型自卸汽车车架有限元分析和改进设计.pdf

    Python源码-商城源码.zip

    Python源码-商城源码.zip

    Python示例源码-请假条-大作业.zip

    Python示例源码-请假条-大作业.zip

    三菱FX3U PLC两轴控制程序详解:XZ轴点动、回零与定位功能及编程技巧

    内容概要:本文详细介绍了三菱FX3U系列PLC的两轴(XZ轴)控制程序,涵盖点动、回零、相对与绝对定位等功能的具体实现。文章通过具体的梯形图代码解释了各个功能模块的工作原理,如手动模式下的点动控制、回零时的近点信号抖动处理以及绝对定位中的指令执行完成标志处理等。此外,文中还提供了许多实际应用中的注意事项和技术细节,如脉冲定时器的使用、模式切换时的速度渐变处理等。同时,附带的故障代码表为实际调试提供了极大的便利。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是对三菱FX3U PLC有初步了解并希望深入掌握其两轴控制程序的人群。 使用场景及目标:适用于需要理解和编写三菱FX3U PLC两轴控制程序的场合,帮助用户快速上手并解决常见问题,提高编程效率和系统稳定性。 其他说明:本文不仅提供了详细的程序解析,还包括了许多来自实际项目的经验分享,有助于读者更好地理解和应对实际工程中的挑战。

    Python示例源码-S3文件上传-大作业.zip

    Python示例源码-S3文件上传-大作业.zip

Global site tag (gtag.js) - Google Analytics