我正在尝试创建一个发出 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>
谁能告诉我我做错了什么?如果需要,很高兴提供更多细节。
答案 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;
}
}