WebService实例

1、发布webservice服务

1.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);
}

1.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;
    }

}

1.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());
    }
}

1.4、浏览器查看是否成功

http://127.0.0.1:9998/weather?wsdl

2、客户端的调取方式

2.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]);
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值