博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebService Raw Client
阅读量:6388 次
发布时间:2019-06-23

本文共 4093 字,大约阅读时间需要 13 分钟。

  hot3.png

抛弃各种平台所提供的标准或框架(如JAX-WS, Axis, Spring-WS) ,我们回到最原始的WebService技术。我们只需要操控SOAP协议数据,用HTTP的方式传送于client和server之间,也可以享受到WebService所提供的服务。只是比较麻烦。

UDDI

首先需要寻找我们需要的WebService服务. 对于提供商来说,要想让别人能过发现自己提供的服务,就需要将自己的服务注册到某一类公共的发布栏中去。这一系列的标准,被称为UDDI。我们可以通过在UDDI目录中搜索,得到我们想要的服务。

这里,我们使用一个全球天气预报的WebService: 

WSDL

WSDL的结构示意图如下:

161347_moJU_254689.jpg

现在,我们要对天气预报的WSDL进行分析。

查看WebService的描述文件,看看提供了什么样子的接口。

首先查看WSDL提供的service:

154229_PzMH_254689.jpg

从上面可以看出,WSDL中,Service提供了4个port,每个port声明一个binding与address的绑定。注意,不同的协议在展示地址的时候所用的标签命名空间也不同, 例如soap, soap12, http.

我们打算使用Soap12协议的port,于是我们将查看binding="tns:GlobalWeatherSoap12"的定义。

161804_diMP_254689.jpg

通过上面的binding定义,我们看到,此binding实现了PortType tns:GlobalWeatherSoap的operation, 并声明使用soap12协议。在Operation的实现中,如何组装input和output。从上面的代码,我们可以得出

Request的请求应该是PortType GlobalWeatherSoap的input:

http://www.webservicex.net/globalweather.asmx HTTP/1.1Content-Type: application/soap+xml; charset=utf-8Content-Length: length
  
  

Response的响应应该是PortType GloableWeatherSoap的output:

  
  

接下来,我们来组装Request Body .

依照PortType GloableWeatherSoap的定义:

165909_RPds_254689.jpg

Operation GetWeather的input是Message GetWeatherSoapIn, 而output是Message GetWeatherSoapOut. 找到Message的定义

170854_7qAL_254689.jpg

两个Message均引用了XSD Type,一个是GetWeather, 另一个是GetWeatherResponse, 找到两个type的定义:

171150_tO5K_254689.jpg

这时候,我们可以根据上面对Input Type和Output Type的定义,可以填充request和response的soap:body了。

最终的请求应该为:

http://www.webservicex.net/globalweather.asmx HTTP/1.1Content-Type: application/soap+xml; charset=utf-8Content-Length: length
  
    
      
shanghai
      
China
      

最终的响应应该为:

  
    
      
text
      

Fiddler

接下来,我们使用Fiddler来测试一下上面所有的推断。 打开Fiddler, 在Composer tab中,贴入我们的Request.

172006_hgMz_254689.jpg

点击execute以后,到Inspectors tab里面,查看response:

172221_I36K_254689.jpg

Java实现

接下来,我们使用Java的net包和JAXP来实现webservice的调用。

public class App {    public static void main( String[] args ) throws IOException, ParserConfigurationException, SAXException {        StringBuilder sb = new StringBuilder();        sb.append( "
                                   ")          .append( "  
 ")          .append( "    
                                                            ")          .append( "      
                      ")          .append( "        
shanghai
                                        ")          .append( "        
China
                                     ")          .append( "                                                                ")          .append( "    
                                                           ")          .append( "                                                           ");               URL url = new URL("http://www.webservicex.net/globalweather.asmx");       HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();       httpConn.setRequestProperty("Content-Length", String.valueOf(sb.length()));       httpConn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");       httpConn.setRequestMethod("POST");       httpConn.setDoOutput(true);       httpConn.setDoInput(true);       OutputStream out = httpConn.getOutputStream();       out.write(sb.toString().getBytes());       out.close();               DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();        Document doc = builder.parse(httpConn.getInputStream());       String body = doc.getElementsByTagName("GetWeatherResult").item(0).getChildNodes().item(0).getNodeValue();       System.out.println(body);    }}

最后输出为:

  
Shanghai / Hongqiao, China (ZSSS) 31-10N 121-26E 3M
  
  
 from the NNW (340 degrees) at 9 MPH (8 KT) (direction variable):0
  
 1 mile(s):0
  
 66 F (19 C)
  
 59 F (15 C)
  
 77%
  
 29.83 in. Hg (1010 hPa)
  
Success

转载于:https://my.oschina.net/xpbug/blog/223513

你可能感兴趣的文章
七牛实时音视频云视频连线demo(web部分)
查看>>
Mysql 权限
查看>>
Spring事务管理(详解+实例)
查看>>
ubuntu apt-get install 出现无法定位软件包...
查看>>
centos7 下 基于docker搭建java/tomcat (方式一)
查看>>
全世界最好的编辑器VIM之Windows配置(gvim)[未测试]
查看>>
2018年你需要知道的13个JavaScript工具库
查看>>
当你点击按钮的时候如何设置其他按钮不可点击
查看>>
spring 高级装配
查看>>
【合集】parasoft Jtest 从安装到使用教程合集,收藏推荐!
查看>>
Python Pygame库的学习之路(1)
查看>>
信息安全与Linux系统
查看>>
Ubuntu安装mysql
查看>>
SpringCloud 微服务 (十四) 服务网关 Zuul 过滤器(Pre&Post)
查看>>
代理设计模式
查看>>
初识Shiro
查看>>
在Developerkit开发板上运行blink例程
查看>>
企业级性能、安全可靠 阿里云发布企业级大数据平台开发者版
查看>>
Spring Boot使用过程小记(一)--加载自定义的Spring XML
查看>>
Git分支关联远程GitHub分支出错
查看>>