Soap协议的应用

Soap是指简单对象访问协议,属于WebService三大要素之一。

刚好项目中有用到了Soap协议,于是就进行了简单的封装成了工具类。代码如下:

package com.szh.inventorymanage.ui;

import java.util.Map;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class SaopUtil {

    public static String request(SoapObject request) {

        // 实例化SoapObject对象,并指定命名空间和方法名
        // SoapObject request = new SoapObject(Contants.nameSpace, methodName);
        // if (!req.equals("")) {
        // // 设置参数
        // request.addProperty("lsId", req);
        // }
        // request.addProperty("passWord", encrypted_pwd);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
        envelope.setOutputSoapObject(request);
        // 设置是否为.net
        envelope.dotNet = true;
        envelope.encodingStyle = SoapSerializationEnvelope.ENV;
        // 构建传输对象,并指明端口
         HttpTransportSE ht = new HttpTransportSE(Contants.wsdl);
        try {
            ht.call(null, envelope);
        } catch (Exception e) {
            e.printStackTrace();
        }
        Object resultObject = null;
        try {
            resultObject = envelope.getResponse();// 使用getResponse方法获得WebService方法的返回结果
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (resultObject != null) {
            return resultObject.toString();
        } else {
            return "";
        }
    }

    /**
     * 设置参数
     *
     * @param methodName
     * @param paramName
     * @param req
     * @return
     */
    public static SoapObject setRequestParam(String methodName,
            String paramName, String req) {
        // 实例化SoapObject对象,并指定命名空间和方法名
        SoapObject request = new SoapObject(Contants.nameSpace, methodName);
        if (!req.equals("")) {
            // 设置参数
            request.addProperty(paramName, req);
        }
        return request;
    }

    /**
     * 参数设置,当有多个参数时调用这个方法
     *
     * @param method
     * @param map
     * @return
     */
    public static SoapObject setRequestParam(String methodName,
            Map<String, String> map) {
        // 实例化SoapObject对象,并指定命名空间和方法名
        SoapObject request = new SoapObject(Contants.nameSpace, methodName);
        if (map.size() > 0) {
            // 遍历map集合,获取键值对
            for (java.util.Map.Entry<String, String> entry : map.entrySet()) {
                String paramName = entry.getKey();
                String paramKey = entry.getValue();
                // 设置到请求体中
                request.addProperty(paramName, paramKey);
            }
        }
        return request;
    }
}

=========================================================代码完毕

下面是用法:

                 SoapObject request = SaopUtil.setRequestParam(Contants.getLisAllPo, "lsId", mID);
                 //  请求服务器
                 json = SaopUtil.request(request);

或者

                Map<String, String> map = new HashMap<String, String>();
                // 封装参数
                map.put("absClsId", id + "");
                map.put("page", page + "");
                // 这是初期入库的请求结构信息
                // 设置参数
                SoapObject request = SaopUtil.setRequestParam(Contants.getPartOccurence, map);
                // 请求服务器
                String json = SaopUtil.request(request);  


有几点需要解释一下:

第一,命名空间和方法名,命名空间与服务器端命名空间保持一致,服务器端通常如下

@WebService(targetNamespace = "xxx")

@SOAPBinding(style = Style.RPC)

public interface XXX{

}

因此,客户端的命名空间也是"xxx",Contants.nameSpace=“xxx”。

第二,wsdl地址

Contants.wsdl = "http://" + 服务器地址 + ":"+服务器端口号+ "/Manager/webService/ws_WareHouse(括号前面的是自定义路径,在服务器的xml中可以配置)?wsdl";

第三,在activity中访问网络,要添加严苛模式。可以放到BaseActivity中

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectDiskReads().detectDiskWrites().detectNetwork()
                .penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectLeakedRegistrationObjects()
                .detectLeakedClosableObjects().penaltyLog().penaltyDeath()
                .build());


猜你喜欢

转载自blog.csdn.net/little_soybean/article/details/80494460
今日推荐