客户端实现调用webservice之soap

转载自:传智播客教程

用现成的webservice服务器来做测试:

http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo

以上为获取手机归属地信息的webservice网站。

以下为网站提供的调用规则:

SOAP 1.2

以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。

POST /WebServices/MobileCodeWS.asmx HTTP/1.1
Host: ws.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getMobileCodeInfo xmlns="http://WebXml.com.cn/">
      <mobileCode>string</mobileCode>
      <userID>string</userID>
    </getMobileCodeInfo>
  </soap12:Body>
</soap12:Envelope>
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">
      <getMobileCodeInfoResult>string</getMobileCodeInfoResult>
    </getMobileCodeInfoResponse>
  </soap12:Body>
</soap12:Envelope>

接下来我们写客户端方法:

package cn.itcast.service;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;
import cn.itcast.utils.StreamTool;

public class MobileInfoService {

    
    private static String readSoapFile(InputStream inStream, String mobile) throws Exception{
        byte[] data = StreamTool.readInputStream(inStream);
        String soapxml = new String(data);
        Map<String, String> params = new HashMap<String, String>();
        params.put("mobile", mobile);
        return replace(soapxml, params);
    }

    
    public static String replace(String xml, Map<String, String> params)throws Exception{
        String result = xml;
        if(params!=null && !params.isEmpty()){
            for(Map.Entry<String, String> entry : params.entrySet()){
                String name = "\\$"+ entry.getKey();
                Pattern pattern = Pattern.compile(name);
                Matcher matcher = pattern.matcher(result);
                if(matcher.find()){
                    result = matcher.replaceAll(entry.getValue());
                }
            }
        }
        return result;
    }

    public static String getMobileAddress(InputStream inStream, String mobile)throws Exception{
        String soap = readSoapFile(inStream, mobile);
        byte[] data = soap.getBytes();
        URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("POST");
        conn.setConnectTimeout(5 * 1000);
        conn.setDoOutput(true);//如果通过post提交数据,必须设置允许对外输出数据
        conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
        conn.setRequestProperty("Content-Length", String.valueOf(data.length));
        OutputStream outStream = conn.getOutputStream();
        outStream.write(data);
        outStream.flush();
        outStream.close();
        if(conn.getResponseCode()==200){
            return parseResponseXML(conn.getInputStream());
        }
        return null;
    }

    private static String parseResponseXML(InputStream inStream) throws Exception{
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(inStream, "UTF-8");
        int eventType = parser.getEventType();//产生第一个事件
        while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
            switch (eventType) {    
            case XmlPullParser.START_TAG:
                String name = parser.getName();//获取解析器当前指向的元素的名称
                if("getMobileCodeInfoResult".equals(name)){
                    return parser.nextText();
                }
                break;
            }
            eventType = parser.next();
        }
        return null;
    }
}

 

package cn.itcast.utils;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class StreamTool {

    /**
     * 从输入流读取数据
     * @param inStream
     * @return
     * @throws Exception
     */
    public static byte[] readInputStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while( (len = inStream.read(buffer)) !=-1 ){
            outSteam.write(buffer, 0, len);
        }
        outSteam.close();
        inStream.close();
        return outSteam.toByteArray();
    }
}

 调用示例:

String mobile = mobileText.getText().toString();
                InputStream inStream = this.getClass().getClassLoader().getResourceAsStream("mobilesoap.xml");
                try {
                    addressView.setText(MobileInfoService.getMobileAddress(inStream, mobile));
                } catch (Exception e) {
                    Log.e(TAG, e.toString());
                    Toast.makeText(MainActivity.this, "查询失败", 1).show();
                }

 

posted @ 2016-04-15 09:44  进进  阅读(650)  评论(0)    收藏  举报