URL shortener: Difference between revisions
(Created page with "{{draft task}}Category:Networking and Web Interaction Create a simple URL shortener to demonstrate your programming language's web API capabilities with the following end...") |
No edit summary |
||
Line 24: | Line 24: | ||
* Store the short -> long mappings in any way you like. In-memory is fine. |
* Store the short -> long mappings in any way you like. In-memory is fine. |
||
* There are no auth requirements. Your API can be completely open. |
* There are no auth requirements. Your API can be completely open. |
||
=={{header|Crystal}}== |
|||
<lang ruby>require "kemal" |
|||
CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".chars |
|||
entries = Hash(String, String).new |
|||
post "/" do |env| |
|||
short = Random::Secure.random_bytes(8).map{|b| CHARS[b % CHARS.size]}.join |
|||
entries[short] = env.params.json["long"].as(String) |
|||
"http://localhost:3000/#{short}" |
|||
end |
|||
get "/:short" do |env| |
|||
if long = entries[env.params.url["short"]]? |
|||
env.redirect long |
|||
else |
|||
env.response.status_code = 404 |
|||
end |
|||
end |
|||
error 404 do |
|||
"invalid short url" |
|||
end |
|||
Kemal.run</lang> |
Revision as of 15:57, 4 January 2020
Create a simple URL shortener to demonstrate your programming language's web API capabilities with the following endpoints:
POST /
A POST endpoint that accepts a JSON body describing the URL to shorten. Your URL shortener should generate a short version of the URL (like https://bitly.com/), keep track of the mapping between short and long URLs, and return the short version to the user. For example:
$ curl --location --request POST 'localhost:3000' \ -H 'Content-Type: application/json' \ -d '{ "long": "https://google.com" }' http://localhost:3000/9eXmFnuj
GET /:short
A GET endpoint that accepts a short version of the URL in the URL path and redirects the user to the original URL. For example:
$ curl -L http://localhost:3000/9eXmFnuj <!doctype html><html...
Rules:
- Store the short -> long mappings in any way you like. In-memory is fine.
- There are no auth requirements. Your API can be completely open.
Crystal
<lang ruby>require "kemal"
CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".chars entries = Hash(String, String).new
post "/" do |env|
short = Random::Secure.random_bytes(8).map{|b| CHARS[b % CHARS.size]}.join entries[short] = env.params.json["long"].as(String) "http://localhost:3000/#{short}"
end
get "/:short" do |env|
if long = entries[env.params.url["short"]]? env.redirect long else env.response.status_code = 404 end
end
error 404 do
"invalid short url"
end
Kemal.run</lang>