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方式调用

代码如下:

  1. package com.ssh.webserviceTSY;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.OutputStream;
  7. import java.io.UnsupportedEncodingException;
  8. import java.net.HttpURLConnection;
  9. import java.net.URL;
  10. public class Test {
  11. public static void main(String[] args) throws IOException {
  12. //第一步:创建服务地址
  13. URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
  14. //第二步:打开一个通向服务地址的连接
  15. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  16. //第三步:设置参数
  17. //3.1发送方式设置:POST必须大写
  18. connection.setRequestMethod("POST");
  19. //3.2设置数据格式:content-type
  20. connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
  21. //3.3设置输入输出,因为默认新创建的connection没有读写权限,
  22. connection.setDoInput(true);
  23. connection.setDoOutput(true);
  24. //第四步:组织SOAP数据,发送请求
  25. String soapXML = getXML("17321242779");
  26.         //将信息以流的方式发送出去
  27. OutputStream os = connection.getOutputStream();
  28. os.write(soapXML.getBytes());
  29. //第五步:接收服务端响应,打印
  30. int responseCode = connection.getResponseCode();
  31. if(200 == responseCode){//表示服务端响应成功
  32.             //获取当前连接请求返回的数据流
  33. InputStream is = connection.getInputStream();
  34. InputStreamReader isr = new InputStreamReader(is);
  35. BufferedReader br = new BufferedReader(isr);
  36. StringBuilder sb = new StringBuilder();
  37. String temp = null;
  38. while(null != (temp = br.readLine())){
  39. sb.append(temp);
  40. }
  41. /**
  42. * 打印结果
  43. */
  44. System.out.println(sb.toString());
  45. is.close();
  46. isr.close();
  47. br.close();
  48. }
  49. os.close();
  50. }
  51. public static String getXML(String phone){
  52. String soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
  53. +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2003/XMLSchema-instance\" "
  54. +"xmlns:web=\"http://WebXml.com.cn/\" "
  55. +"xmlns:xsd=\"http://www.w3.org/2003/XMLSchema\" "
  56. +"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
  57. +"<soap:Body>"
  58. +"<web:getMobileCodeInfo>"
  59. +phone
  60. +"</web:getMobileCodeInfo>"
  61. +"</soap:Body>"
  62. +"</soap:Envelope>";
  63. return soapXML;
  64. }
  65. }


说明 :

一般的HTTP请求大部分都是相同的,但是由于webservice是基于soap协议的,所以,请求时的文本格式需要设置好。

文中的soapXML信息,需要注意xmlns:web=“tns” 这个xml命名空间, 这个空间是依据wsdl文档里的头部NameSpace信息,确定的

程序会依据这个名称,检索到该文档里面的方法,譬如:

<web: getDatabaseInfo> 获取getDatabaseInfo方法 (web是xmlns的名字,可以自定义,相当于“id”)


3、JS方式调用


  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. <title>Test WebService</title>
  8. <script type="text/javascript" src="js/jquery-2.1.1.min.js"></script>
  9. <script>
  10. $(function(){
  11. invoke();
  12. back();
  13. });
  14. var xhr;
  15. function invoke(){
  16. if(window.ActiveXObject){
  17. xhr = new ActiveXObject("Microsoft.XMLHTTP");
  18. }else{
  19. xhr = new XMLHttpRequest();
  20. }
  21. //指定请求地址
  22. var url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
  23. //定义请求类型和地址和异步,一般都是post方式。
  24. xhr.open("POST", url, true);
  25. //设置Content-Type
  26. xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8");
  27. //指定回调方法
  28. xhr.onreadystatechange = back;
  29. //组装消息体的数据
  30. var data =
  31. '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '
  32.     ' xmlns:web="http://WebXml.com.cn/" '
  33. ' xmlns:xsd="http://www.w3.org/2003/XMLSchema" '
  34. ' xmlns:xsi="http://www.w3.org/2003/XMLSchema-instance">'
  35. +'<soapenv:Body>'
  36. +'<web:getDatabaseInfo>'
  37. +'<data>'
  38. +'17321242719'
  39. +'</data>'
  40. +'</web:getDatabaseInfo>'
  41. +'</soapenv:Body>'
  42. +'</soapenv:Envelope>';
  43. xhr.send(data);
  44. }
  45. function back(){
  46. if(xhr.readyState == 4){
  47. if(xhr.status == 200){
  48. var doc = xhr.responseXML;
  49. alert(xhr.getAllResponseHeaders());
  50. // xhr.getResponseBodyAsStream
  51. alert(xhr.responseText);
  52. }
  53. }/* else{
  54. alert("请求失败")
  55. } */
  56. }
  57. </script>
  58. </head>
  59. <body>
  60. </body>
  61. </html>




出处:https://blog.csdn.net/myblogzz/article/details/80311038
posted @ 2021-02-06 09:28  十点书屋  阅读(1872)  评论(0)    收藏  举报