Java 调用与发布Web Service

Web Service 是一种实现数据共享与远程调用的标准,具有跨语言、跨平台的特性。

 

Ⅰ、发布WebService  

①在类上添加@WebService注解      

 

package wsexample;

import javax.jws.WebService;

/**
 * HelloWebService:对外提供服务;
 * 
 * @WebService :添加注解后该类方法将对外发布(静态方法及final方法除外)。
 */
@WebService
public class HelloWebService {

	/**
	 * @param args
	 */
	public void sayHello() {
		System.out.println("Hello WebService");
	}

}




 

②通过EndPoint(端点服务类)发布一个webService。

 

package wsexample;

import javax.xml.ws.Endpoint;

public class ProvideService {

	public static void main(String[] args) {
		/**
		 * 使用Endpoint将对象绑定到特定端口,端口后为服务名称。
		 * Parameters1:对外的访问地址
		 * Parameters2:提供服务的实现类
		 */
		Endpoint.publish("http://localhost:9994/helloWebService",
				new HelloWebService());
	}

}

 

 

Ⅱ、调用Web Service

 

    1、通过wsimport生成客户端代码调用(wsimport是jdk自带工具)

访问 http://localhost:9991/helloWebService?wsdl(所发布服务地址+参数wsdl)可查看WSDL文档(Web Service的描述说明文档,xml的子集)。

使用wsimport工具可根据wsdl文档生成Java代码与.class文件。

wsimport -s . http://localhost:9991/helloWebService?wsdl(-d生成.class文件,-s生成Java代码与.class文件

把生成的代码复制到项目中



package wsclient;

import wsexample.HelloWebService;
import wsexample.HelloWebServiceService;

/**
 * 生成的代码复制进项目,可直接调用
 * 
 */
public class RemoteService {

	public static void main(String[] args) {
		// 获取 HelloWebService的实现类
		HelloWebServiceService hService = new HelloWebServiceService();
		HelloWebService servicePort = hService.getHelloWebServicePort();
		// 直接调用ws对外提供的方法
		servicePort.sayHello();
	}

}

NOTICE:客户端使用JDK1.8环境会报错(The typejava.lang.CharSequence cannot be resolved. )改为JDK1.6即可。


 2、通过URLConnection调用

/**
	 * 获取天气 天气预报WEB服务接口: http://www.webxml.com.cn/zh_cn/weather_icon.aspx
	 * 
	 * @param city
	 *            城市中文名称(国外城市可用英文)或城市代码(不输入默认为上海市)
	 */
	public static String getWeather(String city) {
		String result = null;
		try {
			URL url = new URL(
					"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
			conn.setRequestMethod("POST");
			OutputStream os = conn.getOutputStream();
			// 请求体
			StringBuffer buffer = new StringBuffer(1024);
			String soap = buffer
					.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
					.append("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">")
					.append("<soap:Body><getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\"><theCityName>")
					.append(city)
					.append("</theCityName></getWeatherbyCityName></soap:Body></soap:Envelope>")
					.toString();
			os.write(soap.getBytes());
			// 发送请求
			InputStream is = conn.getInputStream();
			int len = 0;
			byte[] b = new byte[1024];
			StringBuilder builder = new StringBuilder();
			while ((len = is.read(b)) != -1) {
				String in = new String(b, 0, len, "utf-8");
				builder.append(in);
			}
			result = builder.toString();
			os.close();
			is.close();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Java调用 Web Service 并添加认证头(soapenv:Header),可以按照以下步骤进行操作: 1. 创建一个 `javax.xml.soap.SOAPMessage` 对象 ``` MessageFactory factory = MessageFactory.newInstance(); SOAPMessage message = factory.createMessage(); ``` 2. 创建一个 `javax.xml.soap.SOAPHeader` 对象,并将其添加到 `SOAPMessage` 中 ``` SOAPHeader header = message.getSOAPHeader(); ``` 3. 创建一个 `javax.xml.namespace.QName` 对象,用于指定认证头名称和命名空间 ``` QName securityQName = new QName("http://schemas.xmlsoap.org/ws/2002/12/secext", "Security", "wsse"); ``` 4. 创建一个 `javax.xml.soap.SOAPHeaderElement` 对象,并将其添加到 `SOAPHeader` 中 ``` SOAPHeaderElement securityHeader = header.addHeaderElement(securityQName); ``` 5. 创建一个 `org.w3c.dom.Element` 对象,用于指定认证信息 ``` DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.newDocument(); Element auth = doc.createElementNS("http://schemas.xmlsoap.org/ws/2002/12/secext", "UsernameToken"); Element username = doc.createElementNS("http://schemas.xmlsoap.org/ws/2002/12/secext", "Username"); username.setTextContent("your_username_here"); Element password = doc.createElementNS("http://schemas.xmlsoap.org/ws/2002/12/secext", "Password"); password.setTextContent("your_password_here"); auth.appendChild(username); auth.appendChild(password); ``` 6. 将认证信息添加到 `SOAPHeaderElement` 中 ``` securityHeader.addChildElement(auth); ``` 7. 发送 SOAP 请求并接收响应 您可以使用 Java 提供的各种 Web Service 客户端框架(如 JAX-WS 或 Apache CXF)来发送 SOAP 请求。在发送请求时,将 `SOAPMessage` 对象作为参数传递即可。 上述步骤仅提供了一个基本的示例,您可能需要根据您的具体情况进行一些修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值