公司做的系统之间的交互用到了webservice做交互,现在对webservice做一个总结。

1.配置已有的webservice

webservice主要包括

  • xml/json:作为传输数据的格式
  • soap:(simple object access protocol)对于http做的封装,是webservice用的服务协议。也有一种说法是:http+xml+soap = webservice
  • wsdl:webservice define language:这是webservice的规范文件。

一般webservice的访问包括四种格式:

  1. http-get
  2. http-post
  3. soap-get
  4. soap-post

java对webservice的支持没有.net做的那么好,只能支持其中一种(soap-post),下面就用http-get使用HttpURLConnection做的webservice的调用

首先登陆http://www.webxml.com.cn/zh_cn/index.aspx右边有个最新webservice

这里用中文<>英文双向翻译web服务作为例子,打开页面点击其中的服务说明,如图所示(不好意思,qq截图不知道怎么的打不了中文,我就用简单的英文代替了)

打开:是关于这个webservice的WSDL文件,这个文件我们等下再去分析,我们此时只需要拖到最下面,找到http-get 所需要用的URL,最下面应该会有四种访问方式的URL,我们只需要http-get的就可以了。

url应该是:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx,然后我们回到上一个页面,选择:TranslatorSentenceString

这里不选上一个是因为java对webservice没有.net支持的那么好,没法用dataset去接,如图所示:

打开之后,发现需要输入参数wordkey:

我们可以开始写代码了,用HttpURLConnection写一个调用http-get方法的访问类。

package com.mz.webservice.b;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL; public class TransLatorService {
public void translate(String keyWord) {
//我们要调用的webservice的url地址,我们用拼接字符串的形式用?wordKey=xxx来进行拼接
String httpUrl = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx/Translator?wordKey="+keyWord; try {
URL url = new URL(httpUrl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置访问时间
conn.setConnectTimeout(5000);
//访问方式为get
conn.setRequestMethod("GET");
//如果连接成功,则把返回的数据读入buffer中
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream is = conn.getInputStream();
ByteArrayOutputStream boas = new ByteArrayOutputStream();
byte[] buffer = new byte[10240];
int len = -1;
while((len = is.read(buffer)) != -1) {
boas.write(buffer, 0, len);
}
System.out.println("the output is:" + boas.toString("UTF-8"));
boas.close();
is.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
TransLatorService ts = new TransLatorService();
ts.translate("death");
}
}

返回值应该是一个关于单词“death”的xml

the output is:<?xml version="1.0" encoding="utf-8"?>
<DataSet xmlns="http://WebXml.com.cn/">
<xs:schema id="Dictionary" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="Dictionary" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Trans">
<xs:complexType>
<xs:sequence>
<xs:element name="WordKey" type="xs:string" minOccurs="0" />
<xs:element name="Pron" type="xs:string" minOccurs="0" />
<xs:element name="Info" type="xs:string" minOccurs="0" />
<xs:element name="Translation" type="xs:string" minOccurs="0" />
<xs:element name="Mp3" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Refer">
<xs:complexType>
<xs:sequence>
<xs:element name="Rel" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Sentence">
<xs:complexType>
<xs:sequence>
<xs:element name="Orig" type="xs:string" minOccurs="0" />
<xs:element name="Trans" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
<Dictionary xmlns="">
<Trans diffgr:id="Trans1" msdata:rowOrder="0">
<WordKey>death</WordKey>
<Pron>deθ</Pron>
<Info />
<Translation>n. 死,死亡;死神</Translation>
<Mp3>1694.mp3</Mp3>
</Trans>
<Sentence diffgr:id="Sentence1" msdata:rowOrder="0">
<Orig>That motorbike will be the death of you.</Orig>
<Trans>那辆摩托车就会要了你的命。</Trans>
</Sentence>
<Sentence diffgr:id="Sentence2" msdata:rowOrder="1">
<Orig>That defeat meant the death of all my hopes.</Orig>
<Trans>那次失败毁灭了我所有的希望。</Trans>
</Sentence>
<Sentence diffgr:id="Sentence3" msdata:rowOrder="2">
<Orig>Car accident caused many deaths.</Orig>
<Trans>车祸造成很多人死亡。</Trans>
</Sentence>
</Dictionary>
</diffgr:diffgram>
</DataSet>

我们剩下需要做的就是对这个xml进行解析,自己封装一个解析类和方法,这样做是很费时费力的,所以java提供了一套自己的机制。

我们可以直接封装成实体类,直接调用方法,传递实体类返回实体类的方法来进行调用。

通过wsimport 命令进行生成相应的webservice的实体类。(提醒:必须配置java的环境变量,请自行上网参考,如果不会配置,并且需要jdk1.6_21的版本以上,否则会报错!并且,请保持项目中的jre和控制台版本的一致性!)

语法 wsimport [opations] <wsdl_uri>
- wsdl_uri:wsdl 的统一资源标识符
- d :指定要输出的文件的位置
- s :表示要解析java的源码 ,默认解析出的是class字节码
- p : 指定输出的包名

好比我们如果要把刚刚的webservice服务进行相应的实体类的转换,就是:

wsimport http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?WSDL

这里只会生成字节码文件,没有.java文件,并且字节码文件会出现在你控制台目前的路径下,所以这里先cd到了桌面,如图所示:

这里报错了,说明不能把相应的WSDL转为我们需要的代理类,那么我们就可以把相应的网页的xml报错到本地,命名随意,我就命名的a.xml(因为其实命令是解析一个wsdl文件,那么不管是解析网页的还是本地的其实是一样的)

找到相应的错误的地方(line 19 line 105)如图所示

既然没有办法解析,那么就把这一行删除掉,然后重新解析,命令如下:

cd Desktop(先转移到桌面,因为xml文件是报错在桌面的)

wsimport a.xml

warning是对其他几种方式的不能解析,所以没有error就算是解析成功了,如图所示:

如果需要相应的指定,需要:
wsimport -s ./ -p com.hp.webservice.getTranslatorInfo a.xml

这里的-s是指的要生成的源码地址,-p是包名,如下图所示:

这个时候就可以新建一个项目,然后把上面生成的java文件拷到src目录下(此处不截图了,因为我们要分析一个最重要的东西,就是WSDL文件)

首先必须说明WSDL文件是从下往上看的:

往回找,如图所示:

接着往上找:

接着向上找

最后找到参数类型:

tips:我知道有人会说那上面有的地方有中文解释为什么还要找,我只想说很多时候很多公司内部的WSDL文件没那么友好,至少我们公司就没有!所以还是一步一步的

找上去吧,还有一个是最后的返回类型是TranlatorResult,有人说找不到,这个是定义在别的xml文件里的,就不去找了,反正知道返回的是一个List就可以了,下一篇我们自己来创建webservice项目会再说明的

综上的WSDL文档所述:

  • 这个webservice的service name:EnglishChinese
  • 我们所用的soap:EnglishChineseSoap
  • 调用方法名:TranslatorString
  • 输入类型:String
  • 输出类型:TransLatorResult(在生成的代理文件里是AraayOfString)

好了,下面我们写一个测试类:

package com.hp.webservice.getTranslatorInfo.test;

import java.util.List;

import com.hp.webservice.getTranslatorInfo.ArrayOfString;
import com.hp.webservice.getTranslatorInfo.EnglishChinese;
import com.hp.webservice.getTranslatorInfo.EnglishChineseSoap; public class GetTranslatorTest {
public static void main(String[] args) {
//首先先获得一个服务
EnglishChinese eng = new EnglishChinese();
//通过服务获取其中一种的soap方式
EnglishChineseSoap soap = eng.getEnglishChineseSoap();
//调用translatorString方法,并且传递一个英文单词作为参数
ArrayOfString arrays = soap.translatorString("death");
//返回是一个webservice自定义的类型,我们需要通过getString方法获得List
List<String> infos = arrays.getString();
//通过xml文档分析,list中的第四个元素是单词释义,输出单词释义
System.out.println(infos.get(3));
}
}

输出结果应该是:

n. 死,死亡;死神

好了,到这里我们基本可以去使用别人的webservice了,自己建一个webservice项目下次再讲

java webservice 总结(学会读别人的webservice并且通过代理模式访问)的更多相关文章

  1. 【读书笔记】读《JavaScript设计模式》之代理模式

    一.定义 代理是一个对象,它可以用来控制对另一个对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替其实体被实例化,并使其可被远程访 ...

  2. JAVA安全基础之代理模式(一)

    JAVA安全基础之代理模式(一) 代理模式是java的一种很常用的设计模式,理解代理模式,在我们进行java代码审计时候是非常有帮助的. 静态代理 代理,或者称为 Proxy ,简单理解就是事情我不用 ...

  3. 【Java EE 学习 80 上】【WebService】

    一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...

  4. JAVA 调用Axis2 code generator 生成的webservice

    以下代码为调用 JAVA 调用Axis2 code generator 生成的webservice的代码. package test; import java.rmi.RemoteException; ...

  5. java中使用axis发布和调用webService及dom4j解析xml字符串

    工作中需要调用webService服务,这里记录一下如何在java中发布和调用webService. 需要的jar包: webService服务端: import javax.jws.WebMetho ...

  6. Java调用WebService方法总结(4)--Axis调用WebService

    Axis是比较常用的WebService框架,该项目在2006实现了最终版,后面就没有更新了.文中demo所使用到的软件版本:Java 1.8.0_191.Axis 1.4. 1.准备 参考Java调 ...

  7. Java调用WebService方法总结(2)--JAX-WS调用WebService

    用JAX-WS(Java API for XML Web Services)调用WebService不需要引入其他框架,都是JDK自带的:文中所使用到的软件版本:Java 1.8.0_191.Dom4 ...

  8. [置顶] WebService学习总结(1)——WebService相关概念

    一.序言 大家或多或少都听过 WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成 分.但是不得不承认的是W ...

  9. WebService学习--(三)使用JDK开发WebService

    一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ...

随机推荐

  1. php-redis扩展安装

    1 phpredis 在php中访问redis需要安装 https://github.com/phpredis/phpredis 基本上安装上面的readme既可以完成安装,需要注意的是在编译安装的时 ...

  2. WordPress访问打开速度很慢的几种解决方法

    最近WordPress网站访问特别的慢,有时间要加载一分钟才能完全打开,最初怀疑是服务器的问题,经过多方测试,还是没找到原因.后来,通过工具测出浏览器一直在加载fonts.googleapis.com ...

  3. Matlab 运行C程序出现的编译出错问题

    2016-03-18 17:18:34 最近在运行一些公开的Matlab代码包时,比如LibSVM.crfChain等,遇到了需要在Matlab环境下编译C程序的问题,对于我所遇到的问题,给出以下解决 ...

  4. The Rotation Game(IDA*算法)

    The Rotation Game Time Limit : 30000/15000ms (Java/Other)   Memory Limit : 300000/150000K (Java/Othe ...

  5. Web利器---fidder使用

    fiddler工具,主要看中其三点优势:1.功能强大,其他工具有的功能它也有,其他工具没有的功能它也有,支持http,https,ftp等协议:2.完全免费,长期免费.3.所有的浏览器可以使用,所有的 ...

  6. iOS 直播类APP开发流程分解:

    1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示1.数据采集:摄像机及拾音器收集视频及音频数据,此时得到的为原始数据涉及技术或协议:摄像机:CCD.C ...

  7. 一个简单的RMAN自动备份脚本

    rman备份脚本: #!/bin/bashsource /home/oracle/.bash_profile rman target / << EOFrun {allocate chann ...

  8. JDK 对应的设计模式

    一.设计模式是什么 (1)反复出现问题的解决方案 (2)增强软件的灵活性 (3)适应软件不断变化二.学习JDK中设计模式的好处 (1)借鉴优秀代码的设计,有助于提高代码设计能力 (2)JDK的设计中体 ...

  9. goalng 发布的版本中自动加上 git revision

    概述 起因是这样的,在编译发布 golang 工程时,希望版本号中包含有 git revision number. 但是,没有commit之前,是没法知道 revision number 的,comm ...

  10. 浅论Android网络请求库——android-async-http

    在iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http,目前非常火的应用Insta ...