What is Swift URL?
URL
A value that identifies the location of a resource, such as an item on a remote server or the path to a local file.
URL
リモートサーバー上のアイテムやローカルファイルへのパスなど、リソースの場所を特定する値。
エンドポイントを指定:
URL(string: "https://hono-shop-app.gitonly543.workers.dev/api/shop")
example:
guard let url = URL(string: "https://hono-shop-app.gitonly543.workers.dev/api/shop") else {
errorMessage = "Invalid URL"
isLoading = false
return
}
実装した機能はこんな感じですね。HTTP GETしてくれるだけですが。
import SwiftUI
import Observation
@Observable
class ProductManager {
var products: [Product] = []
var isLoading = false
var errorMessage: String?
func fetchProducts() {
isLoading = true
errorMessage = nil
guard let url = URL(string: "https://hono-shop-app.gitonly543.workers.dev/api/shop") else {
errorMessage = "Invalid URL"
isLoading = false
return
}
URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
DispatchQueue.main.async {
self?.isLoading = false
if let error = error {
self?.errorMessage = error.localizedDescription
return
}
guard let data = data else {
self?.errorMessage = "No data received"
return
}
do {
let decodedProducts = try JSONDecoder().decode([Product].self, from: data)
self?.products = decodedProducts
} catch {
self?.errorMessage = "Failed to decode data: \(error.localizedDescription)"
}
}
}.resume()
}
}
URLを指定して外部APIのデータをGETするなら、JavaScriptの方がわかりやすいかもしれない。
ログを出すだけ:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
<h1>HTTP</h1>
</body>
<script>
// HTTP GET fetch()
fetch('https://jsonplaceholder.typicode.com/posts')
.then(response => response.json())
.then(data => console.log(data));
</script>
</html>
実際に表示してみる。これでもコードは多くないな💦
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ajax</title>
</head>
<body>
<ul id="data-list"></ul>
</body>
<script>
// HTTP GET fetch()
fetch('https://jsonplaceholder.typicode.com/posts')
.then(response => response.json())
.then(data => {
const dataList = document.getElementById('data-list');
data.forEach(item => {
const listItem = document.createElement('li');
listItem.textContent = item.title;
dataList.appendChild(listItem);
});
});
</script>
</html>
内部実装を見てみた
/**
A URL is a type that can potentially contain the location of a resource on a remote server, the path of a local file on disk, or even an arbitrary piece of encoded data.
You can construct URLs and access their parts. For URLs that represent local files, you can also manipulate properties of those files directly, such as changing the file's last modification date. Finally, you can pass URLs to other APIs to retrieve the contents of those URLs. For example, you can use the URLSession classes to access the contents of remote resources, as described in URL Session Programming Guide.
URLs are the preferred way to refer to local files. Most objects that read data from or write data to a file have methods that accept a URL instead of a pathname as the file reference. For example, you can get the contents of a local file URL as
String
by callingfunc init(contentsOf:encoding) throws
, or as aData
by callingfunc init(contentsOf:options) throws
.
*/
/**
URLは、リモート・サーバー上のリソースの場所、ディスク上のローカル・ファイルのパス、あるいはエンコードされた任意のデータを含む可能性のある型です。
URLを構築し、その部分にアクセスすることができます。ローカルファイルを表すURLでは、ファイルの最終更新日時を変更するなど、ファイルのプロパティを直接操作することもできます。最後に、URLを他のAPIに渡して、URLの内容を取得することができます。例えば、URLセッション・プログラミング・ガイドで説明されているように、URLSessionクラスを使用してリモート・リソースのコンテンツにアクセスすることができます。
URLはローカル・ファイルを参照するのに適した方法です。ファイルからデータを読み取ったり、ファイルにデータを書き込んだりするオブジェクトのほとんどは、ファイル参照としてパス名の代わりにURLを受け付けるメソッドを持っています。例えば、
func init(contentsOf:encoding) throws
を呼び出すことで、ローカルファイルのURLの内容をString
として取得したり、func init(contentsOf:options) throws
を呼び出すことでData
として取得したりすることができます。
*/
次は、URLSessionを読んでみようと思う。
Discussion