none
[CRM 2011] Consulta SOAP com Chrome RRS feed

  • Pergunta

  • Senhores, estou atualizando meus JS para funcionar tanto no Internet Explorer quanto no Chorme, mas estou tendo dificuldades nas minhas consultas SOAP.

    Alguns pontos na consulta estão me retornando erros como no exemplo abaixo, pesquisando achei os pontos no qual tenho que atualizar;

    //Antigo
    var xHReq = new ActiveXObject("Msxml2.XMLHTTP");
    //Atualizado
    var xHReq = new XMLHttpRequest();

    Alguém tem um exemplo de consulta utilizando SOAP que funciona tanto no Internet quanto no Chrome?

    terça-feira, 2 de abril de 2013 14:39

Respostas

  • Boas Daniel,

    Penso que você está seguindo o caminho certo, dê uma olhada neste post que tem essa mesma mudança. Outra solução e para mim a melhor é você usar OData, vê neste outro post como usar.

    Se você continuar apanhar erros, coloque aqui o erro completo e algum código para perceber o que está falhando.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP terça-feira, 2 de abril de 2013 16:09
    • Marcado como Resposta Daniel Jonathan quarta-feira, 3 de abril de 2013 14:12
    terça-feira, 2 de abril de 2013 16:09
  • Daniel,

    Por isso que devemos sempre que possível fazer o uso de bibliotecas como a XrmServiceToolkit, ela te abstrai a necessidade do crossbrowser, deixe por conta dos criadores da lib fazerem os ajustes, apenas desfrute das funções...

    Att,


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

    terça-feira, 2 de abril de 2013 19:04
    Moderador

Todas as Respostas

  • Boas Daniel,

    Penso que você está seguindo o caminho certo, dê uma olhada neste post que tem essa mesma mudança. Outra solução e para mim a melhor é você usar OData, vê neste outro post como usar.

    Se você continuar apanhar erros, coloque aqui o erro completo e algum código para perceber o que está falhando.

    Espero ter ajudado.
    Se respondi a sua pergunta por favor marque como resposta e\ou como útil.


    Pedro Azevedo Crm Specialist 4.0\2011

    • Sugerido como Resposta Azevedo PedroMVP terça-feira, 2 de abril de 2013 16:09
    • Marcado como Resposta Daniel Jonathan quarta-feira, 3 de abril de 2013 14:12
    terça-feira, 2 de abril de 2013 16:09
  • Ola Azevedo

    Estou adaptando meu código com o exemplo do primeiro link que vc postou, mas logo apos o xmlHttpRequest.send(xml);

    apresenta o seguinte erro:

    terça-feira, 2 de abril de 2013 16:19
  • Boas Daniel,

    Coloque aqui o seu SOAP Request. Parece mal formação do XML, tenta uma query simples e vê se funciona. Senão coloque aqui o código de toda a chamada. Outra ajuda é veres o que estás a enviar faz um alert do xml e vê se as tags estão bem definidas.

    Espero ter ajudado.


    Pedro Azevedo Crm Specialist 4.0\2011

    terça-feira, 2 de abril de 2013 16:27
  • No primeiro exemplo ele utiliza:

    xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");

    Eu utilizo :

    xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");

    Isso pode ser o problema?

    terça-feira, 2 de abril de 2013 16:27
  • Boas Daniel,

    Em principio não, depende do modo como você quer ler o retorno, veja as diferenças:

    Fetch Retrieves entity instances in XML format based on the specified query expressed in the FetchXML query language.
    Retrieve Retrieves an entity instance using the specified ID.
    RetrieveMultiple Retrieves a collection of entity instances based on the specified query criteria.

    Espero ter ajudado


    Pedro Azevedo Crm Specialist 4.0\2011

    terça-feira, 2 de abril de 2013 16:45
  • Bom parece que e mesmo no envio, pois o erro que mencionei acima acontece logo apos o , xmlHttpRequest.send(xml);

    Segue o XML da consulta:

    "<?xml version='1.0' encoding='utf-8'?><soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
        <soap:Header>
            <CrmAuthenticationToken xmlns="http&#58;&#47;&#47;schemas.microsoft.com&#47;crm&#47;2007&#47;WebServices">
                <AuthenticationType xmlns="http&#58;&#47;&#47;schemas.microsoft.com&#47;crm&#47;2007&#47;CoreTypes">0</AuthenticationType>
                <CrmTicket xmlns="http&#58;&#47;&#47;schemas.microsoft.com&#47;crm&#47;2007&#47;CoreTypes"></CrmTicket>
                <OrganizationName xmlns="http&#58;&#47;&#47;schemas.microsoft.com&#47;crm&#47;2007&#47;CoreTypes">SOTEC</OrganizationName>
                <CallerId xmlns="http&#58;&#47;&#47;schemas.microsoft.com&#47;crm&#47;2007&#47;CoreTypes">00000000-0000-0000-0000-000000000000</CallerId>
            </CrmAuthenticationToken>
        </soap:Header>
        <soap:Body>
            <Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices'>
                <fetchXml>&lt;fetch mapping='logical'&gt;&lt;entity name='account'&gt;&lt;attribute name='accountid'/&gt;&lt;link-entity name='account' to='accountid'&gt;&lt;filter type='and'&gt;&lt;condition attribute='new_cnpj' operator='eq' value='17.171.612/0001-40'/&gt;&lt;/filter&gt;&lt;/link-entity&gt;&lt;/entity&gt;&lt;/fetch&gt;</fetchXml>
            </Fetch>
        </soap:Body>
    </soap:Envelope>"

    Segue o código:

     var fetchMapping = "logical";
        var entityName = "account";
        var firstColumn = "accountid";
        var linkEntity = "account";
        var linkEntityTo = "accountid";
        var filterType = "and";
        var conditionAttribute = "new_cnpj";
        var operator = "eq";
        var value = "17.171.612/0001-40";
        var authenticationHeader = Xrm.Page.context.getAuthenticationHeader() ;
        var xml = "<?xml version='1.0' encoding='utf-8'?>" +
        "<soap:Envelope xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'" +
        " xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" +
        " xmlns:xsd='http://www.w3.org/2001/XMLSchema'>" +
        authenticationHeader +
        "<soap:Body>" +
        "<Fetch xmlns='http://schemas.microsoft.com/crm/2007/WebServices\'>" +              
        "<fetchXml>&lt;fetch mapping='" + fetchMapping + "'&gt;" +
        "&lt;entity name='" + entityName + "'&gt;" +
        "&lt;attribute name='" + firstColumn + "'/&gt;" +
        "&lt;link-entity name='" + linkEntity + "' to='" + linkEntityTo + "'&gt;" +
        "&lt;filter type='" + filterType + "'&gt;" +
        "&lt;condition attribute='" + conditionAttribute + "'" +
        " operator='" + operator + "' value='" + value + "'/&gt;" +
        "&lt;/filter&gt;" +
        "&lt;/link-entity&gt;" +
        "&lt;/entity&gt;" +
        "&lt;/fetch&gt;</fetchXml>" +
        "</Fetch>" +
        "</soap:Body>" +
        "</soap:Envelope>";
    
        xmlHttpRequest = new XMLHttpRequest();
        xmlHttpRequest.open("POST", "/mscrmservices/2007/CrmService.asmx", false);
        xmlHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Fetch");
        xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
       // xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
        xmlHttpRequest.send(xml);
        result = xmlHttpRequest.responseXML.xml;
    
        if (window.DOMParser) {
            parser = new DOMParser();
            doc = parser.parseFromString(xmlHttpRequest.responseText, "text/xml");
        }
        else // Internet Explorer
        {
            doc = new ActiveXObject("MSXML2.DOMDocument");
            doc.async = false;
            doc.loadXML(result);
        }
    
        if (doc.getElementsByTagName("name").length > 0) {
            var A = doc.getElementsByTagName("name").item(0).textContent
            alert(A);
        }
        else {
    
            var A = doc.getElementsByTagName("name").item(0).textContent
            alert(A);
        }

    terça-feira, 2 de abril de 2013 17:32
  • Daniel,

    Por isso que devemos sempre que possível fazer o uso de bibliotecas como a XrmServiceToolkit, ela te abstrai a necessidade do crossbrowser, deixe por conta dos criadores da lib fazerem os ajustes, apenas desfrute das funções...

    Att,


    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

    terça-feira, 2 de abril de 2013 19:04
    Moderador
  • Concordo, o problema e que o código acima já esta em produção, apenas tenho que deixar funcionando crossbrowser.
    terça-feira, 2 de abril de 2013 19:08
  • Ok, mas qual o problema em importar a lib e usar outra função?

    Tiago Michelini Cardoso MVP - MCC - MCTS
    https://tiagomcardoso.wordpress.com/

    terça-feira, 2 de abril de 2013 19:33
    Moderador
  • Nem tudo e tão fácil como queremos não e?

    O problema e que tenho uma biblioteca em produção que faz um CRUD completo funcionando perfeitamente, pra mim refatorar tudo utilizando uma biblioteca nova e fazendo os tratamentos que já estão feitos e mas demorado($) que refatorar apenas uma parte do codigo.

    Se poder me ajudar neste meu problema agradeço muito.

    Obrigado.

    terça-feira, 2 de abril de 2013 20:06
  • Senhores, 

    Achei melhor mesclar as funções do XrmServiceToolkit com meu CRUD que esta em produção, assim meu CRUD recebe as solicitações e encaminha para os métodos de consulta do XrmServiceToolkit.

    Obrigado a todos pela atenção.

    quarta-feira, 3 de abril de 2013 14:11