Link Generator for Amazonを作成する際に、URLを操作して、必要な情報だけを取得し集ったためNSURLComponetsを使用してURLを操作してみました。
目次
やること
任意の文字列からURLを取得
URLがAmazonのホストかどうかの判定
Amazonのpathを抽出
これらの事を自分で実装しようとすると、いろんなバグが含まれてしまうので、ここはSwiftにまかせたいところです。
URLを解剖してみる
まずは、URLを操作する前に、URLについてのおさらいをしておく。アマゾンのURLを適当に持ってきた。
https://www.amazon.co.jp/gp/product/B07JFXLRYX?pf_rd_r=FRME0MXSPM3STW7PE1Q0&pf_rd_p=7392bae8-7129-4d1a-96a9-1cfe0aa13ab3&pd_rd_r=3326fac4-d5a2-476e-a63b-7a215866ab2b&pd_rd_w=EMGCu&pd_rd_wg=VD4lf&ref_=pd_gw_unk#productTitle:~:text=%E4%BA%80%E7%94%B0%E8%A3%BD%E8%8F%93%20%E4%BA%80%E7%94%B0%E3%81%AE%E3%81%8A%E3%81%9B%E3%82%93%E3%81%B9%E3%81%84%204%E7%A8%AE%E3%82%A2%E3%82%BD%E3%83%BC%E3%83%88%20%E3%82%AD%E3%83%83%E3%82%BA%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9,-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%89%3A
今回は、上のURLについて解剖してみる。
スキーム
https:
オーソリティー
ホスト
パス
/gp/product/B07JFXLRYX
クエリ
パスの後にある付加情報が含まれている。?pf_rd_r=FRME0MXSPM3STW7PE1Q0&pf_rd_p=7392bae8-7129-4d1a-96a9-1cfe0aa13ab3&pd_rd_r=3326fac4-d5a2-476e-a63b-7a215866ab2b&pd_rd_w=EMGCu&pd_rd_wg=VD4lf&ref_=pd_gw_unk
フラグメント
ページの特定の場所を指定する時に使用する。
Choromeでもこのフラグメントを使用できるLink to Text Fragmentという拡張機能がある。おすすめの拡張機能です。#productTitle:~:text=%E4%BA%80%E7%94%B0%E8%A3%BD%E8%8F%93%20%E4%BA%80%E7%94%B0%E3%81%AE%E3%81%8A%E3%81%9B%E3%82%93%E3%81%B9%E3%81%84%204%E7%A8%AE%E3%82%A2%E3%82%BD%E3%83%BC%E3%83%88%20%E3%82%AD%E3%83%83%E3%82%BA%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9,-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%89%3A
フラグメントは以下のようなハイライトになるものだったり、特定のページの場所を指定したりするパラメーター
NSURLComponentsは何ができるか
{get,set}可能なパラメーター
- host
- path
- query
- string
- url
- password
- port
- scheme
- user
%エンコード形式でのアクセスも可能
解析だけじゃなく作成することも可能
let component2 = NSURLComponents()
component2.scheme = "https"
component2.host = "www.example.com"
component2.path = "/index.html"
component2.query = "key1=value1&key2=value2"
print(component2.string!)
//https://www.example.com/index.html?key1=value1&key2=value2
ホストとパス,クエリを出力する
func testingURLComponents(_ components: NSURLComponents) {
guard let host = components.host else { return }
guard let path = components.path else { return }
guard let query = components.query else { return }
print("""
host: \\(host)
path: \\(path)
query: \\(query)
""")
}
let url = "https://www.amazon.co.jp/ref=as_li_ss_tl?ref=icp_country_us&linkCode=ll2"
let component = NSURLComponents(string: url)
testingURLComponents(component!)
//host: www.amazon.co.jp
//path: /ref=as_li_ss_tl
//query: ref=icp_country_us&linkCode=ll2&tag=kacchan07-22&linkId=e2572db7834a68f2e61fd54ea1ba1892&language=ja_JP
最後に
NSURLComponentsを使用すると、簡単にURLを操作することができました。コードにバグを残さないためにもこのようなライブラリを使用することが大事だということがわかった。
参考文献
https://developer.apple.com/documentation/foundation/nsurlcomponents#topics:~:text=Accessing Components in Native Format