`
yunchow
  • 浏览: 322502 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

HttpUrlConnection 发送 SOAP 请求,SAX 解析 SOAP 响应

阅读更多
HttpUrlConnection 发送 SOAP 请求,SAX 解析 SOAP 响应

并附上抓包工具:wireshark


/*
 * Socket远程调用Web服务实现,并用SAX解析XML文件,适用于性能要求较高场合
 */
package com.mypack.soap.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Stack;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

/**
 * 为了提高WebService调用效率,因此手Socket自已实现,无需依赖任何Soap引擎
 * @version 1.0
 * @date 2010-08-21
 */
public final class SoapClientAsHttpUrlConnection
{
    /**
     * apache 日志记录器,底层可切换实现
     */
    private static Log logger = LogFactory.getLog(SoapClientAsHttpUrlConnection.class);
    
    /**
     * 为了简单直接写了,最好单独写一方法并采用 Executors 启动线程,将返回值加入 BlockingQueue
     */
    public static void main(String[] args) throws URISyntaxException, IOException, SAXException
    {
        // soap request string
        final String soapReuqest = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><ns1:queryUser soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:ns1=\"http://services.zhang.com\"><in0 xsi:type=\"ns2:UserInfo\" xsi:nil=\"true\" xmlns:ns2=\"http://tdo.zhang.com\"/></ns1:queryUser></soapenv:Body></soapenv:Envelope>";
        
        // Web 服务所在的地址
        URI uri = new URI("http://10.40.51.156:28888/testSoap/services/UserManage");
        URL url = uri.toURL();
        
        // 打开连接
        HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();
        
        // 可读取
        httpUrlConnection.setDoInput(true);
        httpUrlConnection.setDoOutput(true);
        httpUrlConnection.setRequestMethod("POST");
        
        // set request header
        httpUrlConnection.setRequestProperty("SOAPAction", "");
        //httpUrlConnection.setRequestProperty("Content-Length", soapReuqest.length() + "");
        
        OutputStream os = httpUrlConnection.getOutputStream();
        PrintWriter out = new PrintWriter(os);
        
        out.println(soapReuqest);
        out.flush();
        
        StringBuilder sb = new StringBuilder();
        
        // http status ok
        if (HttpURLConnection.HTTP_OK == httpUrlConnection.getResponseCode())
        {
            if (logger.isDebugEnabled())
            {
                logger.debug("HTTP_OK");
            }
            
            InputStream is = httpUrlConnection.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            
            for (String line = br.readLine(); line != null; line = br.readLine())
            {
                sb.append(line);
            }
            is.close();
        }
        
        // Release resource
        os.close();
        out.close();
        httpUrlConnection.disconnect();
        
        String soapResponse = sb.toString();
        
        System.out.println(soapResponse);
        
        // parse the soap response
        // 底层是xces解析器,效率较高
        XMLReader xmlReader = XMLReaderFactory.createXMLReader();
        
        SimpleHandler handler = new SimpleHandler();
        xmlReader.setContentHandler(handler);
        
        InputSource inputSource = new InputSource(new StringReader(soapResponse));
        try
        {
            xmlReader.parse(inputSource);
        }
        catch (ExtSAXException e)
        {
        }
        
        // 便于演示,直接打出,生产环境请匆如此使用,可用日志进行 debug
        System.out.println("Response is " + handler.response);
    }
    
    /**
     * SAX 处理器,底层运用观察者模式
     * 对于XML这种结构,运用栈进行存储
     * 如果解析到目标串,利用抛出自定义异常来提前终止操作,提高效率
     */ 
    private static class SimpleHandler extends DefaultHandler
    {
        /**
         * 用栈缓存上下文信息
         */
        private final Stack<String> stack = new Stack<String>();

        private String response;
        
        /**
         * 每次传递 16K 数据,这一点很重要,但是在这里只需要一个串,因此忽略
         */
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException
        {
            if (!stack.empty() && "queryUserReturn".equals(stack.pop()))
            {
                response = new String(ch, start, length);
                
                // 抛出异常,结束解析
                throw new ExtSAXException();
            }
        }

        /**
         * 元素开始自动触发,将开始标签压栈缓存
         */
        @Override
        public void startElement(String uri, String localName, String name,
                Attributes atts) throws SAXException
        {
            if ("queryUserReturn".equals(localName))
            {
                stack.push(localName);
            }
        }

    }
    
    /**
     * 自定义异常,用于终止解析任务
     */
    private static class ExtSAXException extends SAXException
    {
        private static final long serialVersionUID = 1L;
        
    }
    
}

6
0
分享到:
评论
4 楼 yanliyun 2013-12-13  
这几个案例也下载下来损害
3 楼 yanliyun 2013-12-13  
楼主这个在我控制台输出 Response is null什么情况,能不能告诉详细怎么用的
2 楼 tojaoomy 2012-04-26  
还需要在
httpUrlConnection.setRequestProperty("SOAPAction", "");
后添加httpUrlConnection.setRequestProperty("Content-type", "text/xml");
才会成功。
1 楼 playingfly 2011-12-28  
   好文! 很经典!

相关推荐

    soap demo 下载

    5. **SOAP客户端**:在Android应用中,实现SOAP客户端意味着创建能够发送SOAP请求并解析响应的对象。这个"soap demo"应该包含解析XML响应、构造SOAP请求、调用Web服务方法等功能的代码。 6. **XML解析**:由于SOAP...

    soap 开发(axis的使用)&& 天气预报查询工具

    5. **解析SOAP响应**: SOAP响应同样是一个XML文档,可以使用DOM(Document Object Model)或者SAX(Simple API for XML)解析器来处理。对于天气预报查询,你可能需要解析出温度、湿度等信息。 6. **天气预报查询...

    android 调用webservice 有源码+jar

    - 解析SOAP响应的函数,这一步通常需要对XML解析有所了解,例如使用DOM或SAX解析器。 - 示例调用函数,整合以上步骤,完成整个Webservice调用流程。 6. **注意事项** - 网络权限:在AndroidManifest.xml中添加`...

    android-WstpBridge

    在Android系统中,WstpBridge主要负责封装SOAP请求,解析响应,使得开发者能够轻松地调用Web服务API。 在提供的文件列表中,有两个重要文件:WstpMockClient和WstpBridge。WstpMockClient通常是一个模拟客户端,...

    WebService(WEB服务)--获取网络数据

    在`ExchangeRateXML.java`中,可能包含了创建SOAP请求和解析SOAP响应的代码。 2. **JAX-WS (Java API for XML Web Services)**: 这是Java平台用于构建和部署Web服务的标准API。开发者可以使用JAX-WS创建服务端点和...

    从android中调用web service的源码.zip

    首先,我们需要添加KSOAP2依赖到项目中,然后创建SOAP请求对象,设置命名空间、方法名、参数等,并发送请求到服务器。 2. **KSOAP2使用步骤**: - 引入库:在项目的build.gradle文件中添加KSOAP2依赖。 - 创建...

    android webservice实例

    2. **设置HTTP请求**:在Android中,我们可以使用`HttpURLConnection`或`OkHttp`库来发送HTTP POST请求,包含SOAP请求的XML数据。记得设置正确的Content-Type(如"application/soap+xml")和URL,指向Web Service的...

    网络请求与XML处理,

    常见的网络请求库有Android自带的HttpURLConnection,但更多开发者倾向于使用第三方库,如OkHttp和Volley,它们提供了更高效的性能和易用的API。 1. OkHttp:这是一个广泛使用的网络请求库,以其高性能、低内存占用...

    安卓开发-从android中调用web service的源码.zip

    - 发送请求:通过HttpURLConnection、HttpClient或者第三方库如OkHttp发送请求。 - 处理响应:解析返回的XML或JSON数据,转换为Java对象。 3. SOAP通信: - SOAP消息结构:包括Envelope、Header和Body三个部分,...

    andriod调用webservice源代码

    Ksoap2允许Android应用通过HTTP发送SOAP请求并解析返回的XML数据。 2. **SOAP通信** SOAP是一种基于XML的协议,用于在Web上交换结构化和类型化的信息。在Android中,使用Ksoap2库时,我们需要设置SOAP版本、SOAP...

    android webservice

    根据WSDL文档,构建SOAP请求体,并使用上述示例代码中的方法发送请求。 3. **解析响应** 接收到服务器返回的SOAP响应后,需要解析其中的数据。如果响应是以XML形式返回的,则可以使用DOM或SAX等解析器进行解析。...

    安卓Android源码——从android中调用web service的源码.zip

    - SOAP:通过KSOAP2库,Android应用可以创建SOAP请求并解析响应。KSOAP2是一个轻量级的库,支持SOAP 1.1和1.2协议。 - RESTful:使用HTTP协议的GET、POST、PUT、DELETE等方法,通常配合JSON或XML数据格式。Android...

    Java远程读取XML文件相关

    下面是一个简单的示例,展示如何发送SOAP请求并接收响应。 ##### 发送SOAP请求 ```java import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; public class SOAPClient { ...

    Android手机号码归属地查询的应用程序

    3. **处理SOAP响应**:服务器响应同样是一个SOAP消息,需要解析这个XML响应来获取手机号码的归属地信息。Android提供了SAX、DOM、Pull Parser等多种XML解析方式,开发者可以根据性能和复杂性选择合适的方法。 4. **...

    java android 调用webservice

    5. 解析响应:根据Web服务返回的数据格式(如XML、JSON),使用解析库(如DOM、SAX、Jackson、Gson)进行解析。 三、具体实现步骤 1. 添加网络权限:在AndroidManifest.xml中添加`...

    java webservice

    6. **解析响应**:服务器处理请求后返回SOAP响应,客户端需要解析这个响应以获取结果。这通常涉及XML解析库,如Java内置的DOM或SAX解析器。 7. **错误处理**:在客户端和服务端都要处理可能出现的异常,如网络问题...

    Android_Webservice

    例如,使用`HttpURLConnection`发送GET请求获取资源,或者使用`RequestBody`和`OkHttpClient`发送POST请求,提交数据到服务器。 3. **权限请求**:在Android中,访问网络需要获取相应的权限。在AndroidManifest.xml...

    手动连接webservice

    3. **发送请求体**:对于SOAP,请求体是SOAP消息;对于REST,可能是JSON或XML格式的数据。`HttpInvokeWS.java`可能会包含将这些数据写入连接的代码。 ```java String soapRequest = ...

    webService调用实例

    这可能涉及到创建SOAP请求,发送到服务端,然后接收并解析SOAP响应。理解SOAP请求和响应的结构,以及如何在客户端构造和解析它们,是掌握SOAP调用的关键。 2. **RESTful Web Service**: REST(Representational ...

    android访问webServicer

    在Android中,我们可以使用`HttpURLConnection`或`HttpClient`类来建立网络连接并发送XML请求。首先,构建XML请求字符串,然后将其写入到HTTP请求的主体部分。设置适当的请求头,如Content-Type为"application/xml...

Global site tag (gtag.js) - Google Analytics