java根据WSDL文档,如何调用WebService?
作为一个java开发人员,当我们获取到了对方提供的wsdl地址,然后在网页上能够访问wsdl文档以后,如何调用对方的webservic借口呢?
一下有几种方法,可以参考一下。
第一种是 HttpURLConnection方式
第二种是 JSP页面上纯JS调用
内容说明
1、WSDL文档基本说明
2、httpURLConnection方式调用
3、JS方式调用
4、获取的数据如何解析?
1、WSDL文档基本说明
接口文档如下:以下是公共对外开放的查询手机号归属地的一个借口文档:
WSDL:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
可以自己用浏览器打开访问一下;
一眼望去,可能接口看起来很复杂,较为繁琐。 但是作为开发人员,使用的时候, 我们可以查看关注点信息,就能实现接口的调用了!!
那么我们需要了解吗哪些信息呢?
从上面的文档里面,我们需要从头部(最上面一行)了解到:
系统的targetNamespace="http://WebXml.com.cn/"
从<wsdl:types>标签里的<s:element ></s:element>的name=“xxxxxxx”,获知该文档提供了两个方法:
getMobileCodeInfo、getDatabaseInfo(后面带Response的是对应方法的回复)
从底部的<wsdl:service name="MobileCodeWS"></wsdl:service>标签里面,能获知<http:address location="http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx"/>请求地址。
http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx
一般而言,知悉以上信息,你就能调用借口了。需要传参数调用的,可能在业务上需要与对方了解一下,参数的格式(数据类型,文档里是可以知晓的)
2、httpURLConnection方式调用
代码如下:
- package com.ssh.webserviceTSY;
-
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.io.OutputStream;
- import java.io.UnsupportedEncodingException;
- import java.net.HttpURLConnection;
- import java.net.URL;
-
- public class Test {
- public static void main(String[] args) throws IOException {
- //第一步:创建服务地址
- URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
- //第二步:打开一个通向服务地址的连接
- HttpURLConnection connection = (HttpURLConnection) url.openConnection();
- //第三步:设置参数
- //3.1发送方式设置:POST必须大写
- connection.setRequestMethod("POST");
- //3.2设置数据格式:content-type
- connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
- //3.3设置输入输出,因为默认新创建的connection没有读写权限,
- connection.setDoInput(true);
- connection.setDoOutput(true);
-
- //第四步:组织SOAP数据,发送请求
- String soapXML = getXML("17321242779");
- //将信息以流的方式发送出去
- OutputStream os = connection.getOutputStream();
- os.write(soapXML.getBytes());
- //第五步:接收服务端响应,打印
- int responseCode = connection.getResponseCode();
- if(200 == responseCode){//表示服务端响应成功
- //获取当前连接请求返回的数据流
- InputStream is = connection.getInputStream();
- InputStreamReader isr = new InputStreamReader(is);
- BufferedReader br = new BufferedReader(isr);
-
- StringBuilder sb = new StringBuilder();
- String temp = null;
- while(null != (temp = br.readLine())){
- sb.append(temp);
- }
-
- /**
- * 打印结果
- */
- System.out.println(sb.toString());
-
- is.close();
- isr.close();
- br.close();
- }
- os.close();
- }
-
-
- public static String getXML(String phone){
-
- String soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
- +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2003/XMLSchema-instance\" "
- +"xmlns:web=\"http://WebXml.com.cn/\" "
- +"xmlns:xsd=\"http://www.w3.org/2003/XMLSchema\" "
- +"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
- +"<soap:Body>"
- +"<web:getMobileCodeInfo>"
- +phone
- +"</web:getMobileCodeInfo>"
- +"</soap:Body>"
- +"</soap:Envelope>";
- return soapXML;
- }
- }
说明 :
一般的HTTP请求大部分都是相同的,但是由于webservice是基于soap协议的,所以,请求时的文本格式需要设置好。
文中的soapXML信息,需要注意xmlns:web=“tns” 这个xml命名空间, 这个空间是依据wsdl文档里的头部NameSpace信息,确定的
程序会依据这个名称,检索到该文档里面的方法,譬如:
<web: getDatabaseInfo> 获取getDatabaseInfo方法 (web是xmlns的名字,可以自定义,相当于“id”)
3、JS方式调用
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="utf-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>Test WebService</title>
- <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
- <script>
- $(function(){
- invoke();
- back();
- });
- var xhr;
- function invoke(){
- if(window.ActiveXObject){
- xhr = new ActiveXObject("Microsoft.XMLHTTP");
- }else{
- xhr = new XMLHttpRequest();
- }
- //指定请求地址
- var url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
-
- //定义请求类型和地址和异步,一般都是post方式。
- xhr.open("POST", url, true);
- //设置Content-Type
- xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
- //指定回调方法
- xhr.onreadystatechange = back;
- //组装消息体的数据
- var data =
- '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '
- ' xmlns:web="http://WebXml.com.cn/" '
- ' xmlns:xsd="http://www.w3.org/2003/XMLSchema" '
- ' xmlns:xsi="http://www.w3.org/2003/XMLSchema-instance">'
- +'<soapenv:Body>'
- +'<web:getDatabaseInfo>'
- +'<data>'
- +'17321242719'
- +'</data>'
- +'</web:getDatabaseInfo>'
- +'</soapenv:Body>'
- +'</soapenv:Envelope>';
- xhr.send(data);
- }
- function back(){
- if(xhr.readyState == 4){
- if(xhr.status == 200){
- var doc = xhr.responseXML;
- alert(xhr.getAllResponseHeaders());
- // xhr.getResponseBodyAsStream
- alert(xhr.responseText);
-
- }
- }/* else{
- alert("请求失败")
- } */
- }
- </script>
- </head>
- <body>
- </body>
- </html>