- 浏览: 497399 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (301)
- Swing技术 (1)
- Linux (1)
- Javascript (22)
- 数据结构和算法 (3)
- J2SE (36)
- workflow (5)
- 设计模式 (14)
- web service (19)
- Ajax (14)
- 中间件 & 服务器 (8)
- 多线程 (9)
- Oracle (52)
- sys & soft (10)
- JMS (3)
- sso (9)
- android (11)
- struts2 (10)
- web协议 (2)
- 分布式 (2)
- PM (2)
- OLAP (3)
- Redis (2)
- Hibernate (7)
- ibatis (2)
- SQLServer (1)
- maven (3)
- Spring (7)
- Jsp (2)
- slf4j (1)
- jQuery (15)
- 权限 (1)
- 系统集成 (1)
- 笔记 (1)
- Freemarker (2)
- 项目管理 (1)
- eclipse (3)
- GIS (1)
- NoSql (3)
- win10 (1)
- win10网络 (2)
- 底层 (3)
- 数据库 (0)
最新评论
-
kabuto_v:
请问那种图,uml图是怎么画出来的呢?是您自己手工画的,还是有 ...
FastJSON 序列化、反序列化实现 -
梦行Monxin商城系统:
电商实例、业务并发、网站并发及解决方法 -
rockethj8:
client 㓟有一个参数是可以忽略一些URL 不进行验证登录 ...
SSO 之 (单点登录)实施中遇到的几个问题 -
mengxiangfeiyan:
好啊。。。。。
Oracle删除表,删除数据以及恢复数据、利用现有表创建新表
我们完全可以利用J2SE中的HttpURLConnection类来实现SOAP调用,而不一定需要AXIS之类的第三方组件包。下面就来仔细讲解:
通过HttpURLConnection来实现SOAP调用,无非就是向远端的WEB Service发出HTTP请求,请求的过程通过双方可以理解的XML格式流来传递数据信息。我以下面的SOAP请求的XML格式为基础来讲解:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SmInf="http://jx.ct10000.com/SmInf">
<soapenv:Header />
<soapenv:Body>
<tns:SendInstantSms xmlns:tns="SmInf" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sequenceId type="xsd:long">1</sequenceId>
<accountCode type="xsd:string">user_id</accountCode>
<accountPasswd type="xsd:string">user_password</accountPasswd>
<sendPhoneNo type="xsd:string">1234567890</sendPhoneNo>
<msgContent type="xsd:string">7D27 6025 901A 77E5 FF1A 7279 522B 7D27 6025 FF0C 5341 4E07 706B 6025 002E</msgContent>
<recvPhoneNo type="xsd:string">1234567890</recvPhoneNo>
<scheduleTime type="xsd:dateTime">2000-10-10T09:35:12.123</scheduleTime>
</tns:SendInstantSms>
</soapenv:Body>
</soapenv:Envelope>
这个SOAP请求包格式并不能完全通用于任何场合,大家具体实现某个SOAP调用时,需要根据具体情况进行调整,可以通过Web Service服务提供商获取详情。
通过HttpURLConnection实现SOAP调用的过程简要概述如下:
1、拼接实现如上所示的SOAP请求包的XML格式的字符流;
2、上面讲到过SOAP调用就是一个HTTP请求,因此通过HttpURLConnection类设置相应的请求属性;
3、通过HttpURLConnection类的getOutputStream方法获得一个输出流,然后将SOAP请求包字符流写入此输出流;
4、通过HttpURLConnection类的getResponseCode方法获得服务器响应代码,如果响应代码为200(即HttpURLConnection.HTTP_OK)则表示请求成功,否则请求失败,请求失败后,可以通过getErrorStream方法来了解具体的错误详情;
5、通过HttpURLConnection类的getInputStream方法获得一个输入流,由此输入流获得服务器反馈结果数据;
大体通过HttpURLConnection实现SOAP调用的过程就是这样。下面来看具体实现代码:
编写CSOAPClient类,并定义成员变量_url和_httpConn,在构造函数中对其进行实例化。
_url=new URL(url); //这里url变量是SOAP服务的网址,如http://10.5.3.134/Webservices/methods1?wsdl
_httpConn = (HttpURLConnection) _url.openConnection(); //这里就是获得一个SOAP服务的HttpURLConnection实例
String send_soap=createSendSOAPPackage(); //createSendSOAPPackage函数就是用来构造如上所示SOAP请求的数据包的XML字符串
_httpConn.setReadTimeout(TIME_OUT); //为HttpURLConnection对象指定一个读超时
_httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows XP; DigExt)");
_httpConn.setRequestProperty( "Content-Length",String.valueOf( send_soap.length() ) );
_httpConn.setRequestProperty("Content-Type","text/xml; charset=UTF-8");
_httpConn.setRequestProperty("SOAPAction",_soap_action_str);
//以上都是为HTTP请求设定请求属性,其中SOAPAction中用来指定SOAP Action的字符串。
_httpConn.setRequestMethod( "POST" ); //为请求指定提交数据模式,对于调用Web Service来说请求模式要被设置成POST模式。
_httpConn.setDoInput(true);
_httpConn.setDoOutput(true);
_httpConn.setUseCaches(false);
_httpConn.connect(); //连接远程Url
OutputStream out = _httpConn.getOutputStream(); //获取输出流对象
out.write( send_soap.getBytes() ); //将要提交服务器的SOAP请求字符流写入输出流
out.flush();
out.close();
int code=0;
code = _httpConn.getResponseCode(); //用来获取服务器响应状态
if (code == HttpURLConnection.HTTP_OK) {
//服务器响应状态表示成功,这此处可以来获取服务器反馈的数据信息
InputStream is=_httpConn.getInputStream(); //获取输入流对象,通过此对象可以获取服务器传回的数据信息
InputStreamReader isr = new InputStreamReader(is,"utf-8");
Document _doc=_sax.build(isr); //此处Document是jdom中的类,因为要解析服务器传回的xml数据
Element _root = _doc.getRootElement(); //此处Element是jdom中的类
......(略)
}
else{
//如果服务器返回的HTTP状态不是HTTP_OK,则表示发生了错误,此时可以通过如下方法了解错误原因。
InputStream is=_httpConn.getErrorStream(); //通过getErrorStream了解错误的详情,因为错误详情也以XML格式返回,因此也可以用JDOM来获取。
InputStreamReader isr = new InputStreamReader(is,"utf-8");
Document _doc=_sax.build(isr); //此处Document是jdom中的类,因为要解析服务器传回的xml数据
Element _root = _doc.getRootElement(); //此处Element是jdom中的类
......(略)
}
以上就是通过HttpURLConnection调用SOAP的简介。
下面附上实现类的代码,供参考(未优化,大家使用时要优化一下)
1、CSOAPClient
package util;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.Set;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
*
* @author zhaob
*/
public class CSOAPClient {
private static int TIME_OUT=15000;
private URL _url = null;
private String _service_id=null;
private String _method=null;
private String _soap_action_str=null;
private LinkedList<NParam> _params = new LinkedList<NParam>();
private HttpURLConnection _httpConn=null;
private String _root_master_namespace_name=null;
private Hashtable<String,String> _root_namespace=new Hashtable<String,String>();
private boolean _setted_root_master_namespace_flag=false;
private boolean _hasHead=true;
private boolean _hasParamType=true;
private Hashtable<String,String> _method_attrib=new Hashtable<String,String>();
private Hashtable<String,String> _method_attrib_namespace=new Hashtable<String,String>();
private Hashtable<String,String> _methodattrib_namespace=new Hashtable<String,String>();
private Hashtable<String,String> _methods_namespace=new Hashtable<String,String>();
public CSOAPClient(String url,String service_id,String method,String soap_action) throws Exception {
_url=new URL(url); //SOAP服务的网址
if((service_id==null)||(service_id.trim().equals(""))){
_service_id=null;
}
else{
_service_id=service_id;
}
_method=method;
_soap_action_str=soap_action;
createSocket();
}
public void setHasParamType(boolean v){
_hasParamType=v;
}
public void setHasHead(boolean v){
_hasHead=v;
}
protected void createSocket() throws Exception {
if(_httpConn==null){
// Properties systemProperties = System.getProperties();
// systemProperties.setProperty("http.proxyHost","192.168.1.1");
// systemProperties.setProperty("http.proxyPort","8080");
_httpConn = (HttpURLConnection) _url.openConnection();;
}
}
public void addParams(String params_name,Object v,EParamType type){
NParam np=new NParam(params_name,v,type);
_params.add(np);
}
public void addMethodNamespace(String namespace_name,String namespace_v){
_methods_namespace.put(namespace_name,namespace_v);
}
public void addMethodAttrib(String attrib_name,String v,String namespace_name,String namespace_v){
_method_attrib.put(attrib_name, v);
_method_attrib_namespace.put(attrib_name, namespace_name);
_methodattrib_namespace.put(namespace_name,namespace_v);
}
public void addMethodAttrib(String attrib_name,String v){
_method_attrib.put(attrib_name, v);
}
public void setRootMasterNamespace(){
if(!_setted_root_master_namespace_flag){
_root_master_namespace_name="soapenv";
_root_namespace.put(_root_master_namespace_name, "http://schemas.xmlsoap.org/soap/envelope/");
_setted_root_master_namespace_flag=true;
}
}
public void setRootMasterNamespace(String name){
if(!_setted_root_master_namespace_flag){
_root_master_namespace_name=name;
_root_namespace.put(_root_master_namespace_name, "http://schemas.xmlsoap.org/soap/envelope/");
_setted_root_master_namespace_flag=true;
}
}
public void addRootNamespace(String name,String v){
_root_namespace.put(name, v);
}
public String createSendSOAPPackage(){
Hashtable<String,Namespace> namespace_set=new Hashtable<String,Namespace>();
// 创建根节点 root;
Element root = new Element("Envelope");
Set<String> sets=_root_namespace.keySet();
Namespace master_namespace=null;
for(String s:sets){
String v=_root_namespace.get(s);
Namespace sn=Namespace.getNamespace(s, v);
namespace_set.put(s, sn);
if(s.equals(_root_master_namespace_name)){
root.setNamespace(sn);
master_namespace=sn;
}
else{
root.addNamespaceDeclaration(sn);
}
}
// 根节点添加到文档中;
Document doc = new Document(root);
if(_hasHead){
//创建Header节点
Element head=new Element("Header");
head.setNamespace(master_namespace);
//加入根节点
root.addContent(head);
}
//创建Body节点
Element body=new Element("Body");
body.setNamespace(master_namespace);
//加入根节点
root.addContent(body);
//创建调用的方法节点
Element method=new Element(_method);
body.addContent(method);
Set<String> method_attrib_set=_method_attrib.keySet();
boolean flag=false;
Namespace ns=null;
for(String attrib_name:method_attrib_set){
String attrib_v=_method_attrib.get(attrib_name);
flag=_method_attrib_namespace.containsKey(attrib_name);
if(flag){
String namespace_name=_method_attrib_namespace.get(attrib_name);
flag=namespace_set.containsKey(namespace_name);
if(flag){
ns=namespace_set.get(namespace_name);
}
else{
String namespace_v=_methodattrib_namespace.get(namespace_name);
ns=Namespace.getNamespace(namespace_name, namespace_v);
method.setNamespace(ns);
namespace_set.put(namespace_name, ns);
}
Attribute attrib=new Attribute(attrib_name, attrib_v,ns);
method.setAttribute(attrib);
}
else{
Attribute attrib=new Attribute(attrib_name, attrib_v);
method.setAttribute(attrib);
}
}
Set<String> methods_attrib=_methods_namespace.keySet();
for(String namespace_name:methods_attrib){
flag=namespace_set.containsKey(namespace_name);
if(flag){
}
else{
String namespace_v=_methods_namespace.get(namespace_name);
ns=Namespace.getNamespace(namespace_name, namespace_v);
method.setNamespace(ns);
namespace_set.put(namespace_name, ns);
}
}
if(_service_id!=null){
Namespace nsl=Namespace.getNamespace("tns", _service_id);
method.setNamespace(nsl);
}
//创建调用方法的参数节点
int count=_params.size();
for(int i=0;i<count;i++){
NParam np=_params.get(i);
String param_name=np.getName();
String param_value=np.getValue().toString();
String param_type=np.getType().getValue();
Element param=new Element(param_name);
method.addContent(param);
param.setText(param_value);
if(_hasParamType){
Attribute param_attrib=new Attribute("type", param_type);
param.setAttribute(param_attrib);
}
}
//定义输出
XMLOutputter XMLOut = new XMLOutputter();
//设置格式
Format format = Format.getPrettyFormat();
format.setEncoding("UTF-8"); //设置 xml文件的字符为UTF-8
format.setIndent(" "); //设置xml文件的缩进为4个空格
XMLOut.setFormat(format);
return XMLOut.outputString(doc);
}
public CXML call() throws Exception {
String send_soap=createSendSOAPPackage();
System.out.println("Request XML:");
System.out.println(send_soap);
_httpConn.setReadTimeout(TIME_OUT);
_httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows XP; DigExt)");
_httpConn.setRequestProperty( "Content-Length",String.valueOf( send_soap.length() ) );
System.out.println("Content-Length:"+String.valueOf( send_soap.length() ));
_httpConn.setRequestProperty("Content-Type","text/xml; charset=UTF-8");
System.out.println("Content-Type:text/xml; charset=UTF-8");
// _httpConn.setRequestProperty("soapActionString",_soap_action_str);
_httpConn.setRequestProperty("SOAPAction",_soap_action_str);
System.out.println("SOAPAction:"+_soap_action_str);
_httpConn.setRequestMethod( "POST" );
System.out.println("Request Method:POST");
_httpConn.setDoInput(true);
_httpConn.setDoOutput(true);
_httpConn.setUseCaches(false);
_httpConn.connect();
OutputStream out = _httpConn.getOutputStream();
out.write( send_soap.getBytes() );
out.flush();
out.close();
int code=0;
code = _httpConn.getResponseCode();
CXML xmlobj=null;
if (code == HttpURLConnection.HTTP_OK) {
xmlobj=new CXML(_httpConn.getInputStream(),_root_master_namespace_name,_root_namespace.get(_root_master_namespace_name));
}
else{
System.out.println("Response Code: "+String.valueOf(code));
xmlobj=new CXML(_httpConn.getErrorStream(),_root_master_namespace_name,_root_namespace.get(_root_master_namespace_name));
System.out.println("错误详情: ");
String faultcode=xmlobj.getElementTextByXPath("/soapenv:Envelope/soapenv:Body/soapenv:Fault/faultcode");
System.out.println("错误代码: "+faultcode);
String faultstring=xmlobj.getElementTextByXPath("/soapenv:Envelope/soapenv:Body/soapenv:Fault/faultstring");
System.out.println("错误描述: "+faultstring);
}
return xmlobj;
}
public void destroy(){
if(_httpConn!=null){
_httpConn=null;
}
}
public String toUTF8(String str) {
if ("".equals(str)) {
return "";
}
StringBuffer strBuff = new StringBuffer("");
try {
byte b[] = str.getBytes("UTF-16");
for (int n = 0; n < b.length; n++) {
str = (Integer.toHexString(b[n] & 0XFF));
if (str.length() == 1) {
strBuff.append("0").append(str);
} else {
strBuff.append(str);
}
}
// 去除第一个标记字符
str = strBuff.toString().toUpperCase().substring(4);
// System.out.println(str);
char[] chs = str.toCharArray();
strBuff.delete(0, strBuff.length());
for (int i = 0; i < chs.length; i = i + 4) {
strBuff.append(chs[i])
.append(chs[i + 1])
.append(chs[i + 2])
.append(chs[i + 3])
.append(" ");
}
} catch (Exception e) {
System.out.print(e.getStackTrace());
e.getStackTrace();
}
return strBuff.toString();
}
public final class NParam {
private String _name=null;
private Object _value=null;
private EParamType _type=null;
public NParam(String name,Object value,EParamType type){
_name=name;
_value=value;
_type=type;
}
public String getName() {
return _name;
}
public EParamType getType() {
return _type;
}
public Object getValue() {
return _value;
}
}
public enum EParamType{
String("xsd:string"),Integer("xsd:integer"),Long("xsd:long"),Datetime("xsd:dateTime");
private final String _v;
private EParamType(String v) {
this._v = v;
}
public String getValue() {
return _v;
}
}
}
2、CXML
package util;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;
/**
*
* @author zhaob
*/
public class CXML {
private SAXBuilder _sax=new SAXBuilder();
private Document _doc=null;
private Element _root = null;
private Namespace _master_namespace=null;
public CXML(InputStream is,String namespace_name,String namespace_v) throws Exception {
InputStreamReader isr = new InputStreamReader(is,"utf-8");
_doc=_sax.build(isr);
_root = _doc.getRootElement();
_master_namespace=Namespace.getNamespace(namespace_name, namespace_v);
}
public String getElementTextByXPath(String xpath) throws Exception {
String rtn=null;
XPath xpathobj=XPath.newInstance(xpath);
xpathobj.addNamespace(_master_namespace);
Element obj=(Element)xpathobj.selectSingleNode(_doc);
rtn=obj.getTextTrim();
return rtn;
}
public String toString(){
XMLOutputter o=new XMLOutputter();
//设置格式
Format format = Format.getPrettyFormat();
format.setEncoding("UTF-8"); //设置 xml文件的字符为UTF-8
format.setIndent(" "); //设置xml文件的缩进为4个空格
o.setFormat(format);
String xmlstr=o.outputString(_doc);
return xmlstr;
}
}
3、CSOAPClinetTest 这是一个JUNIT的测试类,看其中RUN方法即可。
package util;
import java.util.List;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import util.CSOAPClient.EParamType;
/**
*
* @author zhaob
*/
public class CSOAPClinetTest {
public CSOAPClinetTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
// TODO add test methods here.
// The methods must be annotated with annotation @Test. For example:
//
// @Test
// public void hello() {}
@Test
public void run(){
CSOAPClient soap_client=null;
try{
soap_client=new CSOAPClient("http://10.20.4.21:8080/Webservices/SmsInf","SmInf","SendInstantSms","http://w.rr.com/SmsInf/SendInstantSms");
}
catch(Exception e){
System.out.println("Error:"+e.getMessage());
}
if(soap_client!=null){
soap_client.setHasHead(true);
soap_client.setRootMasterNamespace("soapenv");
soap_client.addRootNamespace("SmInf", "http://x.rr.com/SmInf");
soap_client.addMethodAttrib("encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/","soapenv","");
soap_client.setHasParamType(true);
soap_client.addParams("sequenceId", 2, EParamType.Long);
soap_client.addParams("accountCode", "user_id", EParamType.String);
soap_client.addParams("accountPasswd", "user_password", EParamType.String);
soap_client.addParams("sendPhoneNo", "1234567890", EParamType.String);
soap_client.addParams("msgContent", soap_client.toUTF8("紧急通知:特别紧急,十万火急."), EParamType.String);
soap_client.addParams("recvPhoneNo", "07919999999", EParamType.String);
soap_client.addParams("scheduleTime", "2000-10-10T09:35:12.123", EParamType.Datetime);
try{
CXML xmlobj=soap_client.call();
System.out.println("返回的XML:");
System.out.println(xmlobj.toString());
}
catch(Exception e){
System.out.println("Error:"+e.getMessage());
}
}
}
}
4、注意:运行此代码需要加入JDOM的全部lib目录下的包,否则使用XPATH时将报告错误。
如果还有什么疑问,可直接联系我。
通过HttpURLConnection来实现SOAP调用,无非就是向远端的WEB Service发出HTTP请求,请求的过程通过双方可以理解的XML格式流来传递数据信息。我以下面的SOAP请求的XML格式为基础来讲解:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SmInf="http://jx.ct10000.com/SmInf">
<soapenv:Header />
<soapenv:Body>
<tns:SendInstantSms xmlns:tns="SmInf" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<sequenceId type="xsd:long">1</sequenceId>
<accountCode type="xsd:string">user_id</accountCode>
<accountPasswd type="xsd:string">user_password</accountPasswd>
<sendPhoneNo type="xsd:string">1234567890</sendPhoneNo>
<msgContent type="xsd:string">7D27 6025 901A 77E5 FF1A 7279 522B 7D27 6025 FF0C 5341 4E07 706B 6025 002E</msgContent>
<recvPhoneNo type="xsd:string">1234567890</recvPhoneNo>
<scheduleTime type="xsd:dateTime">2000-10-10T09:35:12.123</scheduleTime>
</tns:SendInstantSms>
</soapenv:Body>
</soapenv:Envelope>
这个SOAP请求包格式并不能完全通用于任何场合,大家具体实现某个SOAP调用时,需要根据具体情况进行调整,可以通过Web Service服务提供商获取详情。
通过HttpURLConnection实现SOAP调用的过程简要概述如下:
1、拼接实现如上所示的SOAP请求包的XML格式的字符流;
2、上面讲到过SOAP调用就是一个HTTP请求,因此通过HttpURLConnection类设置相应的请求属性;
3、通过HttpURLConnection类的getOutputStream方法获得一个输出流,然后将SOAP请求包字符流写入此输出流;
4、通过HttpURLConnection类的getResponseCode方法获得服务器响应代码,如果响应代码为200(即HttpURLConnection.HTTP_OK)则表示请求成功,否则请求失败,请求失败后,可以通过getErrorStream方法来了解具体的错误详情;
5、通过HttpURLConnection类的getInputStream方法获得一个输入流,由此输入流获得服务器反馈结果数据;
大体通过HttpURLConnection实现SOAP调用的过程就是这样。下面来看具体实现代码:
编写CSOAPClient类,并定义成员变量_url和_httpConn,在构造函数中对其进行实例化。
_url=new URL(url); //这里url变量是SOAP服务的网址,如http://10.5.3.134/Webservices/methods1?wsdl
_httpConn = (HttpURLConnection) _url.openConnection(); //这里就是获得一个SOAP服务的HttpURLConnection实例
String send_soap=createSendSOAPPackage(); //createSendSOAPPackage函数就是用来构造如上所示SOAP请求的数据包的XML字符串
_httpConn.setReadTimeout(TIME_OUT); //为HttpURLConnection对象指定一个读超时
_httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows XP; DigExt)");
_httpConn.setRequestProperty( "Content-Length",String.valueOf( send_soap.length() ) );
_httpConn.setRequestProperty("Content-Type","text/xml; charset=UTF-8");
_httpConn.setRequestProperty("SOAPAction",_soap_action_str);
//以上都是为HTTP请求设定请求属性,其中SOAPAction中用来指定SOAP Action的字符串。
_httpConn.setRequestMethod( "POST" ); //为请求指定提交数据模式,对于调用Web Service来说请求模式要被设置成POST模式。
_httpConn.setDoInput(true);
_httpConn.setDoOutput(true);
_httpConn.setUseCaches(false);
_httpConn.connect(); //连接远程Url
OutputStream out = _httpConn.getOutputStream(); //获取输出流对象
out.write( send_soap.getBytes() ); //将要提交服务器的SOAP请求字符流写入输出流
out.flush();
out.close();
int code=0;
code = _httpConn.getResponseCode(); //用来获取服务器响应状态
if (code == HttpURLConnection.HTTP_OK) {
//服务器响应状态表示成功,这此处可以来获取服务器反馈的数据信息
InputStream is=_httpConn.getInputStream(); //获取输入流对象,通过此对象可以获取服务器传回的数据信息
InputStreamReader isr = new InputStreamReader(is,"utf-8");
Document _doc=_sax.build(isr); //此处Document是jdom中的类,因为要解析服务器传回的xml数据
Element _root = _doc.getRootElement(); //此处Element是jdom中的类
......(略)
}
else{
//如果服务器返回的HTTP状态不是HTTP_OK,则表示发生了错误,此时可以通过如下方法了解错误原因。
InputStream is=_httpConn.getErrorStream(); //通过getErrorStream了解错误的详情,因为错误详情也以XML格式返回,因此也可以用JDOM来获取。
InputStreamReader isr = new InputStreamReader(is,"utf-8");
Document _doc=_sax.build(isr); //此处Document是jdom中的类,因为要解析服务器传回的xml数据
Element _root = _doc.getRootElement(); //此处Element是jdom中的类
......(略)
}
以上就是通过HttpURLConnection调用SOAP的简介。
下面附上实现类的代码,供参考(未优化,大家使用时要优化一下)
1、CSOAPClient
package util;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.Set;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
*
* @author zhaob
*/
public class CSOAPClient {
private static int TIME_OUT=15000;
private URL _url = null;
private String _service_id=null;
private String _method=null;
private String _soap_action_str=null;
private LinkedList<NParam> _params = new LinkedList<NParam>();
private HttpURLConnection _httpConn=null;
private String _root_master_namespace_name=null;
private Hashtable<String,String> _root_namespace=new Hashtable<String,String>();
private boolean _setted_root_master_namespace_flag=false;
private boolean _hasHead=true;
private boolean _hasParamType=true;
private Hashtable<String,String> _method_attrib=new Hashtable<String,String>();
private Hashtable<String,String> _method_attrib_namespace=new Hashtable<String,String>();
private Hashtable<String,String> _methodattrib_namespace=new Hashtable<String,String>();
private Hashtable<String,String> _methods_namespace=new Hashtable<String,String>();
public CSOAPClient(String url,String service_id,String method,String soap_action) throws Exception {
_url=new URL(url); //SOAP服务的网址
if((service_id==null)||(service_id.trim().equals(""))){
_service_id=null;
}
else{
_service_id=service_id;
}
_method=method;
_soap_action_str=soap_action;
createSocket();
}
public void setHasParamType(boolean v){
_hasParamType=v;
}
public void setHasHead(boolean v){
_hasHead=v;
}
protected void createSocket() throws Exception {
if(_httpConn==null){
// Properties systemProperties = System.getProperties();
// systemProperties.setProperty("http.proxyHost","192.168.1.1");
// systemProperties.setProperty("http.proxyPort","8080");
_httpConn = (HttpURLConnection) _url.openConnection();;
}
}
public void addParams(String params_name,Object v,EParamType type){
NParam np=new NParam(params_name,v,type);
_params.add(np);
}
public void addMethodNamespace(String namespace_name,String namespace_v){
_methods_namespace.put(namespace_name,namespace_v);
}
public void addMethodAttrib(String attrib_name,String v,String namespace_name,String namespace_v){
_method_attrib.put(attrib_name, v);
_method_attrib_namespace.put(attrib_name, namespace_name);
_methodattrib_namespace.put(namespace_name,namespace_v);
}
public void addMethodAttrib(String attrib_name,String v){
_method_attrib.put(attrib_name, v);
}
public void setRootMasterNamespace(){
if(!_setted_root_master_namespace_flag){
_root_master_namespace_name="soapenv";
_root_namespace.put(_root_master_namespace_name, "http://schemas.xmlsoap.org/soap/envelope/");
_setted_root_master_namespace_flag=true;
}
}
public void setRootMasterNamespace(String name){
if(!_setted_root_master_namespace_flag){
_root_master_namespace_name=name;
_root_namespace.put(_root_master_namespace_name, "http://schemas.xmlsoap.org/soap/envelope/");
_setted_root_master_namespace_flag=true;
}
}
public void addRootNamespace(String name,String v){
_root_namespace.put(name, v);
}
public String createSendSOAPPackage(){
Hashtable<String,Namespace> namespace_set=new Hashtable<String,Namespace>();
// 创建根节点 root;
Element root = new Element("Envelope");
Set<String> sets=_root_namespace.keySet();
Namespace master_namespace=null;
for(String s:sets){
String v=_root_namespace.get(s);
Namespace sn=Namespace.getNamespace(s, v);
namespace_set.put(s, sn);
if(s.equals(_root_master_namespace_name)){
root.setNamespace(sn);
master_namespace=sn;
}
else{
root.addNamespaceDeclaration(sn);
}
}
// 根节点添加到文档中;
Document doc = new Document(root);
if(_hasHead){
//创建Header节点
Element head=new Element("Header");
head.setNamespace(master_namespace);
//加入根节点
root.addContent(head);
}
//创建Body节点
Element body=new Element("Body");
body.setNamespace(master_namespace);
//加入根节点
root.addContent(body);
//创建调用的方法节点
Element method=new Element(_method);
body.addContent(method);
Set<String> method_attrib_set=_method_attrib.keySet();
boolean flag=false;
Namespace ns=null;
for(String attrib_name:method_attrib_set){
String attrib_v=_method_attrib.get(attrib_name);
flag=_method_attrib_namespace.containsKey(attrib_name);
if(flag){
String namespace_name=_method_attrib_namespace.get(attrib_name);
flag=namespace_set.containsKey(namespace_name);
if(flag){
ns=namespace_set.get(namespace_name);
}
else{
String namespace_v=_methodattrib_namespace.get(namespace_name);
ns=Namespace.getNamespace(namespace_name, namespace_v);
method.setNamespace(ns);
namespace_set.put(namespace_name, ns);
}
Attribute attrib=new Attribute(attrib_name, attrib_v,ns);
method.setAttribute(attrib);
}
else{
Attribute attrib=new Attribute(attrib_name, attrib_v);
method.setAttribute(attrib);
}
}
Set<String> methods_attrib=_methods_namespace.keySet();
for(String namespace_name:methods_attrib){
flag=namespace_set.containsKey(namespace_name);
if(flag){
}
else{
String namespace_v=_methods_namespace.get(namespace_name);
ns=Namespace.getNamespace(namespace_name, namespace_v);
method.setNamespace(ns);
namespace_set.put(namespace_name, ns);
}
}
if(_service_id!=null){
Namespace nsl=Namespace.getNamespace("tns", _service_id);
method.setNamespace(nsl);
}
//创建调用方法的参数节点
int count=_params.size();
for(int i=0;i<count;i++){
NParam np=_params.get(i);
String param_name=np.getName();
String param_value=np.getValue().toString();
String param_type=np.getType().getValue();
Element param=new Element(param_name);
method.addContent(param);
param.setText(param_value);
if(_hasParamType){
Attribute param_attrib=new Attribute("type", param_type);
param.setAttribute(param_attrib);
}
}
//定义输出
XMLOutputter XMLOut = new XMLOutputter();
//设置格式
Format format = Format.getPrettyFormat();
format.setEncoding("UTF-8"); //设置 xml文件的字符为UTF-8
format.setIndent(" "); //设置xml文件的缩进为4个空格
XMLOut.setFormat(format);
return XMLOut.outputString(doc);
}
public CXML call() throws Exception {
String send_soap=createSendSOAPPackage();
System.out.println("Request XML:");
System.out.println(send_soap);
_httpConn.setReadTimeout(TIME_OUT);
_httpConn.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 5.0; Windows XP; DigExt)");
_httpConn.setRequestProperty( "Content-Length",String.valueOf( send_soap.length() ) );
System.out.println("Content-Length:"+String.valueOf( send_soap.length() ));
_httpConn.setRequestProperty("Content-Type","text/xml; charset=UTF-8");
System.out.println("Content-Type:text/xml; charset=UTF-8");
// _httpConn.setRequestProperty("soapActionString",_soap_action_str);
_httpConn.setRequestProperty("SOAPAction",_soap_action_str);
System.out.println("SOAPAction:"+_soap_action_str);
_httpConn.setRequestMethod( "POST" );
System.out.println("Request Method:POST");
_httpConn.setDoInput(true);
_httpConn.setDoOutput(true);
_httpConn.setUseCaches(false);
_httpConn.connect();
OutputStream out = _httpConn.getOutputStream();
out.write( send_soap.getBytes() );
out.flush();
out.close();
int code=0;
code = _httpConn.getResponseCode();
CXML xmlobj=null;
if (code == HttpURLConnection.HTTP_OK) {
xmlobj=new CXML(_httpConn.getInputStream(),_root_master_namespace_name,_root_namespace.get(_root_master_namespace_name));
}
else{
System.out.println("Response Code: "+String.valueOf(code));
xmlobj=new CXML(_httpConn.getErrorStream(),_root_master_namespace_name,_root_namespace.get(_root_master_namespace_name));
System.out.println("错误详情: ");
String faultcode=xmlobj.getElementTextByXPath("/soapenv:Envelope/soapenv:Body/soapenv:Fault/faultcode");
System.out.println("错误代码: "+faultcode);
String faultstring=xmlobj.getElementTextByXPath("/soapenv:Envelope/soapenv:Body/soapenv:Fault/faultstring");
System.out.println("错误描述: "+faultstring);
}
return xmlobj;
}
public void destroy(){
if(_httpConn!=null){
_httpConn=null;
}
}
public String toUTF8(String str) {
if ("".equals(str)) {
return "";
}
StringBuffer strBuff = new StringBuffer("");
try {
byte b[] = str.getBytes("UTF-16");
for (int n = 0; n < b.length; n++) {
str = (Integer.toHexString(b[n] & 0XFF));
if (str.length() == 1) {
strBuff.append("0").append(str);
} else {
strBuff.append(str);
}
}
// 去除第一个标记字符
str = strBuff.toString().toUpperCase().substring(4);
// System.out.println(str);
char[] chs = str.toCharArray();
strBuff.delete(0, strBuff.length());
for (int i = 0; i < chs.length; i = i + 4) {
strBuff.append(chs[i])
.append(chs[i + 1])
.append(chs[i + 2])
.append(chs[i + 3])
.append(" ");
}
} catch (Exception e) {
System.out.print(e.getStackTrace());
e.getStackTrace();
}
return strBuff.toString();
}
public final class NParam {
private String _name=null;
private Object _value=null;
private EParamType _type=null;
public NParam(String name,Object value,EParamType type){
_name=name;
_value=value;
_type=type;
}
public String getName() {
return _name;
}
public EParamType getType() {
return _type;
}
public Object getValue() {
return _value;
}
}
public enum EParamType{
String("xsd:string"),Integer("xsd:integer"),Long("xsd:long"),Datetime("xsd:dateTime");
private final String _v;
private EParamType(String v) {
this._v = v;
}
public String getValue() {
return _v;
}
}
}
2、CXML
package util;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;
/**
*
* @author zhaob
*/
public class CXML {
private SAXBuilder _sax=new SAXBuilder();
private Document _doc=null;
private Element _root = null;
private Namespace _master_namespace=null;
public CXML(InputStream is,String namespace_name,String namespace_v) throws Exception {
InputStreamReader isr = new InputStreamReader(is,"utf-8");
_doc=_sax.build(isr);
_root = _doc.getRootElement();
_master_namespace=Namespace.getNamespace(namespace_name, namespace_v);
}
public String getElementTextByXPath(String xpath) throws Exception {
String rtn=null;
XPath xpathobj=XPath.newInstance(xpath);
xpathobj.addNamespace(_master_namespace);
Element obj=(Element)xpathobj.selectSingleNode(_doc);
rtn=obj.getTextTrim();
return rtn;
}
public String toString(){
XMLOutputter o=new XMLOutputter();
//设置格式
Format format = Format.getPrettyFormat();
format.setEncoding("UTF-8"); //设置 xml文件的字符为UTF-8
format.setIndent(" "); //设置xml文件的缩进为4个空格
o.setFormat(format);
String xmlstr=o.outputString(_doc);
return xmlstr;
}
}
3、CSOAPClinetTest 这是一个JUNIT的测试类,看其中RUN方法即可。
package util;
import java.util.List;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import util.CSOAPClient.EParamType;
/**
*
* @author zhaob
*/
public class CSOAPClinetTest {
public CSOAPClinetTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
// TODO add test methods here.
// The methods must be annotated with annotation @Test. For example:
//
// @Test
// public void hello() {}
@Test
public void run(){
CSOAPClient soap_client=null;
try{
soap_client=new CSOAPClient("http://10.20.4.21:8080/Webservices/SmsInf","SmInf","SendInstantSms","http://w.rr.com/SmsInf/SendInstantSms");
}
catch(Exception e){
System.out.println("Error:"+e.getMessage());
}
if(soap_client!=null){
soap_client.setHasHead(true);
soap_client.setRootMasterNamespace("soapenv");
soap_client.addRootNamespace("SmInf", "http://x.rr.com/SmInf");
soap_client.addMethodAttrib("encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/","soapenv","");
soap_client.setHasParamType(true);
soap_client.addParams("sequenceId", 2, EParamType.Long);
soap_client.addParams("accountCode", "user_id", EParamType.String);
soap_client.addParams("accountPasswd", "user_password", EParamType.String);
soap_client.addParams("sendPhoneNo", "1234567890", EParamType.String);
soap_client.addParams("msgContent", soap_client.toUTF8("紧急通知:特别紧急,十万火急."), EParamType.String);
soap_client.addParams("recvPhoneNo", "07919999999", EParamType.String);
soap_client.addParams("scheduleTime", "2000-10-10T09:35:12.123", EParamType.Datetime);
try{
CXML xmlobj=soap_client.call();
System.out.println("返回的XML:");
System.out.println(xmlobj.toString());
}
catch(Exception e){
System.out.println("Error:"+e.getMessage());
}
}
}
}
4、注意:运行此代码需要加入JDOM的全部lib目录下的包,否则使用XPATH时将报告错误。
如果还有什么疑问,可直接联系我。
发表评论
-
rest 之 主题笔记
2014-03-22 09:59 8031、Web 服务主要有三种形式:SOAP、REST 和 RPC ... -
架构Web Service 之 描述与注册,发布Web服务
2013-06-12 19:31 0架构Web Service: 描述与注 ... -
soap wsdl
2013-06-12 19:29 0Web Service概述 Web Service的定义 ... -
Axis2 之 开发Java Web服务
2013-06-12 19:28 0概述 本文介绍了一个比较简单实用的基于Java的S ... -
Axis2 之 利用JiBX把XML转换Web服务
2013-06-12 19:18 0[ http://blog.csdn.net/phantomh ... -
AXIS2 之 Axis序列化/反序列化器开发指南
2013-06-12 19:15 0薛谷雨 rainight@126.com 联系。 http:/ ... -
Axis2 之 复合类型数据的传递
2013-06-12 18:50 0axis2开发指南 http://www.360doc.com ... -
Axis 之 soap wsdl
2013-06-12 18:01 0http://www.mohappy.com/blog/use ... -
Axis1.4
2013-06-12 17:58 0http://www.blogjava.net/xiaodao ... -
Axis 之 开发详细注释
2013-06-12 17:55 0http://www.360doc.com/content/1 ... -
Axis 之 WebService测试,开发,部署
2013-06-12 17:52 0带抓图的word文档在:http://618119.com/d ... -
axis 之 传递复杂类型
2013-06-12 17:49 1331从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了 ... -
Axis 之 axis三种开发方式
2013-06-12 17:43 1511Tomcat+Axis+Eclipse实例讲解 一、 ... -
在AXIS服务间传递JavaBean及其安全解决
2013-06-12 17:17 2606-------------------1、AXIS学习笔记-- ... -
web Service客户端调用
2013-06-12 16:30 0客户端调用 目前我用了2种调用方法 Client.java p ... -
WebService总结1
2012-09-28 23:31 1165web service大致有三 ... -
JAVA中三种WebService规范及底层实例
2012-09-28 23:19 3745http://www.360doc.com/conte ... -
WebService大讲堂系列之Axis2
2012-09-28 01:28 964http://www.360doc.com/conte ... -
Axis2+wsdl2java.bat生成客户端调用
2012-09-28 00:45 27631http://www.360doc.com/c ... -
使用Eclipse的Axis1.4插件开发Web Service及客户端
2012-09-27 23:47 961http://www.360doc.com/conte ...
相关推荐
在这个场景下,我们将探讨如何利用`HttpURLConnection`来调用.NET平台上的WebService服务。 **一、HttpURLConnection简介** `HttpURLConnection`是Java `java.net`包中的一个类,它提供了HTTP协议的连接、读写功能...
本文将深入探讨如何在Java环境中,利用HTTP POST方法调用WebService,并解决可能遇到的问题。 首先,理解HTTP POST方法。POST是HTTP协议中的一个请求方法,用于向服务器发送数据。在调用WebService时,POST方法可以...
接下来,我们将根据服务接口文档提供的信息编写Java程序,以实现调用Web服务并获取天气预报的功能。以下是一段示例代码: ```java import java.io.*; import java.net.*; import java.util.Vector; public class ...
3. .NET客户端使用生成的代理类,通过SOAP调用Java服务的方法,实现与Java服务的通信。 无论是Java调用.NET还是.NET调用Java,关键在于理解Web服务的基本概念和协议,以及如何在各自的平台上生成和消费Web服务。...
- **SOAPAction头部**: 对于某些WebService来说,SOAPAction是必需的,用于指定要调用的具体方法。 - **字符编码**: 在构造SOAP消息时要注意字符编码问题,确保消息体中的内容与声明的编码一致。 - **异常处理**: 在...
通过深入理解这个源码,你将掌握Android调用SOAP Web Service实现登录的基本流程和技巧。同时,你也可以尝试将此方法应用于RESTful API,只需修改请求构建和响应解析部分即可。不断实践和优化,你将在Android与Web ...
对于Java开发者,可以使用Apache CXF或JAX-WS来实现SOAP调用,代码中会定义服务接口并创建客户端代理。对于RESTful API,可以使用JAX-RS(如Jersey)或Spring MVC来实现。这些框架提供了方便的API,简化了请求的构建...
1. **SOAP调用**: - 创建SOAP请求:在Android中,可以使用`Ksoap2`库来创建SOAP请求。首先添加依赖,然后创建一个`SoapObject`,设置命名空间和方法名。接着,为方法添加参数,构建`SoapSerializationEnvelope`,...
这个"soap demo"应该包含解析XML响应、构造SOAP请求、调用Web服务方法等功能的代码。 6. **XML解析**:由于SOAP消息是基于XML的,因此在Android应用中,需要使用XML解析器如DOM或SAX来处理这些消息。Android SDK...
这通常可以通过HTTP客户端库实现,如Java的HttpURLConnection或HttpClient,C#的HttpClient类。 6. **处理响应**:Web Service接收到请求后,会处理并返回一个XML响应,同样也需要在客户端解析这个响应。解析XML...
SOAPUI是一款广泛使用的工具,它提供了友好的界面来测试和调用SOAP Web服务。这篇博客文章“模拟soapui调用webservice”可能探讨了如何在不使用SOAPUI图形界面的情况下,通过编程方式模拟SOAP请求。 首先,我们需要...
在Android开发中,调用Web Service来实现手机归属地查询是一项常见的需求,这通常涉及到网络通信、XML或JSON解析以及Web服务接口的调用。在这个过程中,开发者需要掌握以下关键知识点: 1. **Web Service**: Web ...
Java的CompletableFuture或者ExecutorService可以用来实现非阻塞调用。 10. **测试与调试**: 工具类应包含方便测试的特性,如日志记录、模拟响应、断点调试等,以便在开发过程中定位问题。 总的来说,"java 调用...
1. **SOAP调用示例**:创建一个简单的SOAP服务,使用JAX-WS注解定义服务接口和实现,然后使用wsimport工具生成客户端代码。在客户端,通过创建服务代理对象,调用服务方法。 2. **RESTful调用示例**:创建一个...
4. 接收响应:调用HttpURLConnection的getResponseCode()获取状态码,判断请求是否成功。然后使用getInputStream()或getInputStreamReader()读取响应数据。 5. 解析响应:根据Web服务返回的数据格式(如XML、JSON)...
// SOAP调用示例 public void soapCall() { JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient(...
2. **建立HTTP连接**:利用Android的HttpURLConnection或Volley、Retrofit等网络库,建立与服务器的连接。 3. **发送请求**:将SOAP消息作为HTTP请求的主体内容发送到服务器。 4. **接收响应**:获取服务器返回的...
Java作为一种广泛使用的编程语言,提供了多种方式来调用API,实现不同服务之间的数据交换和功能集成。本篇文章将详细探讨如何使用Java来调用API,以及相关的重要知识点。 首先,理解API的基本概念至关重要。API是一...
本示例着重讲解Android如何利用SOAP(Simple Object Access Protocol)或RESTful API来调用Web Service。 首先,理解SOAP协议是重要的一步。SOAP是一种轻量级的消息协议,它定义了消息的格式和消息如何通过HTTP进行...