Webservice
- 由于在项目中需要调用他人接口/编写自己的接口,进行了一点简单的了解。个人理解为它是部署在Web服务器上,向外暴露服务供外界调用的一个API,使用XML来封装数据,通过HTTP协议发送请求和接收结果,特定的HTTP消息头和XML内容格式通过SOAP协议规定。
- WebService通过一个WSDL文件来说明自己有什么服务可以对外调用,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它,客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,他人查找;2.直接告知客户端调用者。
WebService调用(Springboot + CXF)
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.1.12</version>
</dependency>
- 动态调用
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8888/student_webservice/student?wsdl");
client.getOutInterceptors().add(new ClientLoginInterceptor("admin", "admin"));
Object[] objects = new Object[0];
try {
QName opName = new QName("http://service.testwebservice.demo.com", "getStudent");
objects = client.invoke(opName,[需要传输的参数(字符串等)]);
System.out.println("返回数据:" + objects[0]);
} catch (java.lang.Exception e) {
e.printStackTrace();
}
- 静态调用(IDEA)
(1)获取WSDL地址(以查询手机归属地的WebService为例),在IDEA项目中任意包名右键(会在此包生成Webservice的Java类),点击WebService,然后填入WSDL地址,点击OK即可生成静态文件(可手动删除class文件)
(2)创建一个测试类,进行调用
public static void main(String[] args) {
MobileCodeWS factory = new MobileCodeWS();
MobileCodeWSSoap mobileCodeWSSoap = factory.getMobileCodeWSSoap();
String searchResult = mobileCodeWSSoap.getMobileCodeInfo("xxxxxxxxxxx", null);
System.out.println(searchResult);
}
WebService创建发布(Springboot + CXF)
- 声明接口
@WebService(name = "smart",
targetNamespace="http://webservice.testinterface.com/")
public interface TestService {
@WebMethod
@WebResult(name = "String", targetNamespace = "http://webservice.testinterface.com/")
public String save(@WebParam(name="arg0") String accessID,
@WebParam(name="arg1") String xml);
- 接口实现
@Override
public String save(@WebParam(name="arg0", targetNamespace = "http://webservice.testinterface.com/") String accessID,
@WebParam(name="arg1", targetNamespace = "http://webservice.testinterface.com/") String xml){
XStream xs = new XStream();
xs.setMode(XStream.NO_REFERENCES);
xs.ignoreUnknownElements();
xs.processAnnotations(PubModel.class);
xs.setClassLoader(PubModel.class.getClassLoader());
PubModel pubModel = (PubModel) xs.fromXML(xml);
if(null==pubModel) {
ResponseModel responseModel = new ResponseModel();
ResultModel res = new ResultModel("102", "无参数");
responseModel.setResultModel(res);
XStream xStream = new XStream(new XppDriver());
xStream.alias("Response", ResponseModel.class);
return xStream.toXML(responseModel);
}
...
...
ResponseModel responseModel = new ResponseModel();
ResultModel res = new ResultModel("200", "成功");
XStream xStream = new XStream(new XppDriver());
xStream.alias("Response", ResponseModel.class);
return xStream.toXML(responseModel);
}
- Webserivce配置
- 在主包下再新建一个config包,并新建一个CxfConfig类
@Configuration
public class CxfConfig {
@Bean(name = "cxfServlet")
public ServletRegistrationBean cxfServlet(){
return new ServletRegistrationBean(new CXFServlet(),"/webservice/*");
}
@Bean
public TestService testService(){
return new TestServiceImpl();
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus(){
return new SpringBus();
}
@Bean
public Endpoint endpoint(){
EndpointImpl endpoint = new EndpointImpl(this.springBus(), this.testService());
endpoint.publish("/smart");
return endpoint;
}
}