Ruby,Python和Java中的Web服務

今天,我不得不準備一些示例來說明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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bzoj4199: [Noi2015]品酒大會

題面見http://uoj.ac/problem/131 一道后綴數組題 先求出height&#xff0c;然后從大到小枚舉每個height。 然后對于每個height值&#xff0c;兩端的集合中任意一對后綴的LCP都是這個height。 我們統計答案之后合并兩端的集合&#xff0c;用并查集維護即可。 1 #include<cst…

css中position初解

positon:static|absolute|relative|fiexd 1、static為默認值&#xff0c;沒有定位&#xff0c;元素出現在正常的文檔流中&#xff0c;忽略left,right,top,bottom,i-index值。 2、absolute為絕對定位&#xff0c;通過left,top等值對元素進行定位&#xff0c;定位時如果父元素的p…

零XML的Spring配置

Tomasz Nurkiewicz是我們的JCG合作伙伴之一&#xff0c;也是Spring框架的堅定支持者&#xff0c;在他的最新文章中描述了如何在不使用XML的情況下配置Spring應用程序。 注解方法在頂部。 查看他的教程&#xff1a; 沒有XML的Spring框架...根本&#xff01; 翻譯自: https://ww…

用動畫切換按鈕的狀態

用動畫切換按鈕的狀態 效果 源碼 https://github.com/YouXianMing/UI-Component-Collection // // BaseControl.h // BaseButton // // Created by YouXianMing on 15/8/27. // Copyright (c) 2015年 YouXianMing. All rights reserved. //#import <UIKit/UIKit.h> c…

iOS開發之學前了解

學iOS開發能做什么&#xff1f; iOS開發需要學習哪些內容&#xff1f; 先學習什么&#xff1f; 不管你是學習android開發還是iOS開發 都建議先學習UI&#xff0c;原因如下&#xff1a; UI是app的根基&#xff1a;一個app應該是先有UI界面&#xff0c;然后在UI的基礎上增加實用功…

力扣gupiao

給定一個數組 prices &#xff0c;它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只股票&#xff0c;并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。 返回你可以從這筆交易中獲取的最大利潤。…

Java相當好的隱私(PGP)

公鑰加密 這篇文章討論了PGP或“很好的隱私”。 PGP是常規加密和公用密鑰加密的混合實現。 在詳細介紹PGP之前&#xff0c;讓我們先談談公鑰加密。 與其他任何加密技術一樣&#xff0c;公鑰加密解決了通過不安全介質傳輸安全數據的問題。 即互聯網。 結果&#xff0c;該方案的…

HDU 5691 Sitting in Line 狀壓dp

Sitting in Line題目連接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid5691 Description 度度熊是他同時代中最偉大的數學家&#xff0c;一切數字都要聽命于他。現在&#xff0c;又到了度度熊和他的數字仆人們玩排排坐游戲的時候了。游戲的規則十分簡單&#xff0c…

hello oc

printf("Hello C\n"); //OC可以采用C語言的輸出方式 printf("The number is %d\n",100);//%d 輸出數字 printf("Hello %s\n","XiaoMing");//%s 輸出字符 NSLog("Hello Objective-C"); //采用oc的輸出&#xff0c;前面帶了一…

Spring3 RESTful Web服務

Spring 3提供了對RESTful Web服務的支持。 在本教程中&#xff0c;我們將向您展示如何在Spring中實現RESTful Web服務 &#xff0c;或者如何將現有的Spring服務公開為RESTful Web服務 。 為了使事情變得更有趣&#xff0c;我們將從上一篇關于Spring GWT Hibernate JPA Infinisp…

zoj 3765 塊狀鏈表 OR splay

各種操作o(╯□╰)o...不過都挺簡單&#xff0c;不需要lazy標記。 方法1&#xff1a;塊狀鏈表 塊狀鏈表太強大了&#xff0c;區間操作實現起來簡單暴力&#xff0c;效率比splay稍微慢一點&#xff0c;內存開銷小很多。 1 #include <iostream>2 #include <cstring>3…

【C#公共幫助類】 Image幫助類

大家知道&#xff0c;開發項目除了數據訪問層很重要外&#xff0c;就是Common了&#xff0c;這里就提供了強大且實用的工具。 【C#公共幫助類】 Convert幫助類 Image類&#xff1a; using System; using System.Collections.Generic; using System.Text; using System.IO; usin…

Java泛型快速教程

泛型是Java SE 5.0引入的一種Java功能&#xff0c;在其發布幾年后&#xff0c;我發誓那里的每個Java程序員不僅聽說過它&#xff0c;而且已經使用過它。 關于Java泛型&#xff0c;有很多免費和商業資源&#xff0c;而我使用的最佳資源是&#xff1a; Java教程 Java泛型和集合…

876. 鏈表的中間結點

給定一個頭結點為 head 的非空單鏈表&#xff0c;返回鏈表的中間結點。 如果有兩個中間結點&#xff0c;則返回第二個中間結點 代碼一&#xff1a; 自己想的一個方法 class Solution {public ListNode middleNode(ListNode head) {ListNode p1 head;ListNode p2 head;//i,j…

Hive查詢Join

Select a.val,b.val From a [Left|Right|Full Outer] Join b On (a.keyb.key); 現有兩張表&#xff1a;sales 列出了人名及其所購商品的 ID&#xff1b;things 列出商品的 ID 和名稱&#xff1a; hive> select * from sales; OK Joe 2 Hank 4 Ali 0 Eve 3 Ha…

jquery 獲取easyui combobox選中的值

$(#comboboxlist).combobox(getValue);轉載于:https://www.cnblogs.com/ftm-datablogs/p/5526857.html

調度Java應用程序中的主體

許多項目需要計劃功能&#xff0c;例如我們計劃的工作&#xff0c;重復的工作&#xff0c;異步執行等。 我們的首選方法是使用企業工作調度程序&#xff0c;例如OpenSymphony的Quartz。 使用計劃任務進行編碼時&#xff0c;最棘手的部分之一是執行部分。 這里的主要經驗法則是…

繼承映射關系 joinedsubclass的查詢

會出現下面這樣的錯一般是配置文件中的mapping和映射文件中的package路徑或者class中的name路徑不一致 org.hibernate.MappingException: Unknown entity: com.zh.hibernate.joinedsubclass.Student at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(Sessi…

Spark系列—02 Spark程序牛刀小試

一、執行第一個Spark程序 1、執行程序 我們執行一下Spark自帶的一個例子&#xff0c;利用蒙特卡羅算法求PI&#xff1a; 啟動Spark集群后&#xff0c;可以在集群的任何一臺機器上執行一下命令&#xff1a; /home/spark/spark-1.6.1-bin-hadoop2.6/bin/spark-submit \ --class o…

JVM選項:-client vs -server

您是否曾經在運行Java應用程序時想知道-client或-server開關是什么&#xff1f; 例如&#xff1a; javaw.exe -client com.blogspot.sdoulger.LoopTest也顯示在java.exe的“幫助”中&#xff0c;例如&#xff0c;其中的選項包括&#xff1a; -client選擇“客戶端” VM -serv…