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: 
您可能不應在此處進行任何更改。 只需將其粘貼到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
總結
以上是生活随笔為你收集整理的ruby和python_Ruby,Python和Java中的Web服务的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 电脑怎么连上没账号没密码的网络(电脑没有
- 下一篇: MacBook电脑一键压缩文件电脑上如何
