一、WebService简介
WebService(XML Web Service WebService)是一种可以接收并响应从Internet上的其他系统中传递过来的请求,轻量级的独立通讯技术。通过SOAP在Web上提供软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。WebService是一种跨编程语言和跨操作系统的平台的远程调用技术。
二、WebService三要素
SOAP(Simple Object Access Protocol)、WSDL(WebService Description Language)、UDDI(Universal Description Discovery and Integration)构成了WebService的三要素。下面详细阐述这三大技术。
2.1 SOAP
WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和接收的结果内容都采用XML格式进行封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP协议提供了标准的RPC(运程调用技术)方法来调用WebService。
SOAP协议组成:
SOAP协议 = HTTP协议 + XML数据格式
SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,XML是SOAP的数据编码方式。
2.2 WSDL
好比我们去商店买东西,首先需要要知道商店的地址在哪里,商店有什么商品可以供我们购买,以及商品的价格等等。商家的做法就是贴一张商店商品的宣传海报。WebService也一样,WebService客户端要调用一个WebService服务,首先要知道这个WebService服务的地址在哪里,以及在这个WebService服务中我们可以调用哪些方法。所以WebService服务端首先要通过一个WSDL文件来说明自己有哪些服务可以供外界调用(就是对外界说明这个服务端中有哪些方法可以调用,方法的参数是什么,方法的返回值是什么等),以及说明服务的网络地址用哪个url表示,服务通过什么调用。
所以,简单来说,WSDL是一个基于XML语言,用于描述Webservice(函数、参数、返回值)的语言。它是WebService客户端和服务端都能理解的标准格式。
2.3 UDDI
UDDI是一个跨产业,跨平台的开发性架构,可以帮助Web服务提供商在互联网上发布Web服务的信息。UDDI是一种目录服务,企业可以通过UDDI来注册和搜索Web服务。简单来说,UDDI就是一个目录,只不过在各个目录中存放的是一些关于Web服务的信息而已。
三、WebService服务端开发步骤
3.1 开发接口
public interface IWeatherService {
public abstract String
query(String cityName
);
}
3.2 开发实现类
@WebService
public class WeatherServiceImpl implements IWeatherService {
@Override
public String
query(String cityName
) {
System
.out
.println("查询" + cityName
+ "的天气");
return "晴天";
}
}
3.3 发布服务
import com
.qf
.webservice
.WeatherServiceImpl
;
import javax
.xml
.ws
.Endpoint
;
public class Main {
public static void main(String
[] args
) {
Endpoint
.publish("http://localhost:8080/weatherService",new WeatherServiceImpl());
System
.out
.println("发布成功");
}
}
四、WebService客户端开发
4.1 生成客户端代码
通过wsimport命令生成客户端代码(通过cmd进入到当前项目的src路径下)
第一种方式【远程地址】:wsimport
-s
. http
://127.0.0.1:8080/weather
?wsdl
第二种方式【xml文件】:wsimport
-s
. 文件路径(文件路径后面不需要加
?wsdl)
4.2 客户端调用方式一
import com
.qf
.webservice
.WeatherServiceImpl
;
import com
.qf
.webservice
.WeatherServiceImplService
;
public class Client {
public static void main(String
[] args
) {
WeatherServiceImplService service
= new WeatherServiceImplService();
WeatherServiceImpl service1Impl
= service
.getPort(WeatherServiceImpl
.class);
String weather
= service1Impl
.query("上海");
System
.out
.println(weather
);
}
}
4.3 客户端调用方式二
import com
.qf
.webservice
.WeatherServiceImpl
;
import com
.sun
.jndi
.toolkit
.url
.UrlUtil
;
import javax
.xml
.namespace
.QName
;
import javax
.xml
.ws
.Service
;
import java
.net
.URL
;
public class Client {
public static void main(String
[] args
) throws Exception
{
URL url
= new URL("http://localhost:8080/weatherService?wsdl");
QName qName
= new QName("http://webservice.qf.com/", "WeatherServiceImplService");
Service service
= Service
.create(url
,qName
);
WeatherServiceImpl serviceImpl
= service
.getPort(WeatherServiceImpl
.class);
String weather
= serviceImpl
.query("北京");
System
.out
.println(weather
);
}
}
4.4 访问服务的总结
目标:访问服务
1.生成客户端代码:wsimport -s . http://localhost:8080/weatherService?wsdl
2.查看服务的说明书(wsdl),例如:http://localhost:8080/weatherService?wsdl
3.按照服务的说明书进行编程:
1)取得服务视图:<service name="WeatherServiceImplService">
2)取得服务的实现类:<portType name="WeatherServiceImpl">
3)调用方法(服务):<operation name="query">
五、访问网络上提供的webservice服务(电话归属地)
1.通过服务的访问地址,来生成客户端代码
1)取得WSDL地址:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
2)根据WSDL地址生成客户端文件
2. 编写客户端代码调用服务提供的方法
import cn
.com
.webxml
.MobileCodeWS
;
import cn
.com
.webxml
.MobileCodeWSSoap
;
public class Client {
public static void main(String
[] args
) {
MobileCodeWS service
= new MobileCodeWS();
MobileCodeWSSoap port
= service
.getPort(MobileCodeWSSoap
.class);
String info
= port
.getMobileCodeInfo("18252755498",null
);
System
.out
.println(info
);
}
}
六、访问网络上提供的webservice服务(天气预报)
1.通过服务的访问地址,来生成客户端代码
1)取得WSDL地址:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
2)根据WSDL地址生成客户端文件 (1)问题:根据服务提供的WSDL文件进行解析过程中出现了错误 (2)原因:java调用.NET生成的webservice,生成客户端代码时报错(不同语言调用) (3)解决:因为这个服务时.NET开发的,所以我们需要将要访问wsdl描述文件保存到本地,然后做一些更改,具体如下:
将wsdl文件中的:
<s
:element ref
="s:schema"/><s
:any
/>
修改为:
<s
:any minOccurs
="2" maxOccurs
="2"/>
然后,再以绝对路径的方式来生成对应的客户端代码即可(文件的后缀为:wsdl)
文件生成成功
2. 编写客户端代码调用服务提供的方法
import cn
.com
.webxml
.WeatherWS
;
import cn
.com
.webxml
.WeatherWSSoap
;
import java
.util
.List
;
public class Client {
public static void main(String
[] args
) {
WeatherWS service
= new WeatherWS();
WeatherWSSoap port
= service
.getPort(WeatherWSSoap
.class);
List
<String> info
= port
.getWeather("上海",null
).getString();
for (String str
: info
) {
System
.out
.println(str
);
}
}
}