🪶

What is Swift URL?

2024/08/04に公開

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
リモートサーバー上のアイテムやローカルファイルへのパスなど、リソースの場所を特定する値。

https://developer.apple.com/documentation/foundation/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 calling func init(contentsOf:encoding) throws, or as a Data by calling func 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