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

@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!