URL / URI
(set-env! :dependencies '[[ring/ring-codec "1.0.0"]])
(require '[ring.util.codec]
'[clojure.walk :refer [keywordize-keys]])
(keys (ns-publics 'ring.util.codec))
(comment
(percent-encode
url-decode
fix-string-replace-bug
form-encode
form-decode-str
form-decode
assoc-conj
url-encode
FormEncodeable
form-encode*
base64-decode
percent-decode
base64-encode))
(ring.util.codec/form-decode "a=1&b=2")
;; => {"a" "1", "b" "2"}
(-> "a=1&b=2" ring.util.codec/form-decode keywordize-keys)
;; => {:a "1", :b "2"}
(ring.util.codec/form-encode {:a "1", :b "2"})
;; => "a=1&b=2"
(ring.util.codec/form-encode {"a" "1", "b" "2"})
;; => "a=1&b=2"
(ring.util.codec/url-encode "-:-,- -あ-")
;; => "-%3A-%2C-%20-%E3%81%82-"
(ring.util.codec/percent-encode "-:-,- -あ-")
;; => "%2D%3A%2D%2C%2D%20%2D%E3%81%82%2D"
(ring.util.codec/url-decode "-%3A-%2C-%20-%E3%81%82-")
;; => "-:-,- -あ-"
(require '[clojure.java.io :as io])
(import (java.net URL))
(defn relative-url
[base-url hint]
(URL. (io/as-url base-url) hint))
(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/" ".."))
;; => "http://docs.oracle.com/javase/8/docs/api/java/"
(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/" "URL.html"))
;; => "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html"
(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html" "#URL-java.net.URL-java.lang.String-"))
;; => "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html#URL-java.net.URL-java.lang.String-"
(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html#URL-java.net.URL-java.lang.String-" ".."))
;; => "http://docs.oracle.com/javase/8/docs/api/java/"
(str (relative-url "http://docs.oracle.com/javase/8/docs/api/java/net/URL.html" "?a=b"))
;; => "http://docs.oracle.com/javase/8/docs/api/java/net/?a=b"
(require '[clojure.string :as str])
(import '[java.net URL URLDecoder]))
(defn path [uri]
(-> uri URL. .getPath))
(defn host [uri]
(-> uri URL. .getHost))
(defn query [uri]
(-> uri URL. .getQuery))
(defn query->map [query]
(->> (str/split query #"&")
(map #(-> (str/split % #"=")
((fn [[k v]] [(keyword (URLDecoder/decode k))
(URLDecoder/decode (or v ""))]))))
(into {})))
;; (uri-query->map "q=foo+bar&x=14&y=hello")
(defn query-map [uri]
(-> uri query query->map))
(set-env! :dependencies '[[com.cemerick/url "0.1.1"]])
(require '[cemerick.url])
(keys (ns-publics 'cemerick.url))
;; => (url-decode map->query split-param ->URL url-encode query->map map->URL url)
(cemerick.url/url "http://example.com")
(comment
{:protocol "http"
:username nil
:password nil
:host "example.com"
:port -1
:path ""
:query nil
:anchor nil})
(-> (cemerick.url/url "http://example.com")
(assoc :path "/foo")
str)
;; => "http://example.com/foo"
(str (cemerick.url/url "http://example.com" "/foo"))
;; => "http://example.com/foo"
(str (cemerick.url/url "http://example.com" "/foo"))
(cemerick.url/url-encode "あいうえお")
;; => "%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A"
(cemerick.url/url-decode "%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A")
;; => "あいうえお"
(cemerick.url/query->map "a=1&b=2")
;; => {"a" "1", "b" "2"}
(cemerick.url/map->query {"a" "1", "b" "2"})
;; => "a=1&b=2"
(cemerick.url/split-param "a=1")
;; => ("a" "1")
(-> (cemerick.url/url "https://example.com/foo?abc=123")
(dissoc :query)
cemerick.url/map->URL
str)
;; => "https://example.com/foo"