Send object with android object list to SOAP web service in C#, using ksoap2

Asked

Viewed 163 times

0

I send an object containing a list of objects, the web service recognizes the object but does not recognize the list.

This is the source code:

public RetornoDto GravarRecebimentoNf (NotaFiscal nf, int codFilial, String nummatricula) throws Exception {
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    SoapObject RelacaoDetalhePedido =  new SoapObject("http://schemas.microsoft.com/2003/10/Serialization/Arrays", "RelacaoDetalhePedido");

    for(int i = 0; i < nf.getItens().size(); i++){

         SoapObject RelacaoImeiProduto = new SoapObject(NAMESPACE, "RelacaoImeiProduto");

        for(int j = 0; j < nf.getItens().get(i).getListDetalheImeiPedidoDescentralizadoDto().size(); j++){

            SoapObject DetalheImeiPedidoDescentralizadoDto = new SoapObject(NAMESPACE, "DetalheImeiPedidoDescentralizadoDto");

            DetalheImeiPedidoDescentralizadoDto.addProperty("Sequencial", nf.getItens().get(i).getListDetalheImeiPedidoDescentralizadoDto().get(j).getSequencial());

            SoapObject RelacaoImei = new SoapObject(NAMESPACE, "RelacaoImei");
            for(String imei : nf.getItens().get(i).getListDetalheImeiPedidoDescentralizadoDto().get(j).getRelacaoImei()){
                RelacaoImei.addProperty("string", imei);
            }
            DetalheImeiPedidoDescentralizadoDto.addProperty("RelacaoImei", RelacaoImei);

            RelacaoImeiProduto.addProperty("DetalheImeiPedidoDescentralizadoDto", DetalheImeiPedidoDescentralizadoDto);
        }

        SoapObject DetalhePedidoDescentralizadoDto = new SoapObject(NAMESPACE, "DetalhePedidoDescentralizadoDto");

        DetalhePedidoDescentralizadoDto.addProperty("CodigoSap", nf.getItens().get(i).getCodSap());
        DetalhePedidoDescentralizadoDto.addProperty("QuantidadaRecebida",nf.getItens().get(i).getQtd());
        DetalhePedidoDescentralizadoDto.addProperty("UnidadeComercializacao",
                nf.getItens().get(i).getNomUnidadeComercializacao().equals("anyType{}") ? "" : nf.getItens().get(i).getNomUnidadeComercializacao());
        DetalhePedidoDescentralizadoDto.addProperty("ValorUnitario", String.valueOf(nf.getItens().get(i).getValUnitario()));
        DetalhePedidoDescentralizadoDto.addProperty("ValorTotalBruto",String.valueOf(nf.getItens().get(i).getValTotalBruto()));
        DetalhePedidoDescentralizadoDto.addProperty("Cfop",
                nf.getItens().get(i).getNumCfop().equals("anyType{}") ? "" : nf.getItens().get(i).getNumCfop());
        DetalhePedidoDescentralizadoDto.addProperty("NumeroContrato",nf.getItens().get(i).getNumContrato());
        DetalhePedidoDescentralizadoDto.addProperty("SequencialItemContrato",nf.getItens().get(i).getNumSequencialItemContrato());
        DetalhePedidoDescentralizadoDto.addProperty("ValorCusto",String.valueOf(nf.getItens().get(i).getValCusto()));
        DetalhePedidoDescentralizadoDto.addProperty("QuantidadeMovimentacao",nf.getItens().get(i).getQtdMovimentacao());
        DetalhePedidoDescentralizadoDto.addProperty("QuantidadeAuditada",nf.getItens().get(i).getQtdRecebido());

        DetalhePedidoDescentralizadoDto.addProperty("SequencialItem", nf.getItens().get(i).getNumSequencialItem());

        RelacaoDetalhePedido.addProperty("DetalhePedidoDescentralizadoDto", DetalhePedidoDescentralizadoDto);

    }

    SoapObject pedidoDescentralizado = new SoapObject(NAMESPACE, "pedidoDescentralizado");

    pedidoDescentralizado.addProperty("CodigoFilial", codFilial);
    pedidoDescentralizado.addProperty("ChaveNFe", nf.getNumNotaFiscal().toString());
    pedidoDescentralizado.addProperty("NomeUsuario", nummatricula);

    pedidoDescentralizado.addProperty("RelacaoDetalhePedido", RelacaoDetalhePedido);

    pedidoDescentralizado.addProperty("ValorTotalBaseCalculo", String.valueOf(nf.getValTotalBaseCalculo()));
    pedidoDescentralizado.addProperty("NumeroFatura",
            nf.getNumFatura().equals("anyType{}") ? "" : nf.getNumFatura());
    pedidoDescentralizado.addProperty("ValorOriginalFatura", String.valueOf(nf.getValOriginalFatura()));
    pedidoDescentralizado.addProperty("ValorLiquidoFatura", String.valueOf(nf.getValLiquidoFatura()));

    try{

        SoapObject reqGravarNfe = new SoapObject(NAMESPACE, METHOD_GRAVAR_RECEBIMENTO_NF);
        reqGravarNfe.addProperty("pedidoDescentralizado", pedidoDescentralizado);

        SoapSerializationEnvelope envelopeGravarNfe =
                new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelopeGravarNfe.implicitTypes = true;
        envelopeGravarNfe.dotNet = false;
        envelopeGravarNfe.setOutputSoapObject(reqGravarNfe);

        androidHttpTransport.debug = true;

        androidHttpTransport.call(SOAP_ACTION_GRAVAR_RECEBIMENTO_NF, envelopeGravarNfe);

        Log.d("XML_REQUEST", androidHttpTransport.requestDump);
        Log.d("XML_RESPONSE", androidHttpTransport.responseDump);

        if(envelopeGravarNfe.bodyIn instanceof SoapFault){
            Log.e(WS.class.toString(), ((SoapFault) envelopeGravarNfe.bodyIn).getStackTrace().toString());
            throw new Exception(((SoapFault) envelopeGravarNfe.bodyIn).getMessage());
        }

        SoapObject objSoap = (SoapObject) envelopeGravarNfe.bodyIn;

        SoapObject objSoapNfe = (SoapObject) objSoap.getProperty(0);

        RetornoDto retorno = new RetornoDto();

        retorno.setContemErro(Boolean.parseBoolean(objSoapNfe.getPropertySafely("ContemErro", false).toString()));
        retorno.setMensagemErro(objSoapNfe.getPropertySafely("MensagemErro", "").toString());
        retorno.setCodigoBarrasInexistente(objSoapNfe.getPropertySafely("CodigoBarrasInexistente", "").toString());

        return retorno;
    }catch (Exception e){
        e.printStackTrace();
        throw e;
    }
}

This is the XML request

<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>
    <n0:GravarRecebimentoPedidoDescentralizado id="o0" c:root="1"
        xmlns:n0="http://tempuri.org/">
        <pedidoDescentralizado>
            <CodigoFilial>309</CodigoFilial>
            <ChaveNFe>32190304904042000450550010002008301677770271</ChaveNFe>
            <NomeUsuario>943665</NomeUsuario>
            <RelacaoDetalhePedido>
                <DetalhePedidoDescentralizadoDto>
                    <CodigoSap>000000000000157309</CodigoSap>
                    <QuantidadaRecebida>20</QuantidadaRecebida>
                    <UnidadeComercializacao></UnidadeComercializacao>
                    <ValorUnitario>0.0</ValorUnitario>
                    <ValorTotalBruto>0.0</ValorTotalBruto>
                    <Cfop></Cfop>
                    <NumeroContrato>7500002424</NumeroContrato>
                    <SequencialItemContrato>00500</SequencialItemContrato>
                    <ValorCusto>690.0</ValorCusto>
                    <QuantidadeMovimentacao>0</QuantidadeMovimentacao>
                    <QuantidadeAuditada>1</QuantidadeAuditada>
                    <SequencialItem>20</SequencialItem>
                </DetalhePedidoDescentralizadoDto>
            </RelacaoDetalhePedido>
            <ValorTotalBaseCalculo>0.0</ValorTotalBaseCalculo>
            <NumeroFatura></NumeroFatura>
            <ValorOriginalFatura>0.0</ValorOriginalFatura>
            <ValorLiquidoFatura>0.0</ValorLiquidoFatura>
        </pedidoDescentralizado>
    </n0:GravarRecebimentoPedidoDescentralizado>
</v:Body></v:Envelope>

And here the web service receiving the object with the null list

inserir a descrição da imagem aqui

Has anyone been there or knows a solution?

It seems a common problem, but found no answer in the forum.

1 answer

0

I decided as follows:

envelopeGravarNfe.dotNet = true;

And creating a Propertyinfo for each attribute, with its respective NAMESPACE.

pedidoDescentralizado.addProperty(newProperty("ValorLiquidoFatura", NAMESPACE_DOMAIN, String.valueOf(nf.getValLiquidoFatura())));

...

private PropertyInfo newProperty(String name, String namespace, Object value){
    PropertyInfo propertyInfo = new PropertyInfo();

    propertyInfo.setName(name);
    propertyInfo.setValue(value);
    propertyInfo.setNamespace(namespace);

    return propertyInfo;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.