Como Extrair Protocolo, Domínio e Porta de uma URL?

Publicado 27 de agosto de 2024

Problema: Analisando Componentes de URL

Ao trabalhar com URLs na programação, frequentemente é necessário dividi-las em suas partes. Obter o protocolo, domínio e porta de uma URL é uma tarefa comum para desenvolvedores. Esse processo ajuda a manipular endereços web de forma mais eficiente, melhora as verificações de segurança e torna a comunicação em rede mais eficaz. No entanto, analisar manualmente esses elementos pode levar a erros e consumir muito tempo, especialmente ao lidar com diferentes formatos de URL.

Entendendo os Componentes de uma URL

Uma URL (Localizador Uniforme de Recursos) é um endereço que aponta para um recurso na internet. Ela possui partes, incluindo o protocolo, nome de domínio e, às vezes, um número de porta. Essas partes trabalham juntas para localizar recursos na web.

O protocolo define como os dados são transferidos entre o cliente e o servidor. Protocolos comuns são HTTP (Protocolo de Transferência de Hipertexto) e HTTPS (HTTP Seguro). O nome de domínio é o endereço de um site, como "exemplo.com". O número da porta, quando incluído, indica qual porta no servidor deve ser usada para comunicação.

Extrair essas partes de uma URL é útil para:

  1. Segurança: Verificar o protocolo para determinar se uma conexão é segura (HTTPS) ou não (HTTP).

  2. Roteamento: Usar o nome de domínio para direcionar solicitações ao servidor correto.

  3. Solução de problemas: Utilizar o número da porta para identificar problemas de conexão.

  4. Processamento de dados: Dividir partes da URL para manipular endereços web mais facilmente.

  5. Integrações de API: Usar partes específicas da URL para autenticação e obtenção de dados de serviços web.

Extraindo o Protocolo da URL

O protocolo é parte de uma URL, indicando como os dados são transferidos entre o cliente e o servidor. JavaScript oferece maneiras de obter essa informação de uma URL.

Usando JavaScript para Obter o Protocolo

Para extrair o protocolo de uma URL em JavaScript, você pode usar o objeto URL:

function getProtocol(url) {
  const urlObject = new URL(url);
  return urlObject.protocol;
}

Esta função cria um objeto URL a partir da string de URL fornecida e retorna o protocolo. O protocolo inclui os dois pontos no final, como "http:" ou "https:".

Para uma abordagem básica, você pode usar manipulação de strings:

function getProtocolSimple(url) {
  return url.split(':')[0];
}

Este método divide a URL no primeiro dois pontos e pega a primeira parte, que é o protocolo.

Ao lidar com diferentes tipos de protocolo, lembre-se:

  • HTTP e HTTPS são comuns para URLs web.
  • Outros protocolos incluem FTP, mailto e file.
  • Algumas URLs podem não ter um protocolo (URLs relativas ao protocolo).

Para lidar com vários casos:

function getProtocolSafe(url) {
  if (url.startsWith('//')) {
    return 'https'; // Assume HTTPS para URLs relativas ao protocolo
  }
  const match = url.match(/^([a-z]+):/i);
  return match ? match[1].toLowerCase() : null;
}

Esta função verifica URLs relativas ao protocolo, usa uma expressão regular para encontrar o protocolo e o retorna em minúsculas. Se nenhum protocolo for encontrado, retorna null.

Extraindo o Nome de Domínio da URL

O nome de domínio é parte de uma URL, identificando o site. Extraí-lo é útil para muitas tarefas web. JavaScript oferece maneiras de obter o nome de domínio de uma URL.

Técnicas JavaScript para Extração de Domínio

Usando o objeto URL

O objeto URL em JavaScript ajuda a extrair o nome de domínio:

function getDomain(url) {
  const urlObject = new URL(url);
  return urlObject.hostname;
}

Esta função cria um objeto URL e retorna sua propriedade hostname. Por exemplo:

const url = 'https://www.exemplo.com:8080/caminho?query=valor';
console.log(getDomain(url)); // Saída: www.exemplo.com

Este método funciona com URLs que têm subdomínios ou endereços IP.

Expressão regular para extração de domínio

Para mais controle ou quando o objeto URL não estiver disponível, você pode usar uma expressão regular:

function getDomainRegex(url) {
  const match = url.match(/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n?]+)/im);
  return match ? match[1] : null;
}

Esta função baseada em regex:

  • Funciona com ou sem o protocolo
  • Lida com URLs com ou sem 'www'
  • Extrai o nome de domínio até a primeira barra, dois pontos ou ponto de interrogação

Exemplo de uso:

const url1 = 'https://subdominio.exemplo.com/caminho';
const url2 = 'http://www.site-teste.com.br:8080/caminho';

console.log(getDomainRegex(url1)); // Saída: subdominio.exemplo.com
console.log(getDomainRegex(url2)); // Saída: site-teste.com.br

Ambos os métodos extraem nomes de domínio de URLs em JavaScript. O método do objeto URL é simples e funciona para a maioria dos casos, enquanto a abordagem de regex oferece mais flexibilidade para estruturas de URL complexas.

Extraindo o Número da Porta da URL

O número da porta em uma URL especifica o ponto de comunicação no servidor. É uma parte importante das conexões de rede. Aqui estão métodos para obter informações da porta a partir de URLs.

Métodos para Obter Informações da Porta

Para extrair o número da porta de uma URL, você pode usar o objeto URL do JavaScript:

function getPort(url) {
  const urlObject = new URL(url);
  return urlObject.port || null;
}

Esta função retorna a porta se estiver presente na URL, ou null se não estiver.

Para URLs sem uma porta especificada, você pode obter a porta padrão com base no protocolo:

function getPortWithDefault(url) {
  const urlObject = new URL(url);
  if (urlObject.port) {
    return urlObject.port;
  }
  switch (urlObject.protocol) {
    case 'http:':
      return '80';
    case 'https:':
      return '443';
    case 'ftp:':
      return '21';
    default:
      return null;
  }
}

Esta função retorna a porta se presente, ou a porta padrão para protocolos comuns.

Números de porta padrão para protocolos comuns:

  • HTTP: 80
  • HTTPS: 443
  • FTP: 21
  • SFTP: 22
  • SMTP: 25
  • POP3: 110

Para URLs com portas especificadas, a extração da porta é simples:

const url1 = 'https://exemplo.com:8080/caminho';
console.log(getPort(url1)); // Saída: 8080

const url2 = 'http://localhost:3000';
console.log(getPort(url2)); // Saída: 3000

Ao lidar com URLs sem portas especificadas:

const url3 = 'https://exemplo.com/caminho';
console.log(getPortWithDefault(url3)); // Saída: 443

const url4 = 'http://exemplo.org';
console.log(getPortWithDefault(url4)); // Saída: 80

Esses métodos permitem extrair informações da porta de URLs, seja a porta explicitamente declarada ou implícita pelo protocolo.