什么是web service
web service其实是一组API,将服务器上的功能暴露出来以供客户端访问.
Client1---------------------soap,xml----->WEB SERVICE
Client2---------------------wsdl----------->WEB SERVICE
什么是SOAP
http + xml
HEADER
RPC--------------> WEB SERVICE
-xml format-
---------SOAP---------
---------------HTTP----------------
第一章:web service实践
生成一个sdk,一个server,可以被调用的服务。发布服务
step 1.1写一个sdk
package com.qf.webservice;
/**
* define a service of weather query
* @Author JennieChen */
public interface IWeatherService {
public String query(String cityName);
}
package com.qf.webservice;
import javax.jws.WebService;
@WebService
public class WeatherServiceImpl implements IWeatherService{
@Override
public String query(String cityName) {
System.out.println("query"+cityName);
return "sunny day";
}
}
package com.qf.webservice;
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("public success!");
}
}
public success!
步骤:
1.接口
2.实现类+@WebService
3.main中发布服务
Endpoint.publish(Address,Implementator); 发布地址,实现类
有了这项WebService,就生成了wsdl
查看:
http://localhost:8083/weatherService?wsdl
http://localhost:8083/weatherService?xsd=1
step1.2 publish service
另一种实现方法:
package com.qf.webservice.client;
import com.qf.webservice.WeatherServiceImpl;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;
public class Client {
public static void main(String[]args) throws MalformedURLException {
//WeatherServiceImplService service = new WeatherServiceImplService();
URL url=new URL("http://localhost/8080/webService?wsdl");
QName qName=new QName("http://webservice.qf.com/","WeatherServiceImplService");
Service service= Service.create(url,qName);
WeatherServiceImpl port=service.getPort(WeatherServiceImpl.class);
String query=port.query("beijing");
System.out.println(query);
}
}
多写两步:
URL url=new URL(“http://localhost/8080/webService?wsdl”);
QName qName=new QName(“http://webservice.qf.com/”,“WeatherServiceImplService”);
得到service
实践:java 访问服务
1.生成客户端代码
check wsdl 服务说明书
(web service description language)
cmd:
step1:
cd 进去\IdeaProjects\webservice_client_1项目路径:
C:\Users\45058>cd C:\Users\45058\IdeaProjects\webservice_client_1
C:\Users\45058\IdeaProjects\webservice_client_1>wsimport -s . http://localhost/8080/webService?wsdl
parsing WSDL...
Generating code...
Compiling code...
C:\Users\45058\IdeaProjects\webservice_client_1>
step2:
wsimport(web service import命令+wsdl)操作,可以根据wsdl说明书
在idea中逆向生成代码
step3:
编写一个Client:
从wsdl中查询三个值:
–WeatherServiceImplService
–WeatherServiceImpl
–一开始,在webservice_server_jdk接口中定义好的方法query
进一步实践:访问网络的服务
例子1: 获取手机号码信息
通过这个例子,
巩固调用web service的概念。
拿到网络上的wsdl
step1:调用一个网站上的信息:
http://www.webxml.com.cn/zh_cn/web_services.aspx
选择并点击wsdl接口
http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
step2:新建一个java project、module
webservice_network_client_3
cd 进去
C:\Users\45058\IdeaProjects\webservice_network_client_3\src
C:\Users\45058\IdeaProjects\webservice_client_1\webservice_network_client_3\src>wsimport -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
parsing WSDL...
[WARNING] Ignoring SOAP port "MobileCodeWSSoap12": it uses non-standard SOAP 1.2 binding.
You must specify the "-extension" option to use this binding.
line 199 of http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
[WARNING] ignoring port "MobileCodeWSHttpGet": no SOAP address specified. try running wsimport with -extension switch.
line 202 of http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
[WARNING] ignoring port "MobileCodeWSHttpPost": no SOAP address specified. try running wsimport with -extension switch.
line 205 of http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
Generating code...
Compiling code...
C:\Users\45058\IdeaProjects\webservice_client_1\webservice_network_client_3\src>
逆向生成代码
step3:添加一个client-main入口
3.1
先从wsdl文件http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl中
找到service,portType,operation三项:
<wsdl:service name=“MobileCodeWS”>
<wsdl:portType name=“MobileCodeWSSoap”>
<wsdl:operation name=“getMobileCodeInfo”>
<wsdl:portType name=“MobileCodeWSHttpGet”>
<wsdl:operation name=“getMobileCodeInfo”>
<wsdl:portType name=“MobileCodeWSHttpPost”>
<wsdl:operation name=“getMobileCodeInfo”>
package cn.com.webxml;
public class Client {
public static void main(String[] args) {
MobileCodeWS service = new MobileCodeWS();
MobileCodeWSSoap port=service.getPort(MobileCodeWSSoap.class);
String query=port.getMobileCodeInfo("159****0532",null);
System.out.println(query);
}
}
output:
159****0532:福建 福州 福建移动全球通卡
进一步实践:
例子2 获取天气信息:
step1:新建项目,webservice_network_client_4
拷贝项目src的路径:C:\Users\45058\IdeaProjects\webservice_client_1\webservice_network_client_4
step2:
点击天气预报的wsdl
http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
step3:重复wsimport的步骤
C:\Users\45058\IdeaProjects\webservice_client_1\webservice_network_client_4\src>wsimport -s . http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
发现报错。
修复:
3.1在wsdl页面右键,查看source code
3.2拷贝source code并保存到client4-src下面
命名为weather.wsdl
即,改成从本地wsdl说明书读取信息。
CMD再跑wsimport,改成本地来源的wsdl:
C:\Users\45058\IdeaProjects\webservice_client_1\webservice_network_client_4\src>wsimport -s . C:\Users\45058\IdeaProjects\webservice_client_1\webservice_network_client_4\weather.wsdl
但wsimport仍然报错
修改多处下面这行:
<s:element ref="s:schema"/>