WebService学习笔记系列(二)
soap(简单对象访问协议),它是在http基础之上传递xml格式数据的协议。soap协议分为两个版本,soap1.1和soap1.2。 在学习webservice时我们有一个必备工具叫做tcpmon,该工具可以直接下载得到。使用tcpmon可以嗅探网络中传输的数据,便于我们更好的理解soap协议。
下载好tcpmon之后,打开该软件,如图简单设置
tcpmon相当于一个代理服务器,打开tcpmon后,如果把监听端口设置为9999,目标端口设置为8888,当用户访问9999端口时,消息会被tcpmon监听到,同时tcpmon会把消息转发给目标端口,即8888,服务端返回的数据也是先到达tcpmon,tcpmon再把数据转发给客户端。
通过我们发送的内容那一栏我们可以看到发送的数据,就是那一串xml数据,既然拿到了xml数据,我们就可以使用应用程序发送一个xml字符串,看是否能够调用服务端的数据(服务端的代码WebService学习笔记系列(一)),我们这里只说客户端调用。
public class MyTest2 {
public static void main(String[] args) {
try {
URL url = new URL("http://127.0.0.1:8888/helloService?wsdl");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
//get请求以下两个默认即可,post请求就都设置为true
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
con.setRequestMethod("POST");
OutputStream out = con.getOutputStream();
StringBuffer sb = new StringBuffer();
sb.append("<S:Envelope xmlns:S=")
.append("\"http://schemas.xmlsoap.org/soap/envelope/\"><S:Body>")
.append("<ns2:getUser xmlns:ns2=\"http://webservice.lenve/\">")
.append("</ns2:getUser></S:Body></S:Envelope>");
out.write(sb.toString().getBytes());
InputStream is = con.getInputStream();
int len = -1;
byte[] bytes = new byte[1024];
StringBuffer buffer = new StringBuffer();
while((len=is.read(bytes))!=-1){
buffer.append(new String(bytes, 0, len));
}
System.out.println(buffer);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我们这里通过HttpURLConnection发送一个post请求,请求中携带的字符串就是在tcpmon中嗅探到的那一段xml文本。
输出:
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getUserResponse xmlns:ns2="http://webservice.lenve/"><return><nickname>zhangsan</nickname><username>张三</username></return></ns2:getUserResponse></S:Body></S:Envelope>
这种方式略显麻烦,我们再用httpClient来试试:
public class MyTest3 {
public static void main(String[] args) {
try {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost post = new HttpPost("http://127.0.0.1:9999/helloService?wsdl");
post.addHeader("Content-Type", "text/xml;charset=utf-8");
StringBuffer sb = new StringBuffer();
sb.append("<S:Envelope xmlns:S=")
.append("\"http://schemas.xmlsoap.org/soap/envelope/\"><S:Body>")
.append("<ns2:getUser xmlns:ns2=\"http://webservice.lenve/\">")
.append("</ns2:getUser></S:Body></S:Envelope>");
post.setEntity(new StringEntity(sb.toString()));
CloseableHttpResponse resp = httpClient.execute(post);
if (resp.getStatusLine().getStatusCode()>199 && resp.getStatusLine().getStatusCode() < 400) {
HttpEntity entity = resp.getEntity();
String result = EntityUtils.toString(entity);
System.out.println(result);
}
resp.close();
} catch (ParseException | IOException e) {
e.printStackTrace();
}
}
}
httpClient是apache提供的用来联网的工具类,操作很方便,输出结果是一样的:
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:getUserResponse xmlns:ns2="http://webservice.lenve/"><return><nickname>zhangsan</nickname><username>张三</username></return></ns2:getUserResponse></S:Body></S:Envelope>
这种调用方式是我们自己构建一段xml代码来调用webservice服务。
WebService学习笔记系列(二)的更多相关文章
- WebService学习笔记系列(四)
今天主要来看看服务端的编写及发布. 服务端的编写主要包括三个步骤: 1.编写一个接口,即SEI(server endpoint interface) 2.编写接口的实现类,即SIB (server i ...
- WebService学习笔记系列(三)
网上有一些提供webservice服务的网站,我们要怎么调用呢? 今天来看个如何调用手机归属地查询服务.这个网站上提供了许多webservice服务,其中包括手机归属地查询服务,我们今天就用wsimp ...
- WebService学习笔记系列(一)
webservice主要是解决两个系统或者两个应用程序之间的远程调用,它提供了一种通过web方式访问的api,调用是跨语言.跨平台的. webservice的客户端与服务端进行交互的时候使用xml来传 ...
- JNI 学习笔记系列(二)
c中没有Boolean类型的值,一般是使用1表示true,0表示false,c中也没有String类型的数据,c中的字符串要通过char数组来表示.c中没有byte类型,一般用char表示byte类型 ...
- Windows-universal-samples学习笔记系列二:Controls, layout, and text
Controls, layout, and text AutoSuggestBox migration Clipboard Commanding Context menu Context menu ( ...
- 步步为营 SharePoint 开发学习笔记系列总结
转:http://www.cnblogs.com/springyangwc/archive/2011/08/03/2126763.html 概要 为时20多天的sharepoint开发学习笔记系列终于 ...
- Java WebService学习笔记 - Axis进阶(二)
上一篇 Java WebService学习笔记 - Axis(一) 前一篇博文中简单介绍了Axis的使用方法,这篇将介绍一些Axis的一些高级特性 Axis中Handler的使用 Handler ...
- Dynamic CRM 2013学习笔记 系列汇总
这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...
- C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)
上一篇学习完了MEF的基础知识,编写了一个简单的DEMO,接下来接着上篇的内容继续学习,如果没有看过上一篇的内容, 请阅读:http://www.cnblogs.com/yunfeifei/p/392 ...
随机推荐
- Android用户界面 UI组件--AdapterView及其子类(一) ListView及各种Adapter详解
ListView就是列表组件,一般通过继承ListActivity使用系统提供的ListView. 所有的AdapterView组件都需要有一个对应的Adapter作为适配器来显示列表中元素的布局方式 ...
- FindBugs
FindBugs是一个能静态分析源代码中可能会出现Bug的Eclipse插件工具. 可以从http://sourceforge.net/project/showfiles.php?group_id=9 ...
- No setter found for property 'userDAO' in class 'com.ssh.service.impl.User1Service'
造成此问题的原因是: 在applicationContext.xml中引用 <bean id="userService" class="com.ssh.servic ...
- Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error
Linux 的 GConf error 解决办法 问题: Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错,导致重新进入Centos系统后出现: GConf error:Fail ...
- windwos server 2008下iis7各种操作
1.发布一个asp程序带access数据库的 默认server 08是安装了iis7的,但是它默认没支持asp这项,这时你可以直接去控制面板--程序和功能--打开或关闭windows功能(双击打开)- ...
- ubuntu12.04编译rtems doc目录
我的rtem的版本是rtems-4.10.2:首先安装textinfo:sudo apt-get install texinfo 然后: cd rtems-4.10.2/doc../bootstrap ...
- HDU 4714 Tree2cycle DP 2013杭电热身赛 1009
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4714 Tree2cycle Time Limit: 15000/8000 MS (Java/Other ...
- 为什么用 Java:一个 Python 程序员告诉你
这篇文章专门给程序员写的,普通读者慎入.原作者:Kevin Sookocheff 译者:Celia Zhen,原文点击文末链接. 每当我告诉别人我一直在用Java工作时,大家的反应都是: “纳尼!Ja ...
- Classical Inheritance in JavaScript
JavaScript is a class-free, object-oriented language, and as such, it uses prototypal inheritance in ...
- POJ 3922 A simple stone game
题目: E - A simple stone game Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d &am ...