Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

INTEGRATION CHERWELL

BRUNO BANDEIRA
Tera Guru

Hello, guys! I need some help!

Has anyone already made a REST API connection between ServiceNow and Cherwell?

I've tried everything, but I keep getting errors in my script. However, using Postman, I was able to reach the system and generate a token without any issues.

Could someone help me with the script? I've left a snippet below and attached the successful Postman call.

Thank you in advance guys!

 

var endpoint = 'https://{domain}/CherwellAPI/token'; 
var clientId = '{cilent_id}'; 
var username = '{username}'; 
var password = '{password}'; 
var authMode = 'internal';

var request = new sn_ws.RESTMessageV2();
request.setEndpoint(endpoint);
request.setHttpMethod('POST');
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var requestBody = 'grant_type=password' +
                          '&username=' + encodeURIComponent(username) +
                          '&password=' + encodeURIComponent(password) +
                          '&client_id=' + encodeURIComponent(clientId) +
                          '&auth_mode=' + encodeURIComponent(authMode);

request.setRequestBody(requestBody);

var response = request.execute();
var responseBody = response.getBody();
var httpStatus = response.getStatusCode();

gs.info(httpStatus);

 

  

1 ACCEPTED SOLUTION

Itallo Brandão
Kilo Guru

Brunão, 


Pelo log, o erro java.net.UnknownHostException indica que o domínio/host informado não está sendo resolvido ou não está acessível a partir do ServiceNow. Isso acontece antes mesmo de enviar qualquer payload, ou seja, é um problema de DNS/rede e não de parâmetros do script em si.

Quando o ServiceNow tenta chamar o endpoint e não reconhece o host, ele retorna Status HTTP: 0 e “request not sent”.

  1. Verifique a grafia do domínio

    • Um caractere trocado ou um “https://” a mais ou a menos pode gerar UnknownHostException.
    • Copie o domínio exato que está no Postman e cole no script para ter certeza de que não há erro de digitação.
  2. Domínio interno vs. Internet

    • Se o Cherwell estiver hospedado num ambiente interno (sem DNS público), o ServiceNow SaaS não conseguirá resolver o host diretamente.
    • Nesse caso, você precisa de um MID Server rodando dentro da sua rede que possa fazer a ponte.
    • Então, no script, você configuraria request.setMIDServer('nome_do_mid_server').
  3. Firewall ou ACL

    • Mesmo se o domínio for público, pode haver bloqueios de firewall que impedem a comunicação de entrada/saída.
    • Verifique se o endpoint permite requisições vindas de IPs do ServiceNow.
  4. Configurações de Outbound Network Access (SN)

    • Em instâncias que usam Allowlisted Outbound (com Access Control Rules), é preciso cadastrar o domínio na lista de destinos permitidos.
    • Verifique se o seu subdomínio Cherwell está liberado.
  5. Teste de Conexão

    • No módulo MID Server → IP Ranges ou nas configurações do seu proxy, garanta que o domínio do Cherwell seja acessível.
    • Se você usar um MID Server, no menu MID Server → Script Include → ECCDebug, é possível “pingar” o domínio para conferir se resolve o DNS.

Enfim, o script em si já está formatado corretamente (Content-Type, parâmetros etc.). O UnknownHostException ocorre porque o ServiceNow não conseguiu nem sequer “enxergar” o host. Ajustando a parte de DNS/acesso em rede (ou usando MID Server, se for ambiente interno), você deve receber o HTTP 200 como no Postman.


Espero ter ajudado! 

View solution in original post

7 REPLIES 7

Itallo Brandão
Kilo Guru

Olá, Bruno!

Tudo bem?


Olhando de fora assim é dificil entender o problema, mas vamos tentar...

Para integrar o ServiceNow ao Cherwell via REST (conseguir o token OAuth “password” grant), você pode seguir este passo a passo. A ideia é reproduzir exatamente o que funciona no Postman dentro do seu script de ServiceNow.


1. Compare tudo com o Postman

  1. Verifique o corpo da requisição

    • No Postman, está usando x-www-form-urlencoded com os seguintes campos:
      • grant_type=password
      • username={seu_usuario}
      • password={sua_senha}
      • client_id={seu_client_id}
      • auth_mode=internal
    • Confirme se não existem outros parâmetros (por exemplo, scope ou client_secret).
  2. Verifique os cabeçalhos (Headers)

    • Se no Postman for x-www-form-urlencoded, então deve ter:
      • Content-Type: application/x-www-form-urlencoded
    • Se for necessário client_secret, às vezes o Cherwell pede Authorization: Basic base64(client_id:client_secret). Mas no seu print não aparece, então provavelmente não é preciso.
  3. Verifique a capitalização

    • Se no Postman estiver auth_mode=internal (tudo minúsculo), use exatamente assim no script.
    • Cherwell pode ser sensível a maiúsculas e minúsculas, então revise também grant_type=“password”.

2. Script de Exemplo no ServiceNow

Abaixo um script completo, usando setRequestBody e encodeURIComponent para montar a requisição:

 

 

(function() {
    var endpoint  = 'https://{seuDominio}/CherwellAPI/token';
    var username  = '{seuUsuario}';
    var password  = '{suaSenha}';
    var clientId  = '{seuClientId}';
    var authMode  = 'internal'; // De acordo com seu Postman
    var grantType = 'password';

    var request = new sn_ws.RESTMessageV2();
    request.setEndpoint(endpoint);
    request.setHttpMethod('POST');

    // Configura que o body é x-www-form-urlencoded
    request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

    // Monta o corpo igual ao Postman
    var requestBody =
        'grant_type=' + encodeURIComponent(grantType) +
        '&username='  + encodeURIComponent(username)   +
        '&password='  + encodeURIComponent(password)   +
        '&client_id=' + encodeURIComponent(clientId)   +
        '&auth_mode=' + encodeURIComponent(authMode);

    request.setRequestBody(requestBody);

    // Opcional: Log detalhado para debug
    request.setLogLevel('all');

    var response    = request.execute();
    var httpStatus  = response.getStatusCode();
    var responseBody= response.getBody();

    gs.info('Status HTTP: ' + httpStatus);
    gs.info('Resposta: ' + responseBody);

})();

 

Observações Importantes

  • Testar e checar logs
    Vá em System Logs → Outbound HTTP Requests para ver o que de fato o ServiceNow enviou e qual a resposta do servidor Cherwell.
  • Comparar request do ServiceNow com o Postman
    Os parâmetros (grant_type, username, etc.) e o Content-Type precisam estar idênticos.
  • Possível uso de client_secret
    Se sua instância Cherwell precisar do client_secret, será necessário enviar um header Authorization: Basic base64(client_id:client_secret) ou então incluir client_secret no form, dependendo da documentação. Mas pelo print, parece que não é o caso.
  • Cuidados com SSL
    Se houver erro de certificado, verifique se o ServiceNow confia no certificado do domínio do Cherwell. Geralmente seria um erro de TLS, não 400 ou 401.

Seguindo essas etapas, você deve obter o mesmo sucesso do Postman, recebendo o token com HTTP 200 OK no ServiceNow.

Obrigado pelo rápido retorno @Itallo Brandão.

 

Conferi todas as configurações que você sugeriu, mas, aparentemente não consegui acesso ainda assim.

Encaminho as mensagens que recebi nos LOGS e no SCRIPTS - BACKGROND em anexo!

 

Atenciosamente,

Medi C
Giga Sage
Giga Sage

@BRUNO BANDEIRA 

Could you please set your request body and header as follow:

var requestBody = {
    "grant_type": grantType,
    "username": username,
    "password" : password,
    "client_id" : clientId,
    "auth_mode" : authMode
}
req.setRequestHeader('Content-Type','application/json');
request.setRequestBody(JSON.stringify(requestBody));

 


If you found this helpful, please hit the thumbs-up button and mark as correct. That helps others find their solutions.

Hello Medi,

 

Thanks for your help! I believe is a case of server unreachable! My test via POSTMAN was made using a jumper. I was in doubt about the function that I made, I wasn't sure if was correct.

 

It seems it was the case!

 

Anyway, i appreciate your help very much!

 

Thank you for the fast reply!