今天,我不得不准备一些示例来说明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文件,则也无需编辑这些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处理
  • Spring3 RESTful Web服务
  • jqGrid,REST,AJAX和Spring MVC集成

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

Ruby,Python和Java中的Web服务相关推荐

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

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

  2. 通过 Lotus Domino Java 代理消费 Web 服务

    Web 服务是一种允许两台或更多的计算机在网络中交互的系统设计.这种服务的主要优点是,它是在多台不同操作系统的计算机和应用服务器之间发送对象的标准解决方法.例如,我们的公司使用 Web 服务从一台运行 ...

  3. 在ASP.NET AJAX 1.0框架中访问Web服务

    一. 简介     如今,微软最新推出的AJAX框架为ASP.NET AJAX 1.0(下载地址为[url]http://ajax.asp.net/downloads/default.aspx[/ur ...

  4. Java中Socket通信-服务端和客户端双向传输字符串实现

    场景 什么是socket 在计算机通信领域,socket 被翻译为"套接字",它是计算机之间进行通信的一种约定或一种方式.通过 socket 这种约定,一台计算机可以接收其他计算机 ...

  5. 码这么多字只为搞懂如何在Python和Java中使用JSON

    目录 1 JSON是什么? 1.1 JSON是众多编程语言共同的"简谱" 1.2 JSON是一种高度结构化的文本 2 如何在Python中使用JSON 2.1 内置库json的编码 ...

  6. 使用Java的RESTful Web服务

    REST代表"代表性状态转移",由Roy Fielding于2000年在其论文"建筑风格和基于网络的软件体系结构设计"中首次提出. REST是一种建筑风格. H ...

  7. [转载] Python和java中的垃圾回收机制

    参考链接: Python中的垃圾回收 Python的垃圾回收机制 Python的垃圾回收机制有两种(也可以说一种:叫引用计数): 一是引用计数, 二是隔代回收. 引用计数 引用计数原理: 当数据的引用 ...

  8. 【Java中的Web容器】

    1.Web容器   web容器给处于其中的应用程序组件(JSP.Servlet)提供一个环境,使JSP.Servlet直接依靠容器中的环境变量交互,不用关注其他系统问题,主要由WEB服务器实现. J2 ...

  9. java 令牌作用_使用令牌(Java)保护REST Web服务

    背景: >我需要使用令牌为REST Web服务实现安全性 > Web服务旨在与Java客户端一起使用.因此,形式 凭据的身份验证和弹出窗口无用. >我是REST安全和加密的新手 这是 ...

最新文章

  1. 使有用计算机不注意卫生,对您有用的与电脑清洁相关的知识
  2. 通过配置的方式Autofac 《第三篇》
  3. CNCF宣布Envoy项目正式毕业
  4. Dockerfile指令详解: CMD 容器启动命令
  5. C语言Stock span 库存跨度问题(附完整源码)
  6. OpenVINO 从yml处提取model下载链接,以mobile-ssd为例
  7. Django,再谈json序列化
  8. CSS标签选择器(二)
  9. UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测
  10. 进程的创建fork vs vfork
  11. Axure RP 9 for mac 高保真原型图 - 案例18 【导航栏-展开、收起】导入元件库
  12. 计算机操作基本技能知识,计算机基本操作技能考核知识点
  13. Cesium 高性能扩展之DrawCommand(二):OSGB倾斜模型展示应用
  14. python中%d_python中%d是什么
  15. PageObject(PO)设计模式在 UI 自动化中的实践总结(以 QQ 邮箱登陆为例)
  16. X-FRAME-OPTIONS 出现两个或多个的原因
  17. Web端和App端测试区别
  18. Java霸王的大陆梦幻版_三国志霸王的大陆,喜欢三国的进
  19. 关于安装李沐深度学习d2l包报错的解决办法(保姆教程)
  20. 来看看怎么通过a标签打开一个对话框

热门文章

  1. java8 streams_Java 8 Streams:过滤和谓词否定
  2. grpc 流式传输_编写下载服务器。 第一部分:始终流式传输,永远不要完全保留在内存中...
  3. junit runner_了解JUnit的Runner架构
  4. mock测试使用断言_使用自定义断言丰富测试代码
  5. 分而治之_编写干净的测试–分而治之
  6. spring roo_使用Spring Roo进行概念验证
  7. .net2.0 orm_Hibernate 4.3 ORM工具
  8. 无服务器:不费吹灰之力!
  9. 异步过程的自动化测试
  10. Java 9和应用程序性能监视的激动人心之处