ANDROID调用webservice带soapheader验证

最近的一个项目中调用webservice接口,需要验证soapheader,现将解决方法记录如下:(网上资料出处太多,就不做引用,原作者如看到,如有必要添加请通知)

1、先看接口

POST /webserver/ValideWebService.asmx HTTP/1.1
Host: IP地址
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://命名空间/Login"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <MySoapHeader xmlns="http://命名空间/">
      <ProjectID>string</ProjectID>
    </MySoapHeader>
  </soap:Header>
  <soap:Body>
    <Login xmlns="http://命名空间/">
      <loginName>string</loginName>
      <passowrd>string</passowrd>
    </Login>
  </soap:Body>
</soap:Envelope>

 

验证时需要验证header和body两部分,需要引入第三方jar包,ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar。下面就是我验证使用的方法,网上有许多,只不过无法验证,“拿来”修改一下,做个记录,供以后查看,也方便大家参阅。

先声明以下;
//命名空间
    private static final String NAMESPACE = "http://命名空间/";
    //服务地址
    private static String URL = "http://IP地址或者域名/webserver/ValideWebService.asmx";
    //调用的方法名
    private static final String METHOD_NAME = "Login";
    //此处是命名空间+方法名
    private static String SOAP_ACTION = "http://命名空间/Login";
    private SoapObject  detail;

由于2.3以上无法在主线程中直接访问网络,所以在需要的地方开启一个子线程,这里我在点击按钮登录的时候需要,因此写在onclick()方法下:

new Thread() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub  
                    super.run();
                    try {
                        SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);
                        //此处2个propertyinfo,是Login方法所需的参数,代码下面贴出asmx代码
                        PropertyInfo pi = new PropertyInfo();
                        pi.setName("loginName");
                        pi.setValue(cardNumStr);
                        rpc.addProperty(pi);
                        pi=new PropertyInfo();
                        pi.setName("passowrd");
                        pi.setValue(passwordStr);
                        rpc.addProperty(pi);
                        //soapheader在这里
                        Element[] header = new Element[1];
                        header[0] = new Element().createElement(NAMESPACE, "MySoapHeader");
                        Element username = new Element().createElement(NAMESPACE, "ProjectID");
                        username.addChild(Node.TEXT, "这里是值");
                        header[0].addChild(Node.ELEMENT, username);
                        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
                        envelope.headerOut = header;
                        envelope.bodyOut = rpc;
                        envelope.dotNet = true;
                        envelope.setOutputSoapObject(rpc);
                        HttpTransportSE ht = new HttpTransportSE(URL);
                        ht.call(SOAP_ACTION, envelope);
                        //SoapObject
                        detail =(SoapObject) envelope.getResponse();
                        System.out.println("返回的结果"+ detail.toString());
                    }catch (Exception e){
                        System.out.println("错误消息:"+ e.getMessage());
                    }
                    Message msg = handler.obtainMessage();
                    msg.obj=detail;
                    handler.sendMessage(msg);
                }
            }.start();

上面的cardNumStr和passwordStr是我从文本输入框获取的值。访问网络从接口通过验证然后获得返回值,对返回的数据进行处理就可以了。

用SoapObject,要不返回的detail为null。

 

private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            //这里做你的UI处理   
        };
    };

 

转载于:https://www.cnblogs.com/squirrel-king/p/5943308.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中调用WebService并添加SOAPHeader头信息的方法有多种。一种简单的方法是在具体的WebService方法上添加特性\[SoapHeader("RequestSOAPHeader")\]\[1\]。另一种方法是通过编写代码来发送HTTP POST请求并添加SOAPHeader头信息\[2\]\[3\]。你可以使用WebRequest类创建一个WebRequest对象,设置ContentType为"text/xml; charset=utf-8",设置Method为"POST",并添加SOAPAction头信息。然后使用GetRequestStream方法获取请求流,将参数转换为字节数组并写入请求流中。最后,使用GetResponse方法获取响应,并使用StreamReader读取响应流中的数据。这样就可以得到调用WebService后的结果。 #### 引用[.reference_title] - *1* [C#WebService客户端,添加SOAPHeader信息。](https://blog.csdn.net/catzhangzbt/article/details/112779826)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C#调用Java的WebService添加SOAPHeader验证](https://blog.csdn.net/weixin_30636089/article/details/99554547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值