)
estão empilhados verticalmente, aplicaremos display: flex
e flex-direction: column
estilos para o formulário.
1
form {
2
display : flex ;
3
flex-direction : column ;
4
}
A seguir adicionaremos alguns margin
, padding
e border-radius
aos elementos do formulário para uma aparência mais refinada.
1
input , button {
2
padding : 10px ;
3
margin : 10px 0 ;
4
border : none ;
5
border-radius : 5px ;
6
box-shadow : 0 0 5px rgba ( 0 , 0 , 0 , 0.1 );
7
}
Em seguida, esses estilos para nosso botão de envio.
1
button {
2
cursor : pointer ;
3
background-color : #007bff ;
4
color : #fff ;
5
}
6
button :hover {
7
background-color : #0069d9 ;
8
}
9
button :disabled {
10
background-color : #cccccc ;
11
cursor : not-allowed ;
12
}
Estamos chegando lá! Agora defina o resultado , erro e cópia elementos a serem ocultados por padrão.
1
#result , #error , #copy {
2
display : none ;
3
}
Aplique uma cor vermelha no erro elemento.
1
#error {
2
color : #dc3545 ;
3
margin-top : 10px ;
4
}
Quando um URL é encurtado, precisamos fornecer uma opção para copiar o link encurtado. Portanto, estilize o ícone de cópia para aparecer ao lado do resultado e posicione a mensagem “copiada” abaixo do URL abreviado.
1
#icon {
2
cursor : pointer ;
3
margin-left : 10px ;
4
vertical-align : middle ;
5
color : #0069d9 ;
6
}
7
#copy {
8
position : absolute ;
9
left : 60% ;
10
}
Feito isso, nosso styling está finalizado!
Testando a API
Usaremos a API TinyURL para gerar URLs encurtados, então acesse TinyURL e obtenha um token de API gratuito.
A API fornece vários endpoints conforme mostrado abaixo.
No nosso caso, usaremos o /create
ponto final. Para fazer uma solicitação POST simples, envie uma solicitação à API com seu token nos cabeçalhos e inclua a URL e o domínio (tinyurl.com) no corpo da solicitação.
Obtenha elementos DOM
Vamos agora obter todos os elementos DOM necessários para manipulação
1
const form = document . getElementById ( " form " );
2
const urlInput = document . getElementById ( " url " );
3
const submitBtn = document . getElementById ( " submit-btn " );
4
const result = document . getElementById ( " result " );
5
const shortenedUrlLink = document . getElementById ( " shortened-url " );
6
const errorMessage = document . getElementById ( " error " );
7
const copyIcon = document . getElementById ( " icon " );
8
const copyUrl = document . getElementById ( " copy " );
Em seguida, crie uma função assíncrona chamada shortenUrl
que terá o URL como parâmetro.
1
async function shortenUrl ( url ) {
2
3
}
Dentro desta função, defina o TinyUrl API e o segredo ficha .
1
async function shortenUrl ( url ) {
2
const apiUrl = " https://api.tinyurl.com/create " ;
3
const token = " your_tinuyurl_token " ;
4
5
}
A seguir, faça um POST
solicitar e especificar os dados necessários.
1
async function shortenUrl ( url ) {
2
const apiUrl = " https://api.tinyurl.com/create " ;
3
const token = " your_tinuyurl_token " ;
4
const response = await fetch ( apiUrl , {
5
method : " POST " ,
6
headers : {
7
" Content-Type " : " application/json " ,
8
Authorization : `Bearer ${ token } `
9
},
10
body : JSON . stringify ({
11
domain : " tinyurl.com " ,
12
url : url
13
})
14
});
15
16
if ( ! response . ok ) {
17
throw new Error ( " An error occurred. Please try again. " );
18
}
19
const result = await response . json ();
20
21
}
No shortenUrl
função, usamos fetch para enviar uma solicitação ao apiUrl
endpoint e aguarde a resposta. Como vimos anteriormente, a API TinyURL espera um token no cabeçalho, e o corpo deve conter o domínio e a URL a ser encurtada.
Se ocorrer um erro, a mensagem Ocorreu um erro. Por favor, tente novamente será exibido.
Um exemplo de resposta é assim:
1
{
2
"data": {
3
"domain": "tinyurl.com",
4
"alias": "example-alias",
5
"deleted": false,
6
"archived": false,
7
"etiquetas": [
8
"tag1",
9
"tag2"
10
],
11
"análise": [
12
{
13
"enabled": true,
14
"public": false
15
}
16
],
17
"tiny_url": "https://tinyurl.com/example-alias",
18
"created_at": "2022-11-24T19:41:23+00:00",
19
"expires_at": null,
20
"url": "https://google.com"
21
},
22
"code": 0,
23
"errors": []
24
}
Desta resposta, precisamos extrair o tiny_url
valor, então atualize a função da seguinte forma:
1
async function shortenUrl ( url ) {
2
const apiUrl = " https://api.tinyurl.com/create " ;
3
const token = " your_token " ;
4
const response = await fetch ( apiUrl , {
5
method : " POST " ,
6
headers : {
7
" Content-Type " : " application/json " ,
8
Authorization : `Bearer ${ token } `
9
},
10
body : JSON . stringify ({
11
domain : " tinyurl.com " ,
12
url : url
13
})
14
});
15
16
if ( ! response . ok ) {
17
throw new Error ( " An error occurred. Please try again. " );
18
}
19
const result = await response . json ();
20
return result . data . tiny_url ;
21
}
Tudo bem. Temos uma função que gera uma URL abreviada, então agora precisamos adicionar um ouvinte de evento ao formulário para capturar a URL do usuário. Adicione um onSubmit
evento para o formulário.
1
form . addEventListener ( " submit " , async ( e ) => {
2
3
}
Dentro do ouvinte de evento, queremos obter a URL do usuário, invocar o shortenUrl
funcionar com o valor do usuário fornecido e, em seguida, exibir o URL abreviado para o usuário.
Atualize o ouvinte de eventos da seguinte maneira:
1
form . addEventListener ( " submit " , async ( e ) => {
2
e . preventDefault ();
3
const url = urlInput . value ;
4
submitBtn . disabled = true ;
5
submitBtn . textContent = " Shortening... " ;
6
errorMessage . style . display = " none " ;
7
result . style . display = " none " ;
8
copyUrl . style . display = " none " ;
9
10
const shortUrl = await shortenUrl ( url );
11
shortenedUrlLink . href = shortUrl ;
12
shortenedUrlLink . textContent = shortUrl ;
13
14
result . style . display = " block " ;
15
16
});
As coisas estão ficando um pouco complexas, então vamos detalhar o código acima:
const url = urlInput.value;
obtém o URL inserido pelo usuário no campo de entrada.
submitBtn.disabled = true;
desativa o botão de envio durante o processo de geração de URL para evitar que o usuário inicie uma nova solicitação.
submitBtn.textContent = "Shortening...";
exibe a mensagem Encurtamento… para informar ao usuário que o processo está em andamento.
const shortUrl = await shortenUrl(url);
invoca a função ShortUrl e retorna o URL abreviado.
shortenedUrlLink.href = shortUrl;
adiciona um atributo href ao elemento shortedUrlLink.
shortenedUrlLink.textContent = shortUrl;
define o URL abreviado como o texto do elemento shortedUrlLink.
result.style.display = "block";
torna o elemento shortedUrlLink visível.
Tratamento de erros
Vamos atualizar nosso código para lidar com erros. Primeiro, precisamos verificar se um usuário inseriu uma URL válida no campo de entrada. Caso contrário, exibiremos uma mensagem permitindo que eles forneçam um URL válido.
Atualize o ouvinte de eventos da seguinte maneira.
1
form . addEventListener ( " submit " , async ( e ) => {
2
e . preventDefault ();
3
const url = urlInput . value ;
4
5
if ( ! url ) {
6
displayMessage ( " Please enter a URL " );
7
return ;
8
}
9
10
// the rest of the code
11
});
Em seguida, envolva a lógica em um try-block
para lidar com quaisquer erros que possam ocorrer durante o processo de geração.
1
try {
2
submitBtn . disabled = true ;
3
submitBtn . disabled = true ;
4
submitBtn . textContent = " Shortening... " ;
5
errorMessage . style . display = " none " ;
6
result . style . display = " none " ;
7
copyUrl . style . display = " none " ;
8
9
const shortUrl = await shortenUrl ( url );
10
shortenedUrlLink . href = shortUrl ;
11
shortenedUrlLink . textContent = shortUrl ;
12
13
result . style . display = " block " ;
14
} catch ( error ) {
15
displayMessage ( " An error occurred while shortening the URL. Please try again. " );
16
} finally {
17
submitBtn . disabled = false ;
18
submitBtn . textContent = " Shorten URL " ;
19
}
Caso ocorra algum erro, exibiremos uma mensagem ao usuário. No finally
bloco, faremos a limpeza redefinindo o botão enviar.
O displayMessage
função fica assim:
1
function displayMessage ( message ) {
2
errorMessage . textContent = message ;
3
errorMessage . style . display = " block " ;
4
}
Agora, quando um URL é encurtado, a saída deve ser semelhante a esta:
Copiar URL para a área de transferência
A última etapa é habilitar a funcionalidade de copiar para a área de transferência. Vamos adicionar um evento para escutar um evento de clique no botão enviar.
1
copyIcon . addEventListener ( " click " , async () => {
2
try {
3
await navigator . clipboard . writeText ( shortenedUrlLink . textContent );
4
copyUrl . style . display = " block " ;
5
setTimeout (() => {
6
copyUrl . style . display = " none " ;
7
}, 2000 );
8
} catch ( err ) {
9
displayMessage ( " Failed to copy to clipboard. Please try again. " );
10
}
11
});
A API da área de transferência (navigator.clipboard.writeText
) é uma função assíncrona que retorna uma promessa que é resolvida quando o texto é copiado com sucesso.
Se ocorrer algum erro durante a cópia, uma mensagem de erro será exibida.
E terminamos!
Ótimo trabalho. Aqui está a demonstração que você acabou de criar:
Chegamos ao final deste tutorial e agora você tem um encurtador de URL totalmente funcional. Uma das maneiras de melhorar essa ferramenta é transformá-la em uma extensão do Chrome. Isso garantirá que o encurtamento de um URL seja instantâneo e conveniente – por que não tentar?!