安卓 WSDL 网络服务 ksoap2

标签 android service wsdl web ksoap

我正在尝试使用 ksoap2 库通过 Android 设备连接到 Web 服务。我已经让它可以很好地处理两种不同的服务,但现在我遇到了问题。每当我传递一个对象而不是原始类型时,它都会给我一个错误。我已经使用 KvmSerializable 实现了这些类,但仍然没有成功。这是从有效的 Web 浏览器发送的请求的 xml,以及从无效的 Android 设备发送的请求的 xml。任何建议都会很棒!

浏览器

     <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
    <CreateTour xmlns="http://tempuri.org/">
        <SecurityKey>2b9fac80-97ce-4483-b9e8-c1816656e1db</SecurityKey>
        <OriginDetails xmlns:d4p1="http://schemas.datacontract.org/2004/07/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <d4p1:Creator>3</d4p1:Creator>
            <d4p1:CreatorOS>1</d4p1:CreatorOS>
            <d4p1:CreatorVersion>1.0.0.18191</d4p1:CreatorVersion>
            <d4p1:IP>192.168.1.61</d4p1:IP>
            <d4p1:UserAgent>Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7</d4p1:UserAgent>
        </OriginDetails>
        <Details xmlns:d4p1="http://schemas.datacontract.org/2004/07/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <d4p1:Baths>1.00</d4p1:Baths>
            <d4p1:Beds>6</d4p1:Beds>
            <d4p1:City>Knoxville</d4p1:City>
            <d4p1:Country>US</d4p1:Country>
            <d4p1:CreatedDate>2012-01-24T17:50:09.0541149-05:00</d4p1:CreatedDate>
            <d4p1:Description>Another test</d4p1:Description>
            <d4p1:Garage>9</d4p1:Garage>
            <d4p1:MLSID>400</d4p1:MLSID>
            <d4p1:ModifiedDate>2012-01-24T17:50:09.0541149-05:00</d4p1:ModifiedDate>
            <d4p1:MusicFile>/music/magic.mp3</d4p1:MusicFile>
            <d4p1:Price>400</d4p1:Price>
            <d4p1:PropertyType>0</d4p1:PropertyType>
            <d4p1:SF>400</d4p1:SF>
            <d4p1:Schools i:nil="true" />
            <d4p1:ShowAddress>true</d4p1:ShowAddress>
            <d4p1:ShowPrice>true</d4p1:ShowPrice>
            <d4p1:State>TN</d4p1:State>
            <d4p1:Status i:nil="true" />
            <d4p1:Street>9111 Cross Park Drive</d4p1:Street>
            <d4p1:Title>Test</d4p1:Title>
            <d4p1:TourID i:nil="true" />
            <d4p1:YearBuilt i:nil="true" />
            <d4p1:Zip>37923</d4p1:Zip>
        </Details>
    </CreateTour>
</s:Body>

安卓

    <v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
    <CreateTour xmlns="http://tempuri.org/" id="o0" c:root="1">
        <SecurityKey i:type="d:string">641c38a3-b290-45db-b2d4-8c4edac5934a</SecurityKey>
        <OriginDetails i:type="d:anyType">
            <Creator i:type="d:int">4</Creator>
            <CreatorOS i:type="d:int">6</CreatorOS>
            <CreatorVersion i:type="d:string">1.0</CreatorVersion>
            <IP i:type="d:string">192.168.1.222</IP>
            <UserAgent i:type="d:string"></UserAgent>
        </OriginDetails>
        <Details i:type="d:anyType">
            <Baths i:type="d:int">1</Baths>
            <Beds i:type="d:int">2</Beds>
            <City i:type="d:string">Cleveland</City>
            <Country i:type="d:string">US</Country>
            <CreatedDate i:type="d:string"></CreatedDate>
            <Description i:type="d:string"></Description>
            <Garage i:type="d:int">2</Garage>
            <MLSID i:type="d:string">44</MLSID>
            <ModifiedDate i:type="d:string"></ModifiedDate
            ><MusicFile i:type="d:string"></MusicFile>
            <Price i:type="d:int">400</Price>
            <PropertyType i:type="d:int">0</PropertyType>
            <SF i:type="d:int">777</SF>
            <Schools i:type="d:string"></Schools>
            <ShowAddress i:type="d:boolean">true</ShowAddress>
            <ShowPrice i:type="d:boolean">true</ShowPrice>
            <State i:type="d:string">TN</State>
            <Status i:type="d:int">0</Status>
            <Street i:type="d:string">200 Post Road</Street>
            <Title i:type="d:string">Android Test Tour</Title>
            <TourID i:type="d:int">0</TourID>
            <YearBuilt i:type="d:int">0</YearBuilt>
            <Zip i:type="d:string">37362</Zip>
        </Details>          
    </CreateTour>
</v:Body>

最佳答案

我以前也遇到过类似的问题。我会给你一个例子,说明我必须在我的应用程序中修复的部分以及我是如何做的,检查你是否在你的案例中做了这些步骤:
在 wsdl 中有:

<message name="invokeService">
     <part name="serviceName" type="xsd:string"/>
     <part name="documents" type="tns:uriList"/>
     <part name="literalDocs" type="ns1:stringArray"/>
     <part name="connID" type="xsd:long"/>
     <part name="gateParams" type="tns:gateRuntimeParameterArray"/>
     <part name="userCtx" type="tns:userContext"/>
</message>


所以我必须遵循以下步骤:
1- 检查您实现 KvmSerializable 的类是否被准确定义并且没有遗漏任何东西(这对于复杂类型至关重要)

2-添加您需要的所有必要的 soap 对象属性,例如在我的例子中:

//for the part: <part name="serviceName" type="xsd:string"/>
SoapObject.addProperty("serviceName", whateverServiceNameItWas);

//for the part: <part name="documents" type="tns:uriList"/>,where uriList was a complex type
PropertyInfo pi = new PropertyInfo();
pi.setName("documents");
pi.setValue(usrOptPr.getDocuments());
pi.setType(UriList.class);
sobj.addProperty(pi);

等... 3-构建信封:

SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.setOutputSoapObject(SoapObject);

4- 添加复杂类型之间的映射(即实现 kvmserializable 的本地类,以及 web 服务上真正匹配的类)

//---------------------------------------------------------------------------------------
// MAPPINGS:
// A mapping tells the ksoap what class to generate.
// Complex data types that are not mapped are generated as SoapObjects.
// The mapping is required for both the request and the response.
 //---------------------------------------------------------------------------------------

//for example the UriList above     
soapEnvelope.addMapping(theNamespace, UriList.class.getSimpleName(), UriList.class);

5- 添加编码:(编码使用 java 序列化将对象更改为要在 Web 服务上解码的数据流。)

Marshal floatMarshal = new MarshalFloat();
floatMarshal.register(soapEnvelope);

6-使用AndroidHttpTransport调用网络服务
更新
我还注意到您在浏览器请求中有:

<d4p1:Schools i:nil="true" />

在 Android 中:

<Schools i:type="d:string"></Schools>

有时 ksoap2 会在这种情况下出现错误,我有同样的情况所以我只是删除(注释掉,因为它允许 nil 即空值)这个参数(即学校)从实现 kvmserializable 的特定类中删除(当然,您必须修改类中的其他内容,如“getPropertyCount”和“getPropertyInfo”以适应此更改)。当我这样做时它起作用了,所以请尝试并告诉我。

关于安卓 WSDL 网络服务 ksoap2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9023442/

相关文章:

Symfony2多级动态路由器

visual-studio - 客户端证书和 Visual Studio WSDL

xml - 从其他 WSDL 文件引用 xml 模式元素

java - android - 格式化 Double 并将其放在没有逗号的 TextView 中(如果需要)

android - 绑定(bind)服务与存储库

android - 如何在android中实现FM Transmitter?

angular - 如何在 Angular 5 中进行同步调用?

spring - 如何使用 Spring 注解实现远程处理?

java - Java 对象如何在 SOAP Web 服务中传递

android - 如何获取日期值并使用json android将其发送到服务器?