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 ...
随机推荐
- hdu 4731
一道找规律的题,但今天的智商捉急,一直都想不到点子上: 比赛之后和别人讨论的时候,在n=2的情况下,前面两个是aa,后面就接着很多个aababb,然后最后再判断下就行了~~~ 以后对于这种题还是不要太 ...
- SecureCRT 绝佳配色方案, 保护你的眼睛
http://blog.csdn.net/zklth/article/details/8937905 关键词:SecureCRT配色, SecureCRT设置颜色, Linux终端配色,Linux ...
- Eclipse can't install updates
trying to update eclipse but after downloading updates i always get an error dialog saying: An error ...
- webview调用javascript脚本无反应
最近遇到一个问题:在html中有一段javascript脚本定义了一个方法,在使用webview.loadUrl("javascript:方法名()")时方法未执行,后来 查资料发 ...
- cocos2d-x拖动滑块控件CCControlSlider
#include "GameMusicSetting.h" bool GameMusicSetting::init() { if(!CCLayer::init()) { retur ...
- 一个优秀的http实现框架
package com.ming; import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unir ...
- git tag的使用
查看所有的标签git tag 删除某一个标签git tag -d tagName 创建带注释的标签 git tag -a tagName -m "annotate" 轻量级标签 g ...
- 使用Eclipse构建GeoTools项目
转自:http://hi.baidu.com/liushuigs/item/a62969e6667f9815585dd8b1 由于GeoTools是原本是使用Maven构建的,所以,不能直接将工程导入 ...
- Oracle和MSSQL查询有多少张表
Oracle: SELECT count(*) FROM user_tables MSSQL: ) FROM sysobjects WHERE xtype='U' 这种方法可能会把dbo.dtprop ...
- 16位cpu下主引导扇区及用户程序的编写
一些约定 主引导扇区代码(0面0道1扇区)加载至0x07c00处 用户程序头部代码需包含以下信息:程序总长度.程序入口.重定位表等信息 用户程序 当虚拟机启动时,在屏幕上显示以下两句话: This i ...