ruby和python_Ruby,Python和Java中的Web服务

ruby和python

今天,我不得不准备一些示例来说明Web服务是可互操作的。 因此,我已经使用Metro使用Java创建了一个简单的Web服务,并在Tomcat上启动了它。

然后尝试使用Python和Ruby消耗它们。 这是全部完成的过程…

Java中的Web服务

我从Java中的简单Web服务开始:

package com.wordpress.jdevel.ws;import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;@WebService(serviceName = "Music")
public class Music {private static final File FOLDER = new File("D:/TEMP/SONGS");@WebMethod(operationName = "listSongs")public Song[] listSongs(@WebParam(name = "artist") String artist) {List<Song> songs = new ArrayList<Song>();System.out.println("ARTIST: " + artist);if (artist != null) {File folder = new File(FOLDER, artist);if (folder.exists() && folder.isDirectory()) {File[] listFiles = folder.listFiles(new FilenameFilter() {public boolean accept(File dir, String name) {return name.toUpperCase().endsWith(".MP3");}});for (File file : listFiles) {String fileName = file.getName();String author = file.getParentFile().getName();int size = (int) (file.length() / 1048576); //MegabytesSong song = new Song(fileName, author, size);songs.add(song);}}}return songs.toArray(new Song[songs.size()]);}@WebMethod(operationName = "listArtists")public String[] listArtists() {File[] folders = getFolders(FOLDER);List<String> artists = new ArrayList<String>(folders.length);for (File folder : folders) {artists.add(folder.getName());}return artists.toArray(new String[artists.size()]);}private File[] getFolders(File parent) {FileFilter filter = new FileFilter() {public boolean accept(File pathname) {return pathname.isDirectory();}};File[] folders = parent.listFiles(filter);return folders;}public static void main(String[] args) {Music listFiles = new Music();String[] artists = listFiles.listArtists();System.out.println("Artists: " + artists);for (String artist : artists) {Song[] listSongs = listFiles.listSongs(artist);for (Song song : listSongs) {System.out.println(song.getArtist() + " : " + song.getFileName() + " : " + song.getSize() + "MB");}}}
}

还需要一个简单的bean来获取一些更复杂的类型:

package com.wordpress.jdevel.ws;import java.io.Serializable;public class Song implements Serializable {String fileName;String artist;int size;public Song() {}public Song(String fileName, String artist, int size) {this.fileName = fileName;this.artist = artist;this.size = size;}public String getArtist() {return artist;}public void setArtist(String artist) {this.artist = artist;}public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public int getSize() {return size;}public void setSize(int size) {this.size = size;}
}

它只是在硬编码的FOLDER目录中列出所有子目录,并将其视为音乐收藏中的艺术家列表。 然后,您可以执行listSongs方法并在artist子文件夹中获取mp3文件的列表。

要使其成为Web服务,您要做的就是使用@WebService(serviceName =“ Music”)注释类,并且要公开为Web服务操作的每个方法都必须使用@WebMethod(operationName =“ listArtists”)进行标记。

如果您要在GlassFish上部署它,那么应该就这些了,但是我已经使用了Tomcat,因此还需要3个步骤:

1.将Metro 2.0罐子添加到WEB-INF / lib
2.将Metro servlet和侦听器添加到web.xml:

<listener><listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class>
</listener>
<servlet><servlet-name>Music</servlet-name><servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>Music</servlet-name><url-pattern>/Music</url-pattern>
</servlet-mapping>

您可能不应在此处进行任何更改。 只需将其粘贴到web-app节点中的web.xml中即可。

3.使用端点声明将sun-jaxws.xml文件添加到WEB-INF:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"><endpoint implementation="com.wordpress.jdevel.ws.Music" name="Music" url-pattern="/Music"/>
</endpoints>
  • 实现必须匹配您的@WebService类
  • 名称必须与@WebService批注中的serviceName匹配
  • url-pattern必须与您在servlet映射中声明的url-pattern匹配

如果您在NetBeans中创建XML文件,那么也不必编辑它们。

现在启动Tomcat并部署您的应用程序。 您应该可以通过类似以下方式访问服务

http:// localhost:8080 / WSServer /音乐

并看到这样的事情:

可以通过以下方式访问WSDL

http:// localhost:8080 / WSServer / Music?wsdl

复杂类型的架构:

http:// localhost:8080 / WSServer / Music?xsd = 1

如果您能正常工作,则可以从以下客户端开始。

Python客户端
我已经开始搜寻一些不错的python网络服务库,并找到了Suds。 我还没有真正使用过这样的东西。 实施WS客户大约花了15分钟。 当然,支持复杂类型的课程和上一次我使用Python编写大于5行的内容大约是3年前。 您真的必须尝试一下。

所以这是代码:

import sudsclass Client:def __init__(self):self.client = suds.client.Client("http://localhost:8080/WSServer/Music?wsdl")def get_artists(self):return self.client.service.listArtists()def get_songs(self, artist):return self.client.service.listSongs(artist)if(__name__ == "__main__"):client = Client()artists = client.get_artists()for artist in artists:print artistsongs = client.get_songs(artist)for song in songs:print "\t%s : %s : %d%s" % (song.fileName, song.artist, song.size, "MB")

而已。 简单明了。 WSDL被解析,复杂类型被动态生成。 美丽的东西。 对我来说,要实现这样的事情有点困难。

Ruby客户端
使用SOAP4R库。 只需执行

宝石安装soap4r

要获得它(真的很喜欢这个工具)。首先让我们从代码开始:

require 'soap/rpc/driver'
require 'soap/wsdlDriver'class Clientdef initializefactory = SOAP::WSDLDriverFactory.new("http://localhost:8080/WSServer/Music?wsdl")@driver = factory.create_rpc_driverenddef get_songs(artist)songs = @driver.listSongs(:artist => artist)return songsenddef get_artistsartists = @driver.listArtists(nil)return artistsend
enddef print_songs(songs)if songsend
endclient = Client.new
artists = client.get_artists
artists["return"].each{|artist|puts artistsongs = client.get_songs(artist)["return"];songs.each {|song| puts "\t%s : %s : %d%s" % [song.fileName, song.artist, song.size, "MB"]}
}

它的功能完全相同。 调用Web服务以获取艺术家列表,然后为每个艺术家调用mp3文件。 然后只需将所有内容打印到控制台即可。

我花了相当长的时间才能开始工作。 首先–很难找到任何文档。 其次– SOAP4R在没有一点黑客的情况下不能与ruby 1.9一起工作:

http://railsforum.com/viewtopic.php?id=41231

下一步–当您不使用WSDL创建驱动程序对象时,结果会稍微好一些,但是您必须确切地知道拥有什么并想要执行哪些服务。 在这个简单的示例中这不是问题,但是如果您需要使其更通用一些……您将会遇到麻烦。

我说“好一点”是什么意思? 一,代码:

@driver = SOAP::RPC::Driver.new("http://localhost:8080/WSServer/Music", "http://ws.jdevel.wordpress.com/");
@driver.add_method(ARTISTS_METHOD)
@driver.add_method(SONGS_METHOD, "artist")

这样,我负责声明要使用的服务的端点和名称空间。 我还需要声明我将要使用的所有操作以及参数(“作者”)。 有什么不同? 当我不使用WSDL时,SOAP4R库会从调用服务中提供更好的返回类型。 我可以简单地省略[“ return”]并得到类似使用Python的信息。

我需要在Ruby中知道的是每种复杂类型的外观如何,从而使我的实现对Web服务更改更加敏感。 如何知道应该使用哪个键来获取复杂类型的数据? 检查WSDL并查找要调用的操作:

<operation name="listArtists"><input wsam:Action="http://ws.jdevel.wordpress.com/Music/listArtistsRequest" message="tns:listArtists"/><output wsam:Action="http://ws.jdevel.wordpress.com/Music/listArtistsResponse" message="tns:listArtistsResponse"/>
</operation>

接下来在xsd中找到输出复杂类型

<xs:complexType name="listArtistsResponse"><xs:sequence><xs:element name="return" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/></xs:sequence>
</xs:complexType>

您需要的是name属性的值。 无论如何,这两种实现看起来都非常不错,而且更重要的是,它们可以正常工作。 Ruby和Python都有不错的Web服务库,可以处理复杂类型和WSDL解析。

参考:我们的JCG合作伙伴在“ Development world story”博客上 提供了Ruby,Python和Java的Web服务 。

相关文章 :
  • 具有Spring和Maven教程的JAX–WS
  • 用Jackson进行Java JSON处理
  • Spring 3 RESTful Web服务
  • jqGrid,REST,AJAX和Spring MVC集成

翻译自: https://www.javacodegeeks.com/2011/08/web-services-ruby-python-java.html

ruby和python

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

USB描述符【整理】

USB描述符 USB描述符信息存储在USB设备中&#xff0c;在枚举过程中&#xff0c;USB主机会向USB设备发送GetDescriptor请求&#xff0c;USB设备在收到这个请求之后&#xff0c;会将USB描述符信息返回给USB主机&#xff0c;USB主机分析返回来的数据&#xff0c;判断出该设备是哪一…

什么是垃圾回收?

以下是我们的垃圾收集手册中的一个示例&#xff0c;该手册将在接下来的几周内发布。 同时&#xff0c;花点时间熟悉垃圾收集的基础知识-这将是本书的第一章。 乍一看&#xff0c;垃圾收集应该处理顾名思义的问题-查找并丢弃垃圾。 实际上&#xff0c;它所做的恰恰相反。 垃圾收…

Extjs弹窗-简单文本编辑框-Ext.Msg.show

var datavalue测试202109;//文本传入数据 Ext.Msg.show({ title:标题, msg:说明, width:600, height:500, prompt:true, multiline:200, closable:true, …

word模板插入文本域并调整表格某一个行的列宽度

一、插入文本域 操作步骤&#xff1a;插入&#xff08;菜单&#xff09;->文档部件&#xff08;菜单&#xff09;->域&#xff08;菜单&#xff09;->邮件合并->输入名称->确认 二、调整word表格某个单元格宽度 选中某行&#xff0c;按住ctrl键的同时&#xf…

java泛型视频教程_Java泛型快速教程

java泛型视频教程泛型是Java SE 5.0引入的一种Java功能&#xff0c;在其发布几年后&#xff0c;我发誓那里的每个Java程序员不仅会听说过&#xff0c;而且已经使用过。 关于Java泛型&#xff0c;有很多免费和商业资源&#xff0c;而我使用的最佳资源是&#xff1a; Java教程 …

Windows上的Oracle Java

我最近为基于Windows 7的笔记本电脑下载了JDK 9的早期访问版本 &#xff08;内部版本68 &#xff09;。 由于这是早期版本&#xff0c;因此当自动安装在笔记本电脑上安装主要Java Runtime Environment&#xff08;JRE&#xff09;引入了一些不太理想的问题时&#xff0c;我并不…

extjs弹出窗口查看文本内容-new Ext.Window

代码样例&#xff1a; function processscan(){ var text时间 用户 操作<br> 时间 用户 操作<br> 时间 用户 操作; var win new Ext.Window({ layout: fit, width: 700, height: 600, closeAction: hide, dra…

Ioc Autofac心得

对于这个容器注入&#xff0c;个人也不是很熟悉&#xff0c;很多还不懂&#xff0c;只会基本的操作&#xff0c;几天把它记录下来&#xff0c;说不定以后帮助就大了呢&#xff0c;这方面跟安卓差距还是挺大的 下面记录下应用的流程 步骤&#xff1a; 1.添加应用 2.重写工厂&…

深入学习Web Service系列----异步开发模式

概述 在本篇随笔中&#xff0c;通过一些简单的示例来说一下Web Service中的异步调用模式。调用Web Service方法有两种方式&#xff0c;同步调用和异步调用。同步调用是程序继续执行前等候调用的完成&#xff0c;而异步调用在后台继续时&#xff0c;程序也继续执行&#xff0c;不…

navicate导出导入表数据问题

1.导出导入json&#xff0c;如下图&#xff0c;右击表点击导出向导&#xff0c;选择json导出类型&#xff0c;根据提示导出即可。 导入时&#xff0c;右击接收的表&#xff0c;点击导入向导&#xff0c;根据提示即可快速导入&#xff08;注&#xff1a;不同系统之间导出导入易…

tongweb通过控制台简单设置确认相关常用参数

1.环境版本 jdk&#xff0c;tongweb版本确认是否正确 2.检查tongweb的 license是不是永久版本&#xff0c;试用期版本到期会停止服务。 3 JVM运行编码配置-根据系统需要配置 3.1-Dfile.encodingUTF-8 编码根据系统需要配置 4. tongweb运行内存大小--根据系统需要配置 4.1一般 …

编译原理--LL(1)分析法实验C++

一、实验项目要求 1.实验目的 根据某一文法编制调试LL&#xff08;1&#xff09;分析程序&#xff0c;以便对任意输入的符号串进行分析。本次实验的目的主要是加深对预测分析LL&#xff08;1&#xff09;分析法的理解。 2.实验要求 对下列文法&#xff0c;用LL&#xff08;…

实际中进行GC调整

调优垃圾回收与任何其他性能调优活动没有什么不同。 您需要确保了解当前的情况和期望的结果&#xff0c;而不是因为对应用程序的随机部分进行调整而产生了诱惑。 通常&#xff0c;只需执行以下过程即可&#xff1a; 陈述您的绩效目标 运行测试 测量 与目标比较 进行更改并…

达梦数据库出现卡慢简单分析点

1.检查是否有锁表 查询锁表&#xff1a;select sess_id,sql_text from v$sessions sess,v$lock lck where sess.trx_idlck.trx_id and lck.blocked1; --查询僵死会话 解锁&#xff1a;根据会话ID&#xff0c;停止会话 sp_close_session(sess_id); 2.根据v$sessions,V$L…

SEL selector (二)

SEL消息机制工作原理是什么 引用下面文章&#xff1a; 我们在之前有提到,一个类就像一个 C 结构.NSObject 声明了一个成员变量: isa. 由于 NSObject 是所有类的根类,所以所有的对象都会有一个 isa 的成员变量[公共继承].而该 isa 变量指向该对象的类(图3.15)[类在Objective-C中…

mobile cpu上禁用alpha test的相关总结

因为&#xff0c;每家芯片的特性不同&#xff0c;根据向framebuffer写法的不同&#xff0c;分为tile-based的mobile cpu&#xff0c;如ImgTec PowerVR&#xff0c;ARM Mali&#xff0c;一部分老版本Qualcomm Adreno。还有标准的direct&#xff08;immediate&#xff09;的mobil…

达梦定时迁移数据

1. 生成迁移源代码 1.1 启动DM迁移工具&#xff08;bin/dts.exe&#xff09; 1.2 右击迁移管理空白处 -> 新建工程 1.3 展开工程 -> 右击迁移&#xff0c;新建迁移 -> 输入迁移名称&#xff0c;确认 1.4 右击迁移名称&#xff0c;打开 -> 输入源数据库连接信息&…

JSP教程–最终指南

编者注&#xff1a; JavaServer Pages&#xff08;JSP&#xff09;技术使您可以轻松创建同时包含静态和动态组件的Web内容。 JSP技术提供了Java Servlet技术的所有动态功能&#xff0c;但提供了一种更自然的方法来创建静态内容。 JSP技术的主要功能包括用于开发JSP页面的语言&…

tongweb6数据源使用中时常报空异常处理方式

1.在tongweb控制台 -> jdbc配置中设置数据源参数 1.1 勾选空闲超时&#xff0c;时间默认 1.2 勾选泄露超时时间 &#xff0c;时间为半天&#xff08;14400&#xff09; 1.3 勾选连接有效性检查、创建连接验证、获取连接验证、归还连接验证 图中设置泄露超时时间为900…

eclipse远程tomcat javaweb debug样例(windows)

1.tomcat配置可被远程debug端口参数 catalina.bat 中添加 set CATALINA_OPTS-Xdebug -agentlib:jdwptransportdt_socket,servery,suspendn,address8000 导出项目war包到tomcat/webapps/目录下 切换到tomcat/bin目录下 双击startup.bat启动运行项目 2.eclipse中启动远程debug…