一.发布webservice服务
1.编写服务接口
package com.nari.test.webservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* 基于soap协议(http+xml)的服务
*/
@WebService
(
name = "Login",// 定义Port名称
serviceName = "WeatherInterface", // 修改WebService服务名称
targetNamespace = "http://webservice.test.nari.com/" // 定义命名空间,默认为倒置的包名
)
public interface WeatherInterface {
// 提供一个对外公开的服务
@WebMethod(operationName = "queryWeather")
// 修改方法名
public String queryWeather(@WebParam(name = "cityName")String cityName);
}
2.服务实现类
package com.nari.test.webservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* 服务实现类
*/
@WebService
(
//endpointInterface = "com.nari.test.webservice.WeatherInterface",
name = "Login",// 定义Port名称
serviceName = "WeatherInterface", // 修改WebService服务名称
targetNamespace = "http://webservice.test.nari.com/" // 定义命名空间,默认为倒置的包名
//服务实现类和接口的注解要一样全
)
public class WeatherInterfaceImpl implements WeatherInterface {
@WebMethod(operationName = "queryWeather")
public String queryWeather(@WebParam(name = "cityName")String cityName) {
System.out.println("城市:"+cityName);
String weather="小雨";
return weather;
}
}
3.发布服务
package com.nari.test.webservice;
import javax.xml.ws.Endpoint;
//3. 第三步:发布服务,Endpoint类发布服务,publish方法,两个参数:1.服务地址;2.服务实现类
public class WeatherServer {
public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:9998/weather", new WeatherInterfaceImpl());
}
}
4.浏览器查看是否成功
http://127.0.0.1:9998/weather?wsdl
![](https://img-blog.csdnimg.cn/20201019112627982.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNDgyNjAw,size_16,color_FFFFFF,t_70)
二.客户端的调取方式
1.axis方式调取
package com.demo1.test;
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
//axis调用方式
public class WsClient2 {
/**
* 跨平台调用Web Service出现
* faultString: 服务器未能识别 HTTP 头 SOAPAction 的值:
* JAX-WS规范不需要SoapAction,但是.NET需要,所以产生了这个错误。
* options.setAction("目标的TargetNameSpace"+"调用的方法名");
*/
public static void main(String[] args) {
String url = "http://127.0.0.1:9998/weather?wsdl";
Service service = new Service();
try {
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(url));
// WSDL里面描述的接口名称(要调用的方法)
call.setOperationName(new QName("http://webservice.test.nari.com/","queryWeather"));
call.setEncodingStyle("utf-8");//设置传入服务端的字符集格式如utf-8等
//跨平台调用加上这个
call.setUseSOAPAction(true);
// call.setSOAPActionURI("http://webservice.test.nari.com/queryWeather");
// 接口方法的参数名, 参数类型,参数模式 IN(输入), OUT(输出) or INOUT(输入输出)
call.addParameter("cityName", XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);
// 设置方法中参数的值
Object result = call.invoke(new Object[] { "南京"});
System.out.println(result.toString());
} catch (ServiceException | RemoteException | MalformedURLException e) {
e.printStackTrace();
}
}
}
2.cxf类库调用
package com.demo1.test;
import javax.xml.namespace.QName;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
//cxf类库调用
public class WsClient1 {
public static void main(String[] args) throws Exception {
// 采用动态工厂方式 不需要指定服务接口
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://127.0.0.1:9998/weather?wsdl");
QName qName = new QName("http://webservice.test.nari.com/", "queryWeather");
Object[] result = client.invoke(qName, new Object[] { "南京" });
System.out.println(result[0]);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)