在Android Studio中使用EasyWsdl的标题

时间:2018-04-23 16:41:24

标签: android soap easywsdl

我正在尝试创建一个发出 SOAP 请求的Android应用。我已经尝试了几个不同的库( OkHTTP,kSoap2 )来帮助我解决这个问题,目前正在尝试通过 EasyWSDL 生成类。

我能够创建并发送请求,但我似乎无法添加我需要的标头。我正在代码中添加它们:

HeaderProperty hProp1 = new HeaderProperty("Authorization", "Basic " +
            org.kobjects.base64.Base64.encode("########:#######".getBytes()));
HeaderProperty hProp2 = new HeaderProperty("Username", "########");
HeaderProperty hProp3 = new HeaderProperty("Password", "########");

service.httpHeaders.add(hProp2);
service.httpHeaders.add(hProp3);
service.httpHeaders.add(hProp1);

但最后,生成的请求缺少这些标题:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.w3.org/2003/05/soap-encoding" xmlns:v="http://www.w3.org/2003/05/soap-envelope">
<v:Header />
<v:Body>

谁能告诉我我做错了什么?如果需要,很高兴提供更多细节。

1 个答案:

答案 0 :(得分:0)

我知道,这是个老问题,但也许我会帮助别人。因此,httpHeaders集合是添加HTTP标头(而不是SOAP标头)。

要添加自定义SOAP标头,最简单的方法是创建一个从生成的服务类继承的自定义类。然后覆盖createEnvelope方法并设置正确的soap标头。在代码中,您应该使用此自定义类来调用Web服务。这是一个示例:

public class TestService extends BasicHttpBinding_IBodyArchitectAccessService
{
    @Override
    protected ExtendedSoapSerializationEnvelope createEnvelope() {
        ExtendedSoapSerializationEnvelope env= super.createEnvelope();
        env.headerOut = new org.kxml2.kdom.Element[2];
        org.kxml2.kdom.Element h = new org.kxml2.kdom.Element().createElement("","APIKey");
        h.addChild(org.kxml2.kdom.Node.TEXT, "123455677");

        org.kxml2.kdom.Element lang = new org.kxml2.kdom.Element().createElement("","Lang");
        lang.addChild(org.kxml2.kdom.Node.TEXT, "pl");

        env.headerOut[0]=h;
        env.headerOut[1]=lang;
        return env;
    }
}