2012-03-06 16 views
5

Estoy intentando subir un objeto complejo a un servicio web de WCF usando KSoap2 Android y teniendo algunas dificultades para hacerlo. He logrado llamadas exitosas al servicio web cuando uso SoapUI y complete los datos a mano. La solicitud generada por SoapUI éxito es la siguiente:Android Ksoap2: cómo especificar un espacio de nombres para las propiedades secundarias de un objeto complejo?

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:fpm="http://schemas.datacontract.org/2004/07/FPMobileServices"> 
<soapenv:Header/> 
<soapenv:Body> 
    <tem:CommitOne> 
    <tem:qr> 
     <fpm:ClientID>8aa2f6a4-4d15-4b4c-9cac-fb2478d0d27a</fpm:ClientID> 
     <fpm:CreatedBy>admin</fpm:CreatedBy> 
     <fpm:CreatedDate>2012-03-01T19:50:37</fpm:CreatedDate> 
     <fpm:DimensionID>8a02a339-b5a7-4c76-b95f-5891ef57736d</fpm:DimensionID> 
     <fpm:ImageID>b76c7bcc-a8f8-49ff-94c6-08cd2e05b1a8</fpm:ImageID> 
     <fpm:IndicatorID>4637b333-701d-4d03-a708-4de48569be84</fpm:IndicatorID> 
     <fpm:LoanOperationNumber>6-2011-72978</fpm:LoanOperationNumber> 
     <fpm:ModifiedBy>admin</fpm:ModifiedBy> 
     <fpm:ModifiedDate>2012-03-01T19:50:37</fpm:ModifiedDate> 
     <fpm:QuestionaireCompletedDate>2012-03-01T19:50:54</fpm:QuestionaireCompletedDate> 
     <fpm:QuestionnaireID>99967f70-8161-4922-929f-03136a389ba6</fpm:QuestionnaireID> 
     <fpm:ResultID>95fa03b5-80af-479d-9dec-f2bf94baf3cd</fpm:ResultID> 
     <fpm:ResultWeighting>0</fpm:ResultWeighting> 
     <fpm:StatusLevelID>03a91cd6-93cd-4503-a676-efa2967e82a7</fpm:StatusLevelID> 
     <fpm:UploadID>141D6A1F-8FFD-4CA4-8073-009338F22B13</fpm:UploadID> 
    </tem:qr> 
    </tem:CommitOne> 
</soapenv:Body> 
</soapenv:Envelope> 

la solicitud generada por el código de Java es:

<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> 
    <CommitOne xmlns="http://tempuri.org/" id="o0" c:root="1"> 
     <qr> 
      <ClientID>8aa2f6a4-4d15-4b4c-9cac-fb2478d0d27a</ClientID> 
      <LoanOperationNumber>6-2011-72978</LoanOperationNumber> 
      <CreatedBy i:null="true" /> 
      <CreatedDate>2012-03-01T19:50:37</CreatedDate> 
      <DimensionID>8a02a339-b5a7-4c76-b95f-5891ef57736d</DimensionID> 
      <ImageID>b76c7bcc-a8f8-49ff-94c6-08cd2e05b1a8</ImageID> 
      <IndicatorID>4637b333-701d-4d03-a708-4de48569be84</IndicatorID> 
      <ModifiedBy i:null="true" /> 
      <ModifiedDate i:null="true" /> 
      <QuestionnaireCompletedDate>2012-03-01T19:50:54</QuestionnaireCompletedDate> 
      <QuestionnaireID>99967f70-8161-4922-929f-03136a389ba6</QuestionnaireID> 
      <ResultID i:type="d:string">95fa03b5-80af-479d-9dec-f2bf94baf3cc</ResultID> 
      <ResultWeighting>0</ResultWeighting> 
      <StatusLevelID>03a91cd6-93cd-4503-a676-efa2967e82a7</StatusLevelID> 
      <UploadID i:type="d:string">8ffa3665-b691-486f-91a0-ebbe8575896c</UploadID> 
     </qr> 
    </CommitOne> 
</v:Body> 

La principal diferencia entre los dos parece ser la prefijos/espacios de nombres . Por alguna razón, cuando el objeto "qr" llega a mi código .NET, todas sus propiedades son nulas/cero.

He intentado 2 enfoques diferentes en mi código java, tratando de establecer mi objetivo "QR" como PropertyInfo:

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    // build request object 
    PropertyInfo qrPi = new PropertyInfo(); 
    qrPi.setName("qr"); 
    qrPi.setType(qr.getClass()); 
    qrPi.setValue(qr); 

    request.addProperty(qrPi); 

Y también el establecimiento de mis "QR" como SoapObject y luego usando .addProperty:

SoapObject result = new SoapObject(NAMESPACE, "qr"); 
    result.addProperty("ClientID", (String) qr.getClientID()); 
    result.addProperty("CreatedBy", (String) qr.getCreatedBy()); 
    result.addProperty("CreatedDate", (String) qr.getCreatedDate()); 
    result.addProperty("DimensionID", (String) qr.getDimensionID()); 
    result.addProperty("ImageID", (String) qr.getImageID()); 
    result.addProperty("IndicatorID", (String) qr.getIndicatorID()); 
    result.addProperty("LoanOperationNumber", (String) qr.getLoanOperationNumber()); 
    result.addProperty("ModifiedBy", (String) qr.getModifiedBy()); 
    result.addProperty("ModifiedDate", (String) qr.getModifiedDate()); 
    result.addProperty("QuestionnaireCompletedDate", (String) qr.getQuestionnaireCompletedDate()); 
    result.addProperty("QuestionnaireID", (String) qr.getQuestionnaireID()); 
    result.addProperty("ResultID", (String) qr.getResultID()); 
    result.addProperty("ResultWeighting", qr.getResultWeighting()); 
    result.addProperty("StatusLevelID", (String) qr.getStatusLevelID()); 
    result.addProperty("UploadID", (String) qr.getUploadID()); 

    request.addSoapObject(result); 

Pero ambos enfoques obtener el mismo resultado - todos los campos de mi "QR" del objeto son nulos cuando se pone en mi servicio web. He estado buscando preguntas similares en StackOverflow y encontré this pero no puedo encontrar la forma de aplicarlo a mi propio caso.

¿Alguien puede ayudar a arrojar algo de luz sobre la situación?

Respuesta

11

No estoy seguro de si debo responder mi propia pregunta, pero he encontrado una solución y la dejaré aquí para cualquier persona que tenga un problema similar.

La clave son los espacios de nombres diferentes. En el ejemplo generado por SoapUI, podemos ver que los elementos secundarios (ClientID, etc.) usan el espacio de nombres fpm, mientras que los elementos que están encima de ellos usan el espacio de nombres tem. Para especificar explícitamente el espacio de nombres para estos elementos secundarios, alteré el segundo enfoque discutido anteriormente: creé objetos PropertyInfo para cada elemento secundario y los agregué al SoapObject.

En lugar de utilizar:

result.addProperty(String "ClientID", Object qr.getClientID()); 

utilicé:

PropertyInfo pi = new PropertyInfo(); 
pi.setNamespace(QR_NAMESPACE); 
pi.setType(PropertyInfo.STRING_CLASS); 
pi.setName("ClientID"); 
pi.setValue(qr.getClientID()); 
result.addProperty(pi); 

Cuando hice esto con todas las propiedades, que funcionaba bien.

Espero que esto ayude a alguien más algún día!

+0

Hi breadbin, en su espacio de nombres de ejemplo tiene un prefijo como "tem" y "fpm". ¿Cómo podemos agregar estos prefijos en nuestro PropertyInfo? ¿o será cuidado por la biblioteca por sí mismo? – silwar

+0

@silwar, consulte la línea "pi.setNameSpace (QR_NAMESPACE)" en el código anterior; esto configura una cadena como el espacio de nombres para el objeto PropertyInfo. – breadbin

Cuestiones relacionadas