KOSEN{BLOG}について

Swift NSURLComponentsを使ってURLを操作する

Link Generator for Amazonを作成する際に、URLを操作して、必要な情報だけを取得し集ったためNSURLComponetsを使用してURLを操作してみました。

やること

任意の文字列からURLを取得

URLがAmazonのホストかどうかの判定

Amazonのpathを抽出

これらの事を自分で実装しようとすると、いろんなバグが含まれてしまうので、ここはSwiftにまかせたいところです。

URLを解剖してみる

まずは、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:

オーソリティー

//www.amazon.co.jp

ホスト

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

フラグメント

ページの特定の場所を指定する時に使用する。
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を操作することができました。コードにバグを残さないためにもこのようなライブラリを使用することが大事だということがわかった。

参考文献

Swift で URL クエリパラメータ を抽出する

https://developer.apple.com/documentation/foundation/nsurlcomponents#topics:~:text=Accessing Components in Native Format

コメントを残す

メールアドレスが公開されることはありません。