SwiftUIでボタンを押すとWebサーバーから文字列を取得する方法。
ObservableObjectを継承したクラスを作成する。
class TNetHTTPClient:ObservableObject { @Published var responseString: String init() { self.responseString = "" } func get(aurl: String) -> Void { guard let url1 = URL(string: aurl) else { return } URLSession.shared.dataTask(with: url1) { (data, res, _) in guard let data = data else { return } DispatchQueue.main.async { print(res ?? "") if let res = res as? HTTPURLResponse { if res.statusCode == 200 { self.responseString = " \( String(data: data, encoding: .utf8) ?? "" ) " } else { self.responseString = "status code = \(res.statusCode)" } } } }.resume() } }
Viewの構造体を作成しWebサーバーに接続するためのButtonと、HTTPレスポンスした文字列表示するためのTextFieldを配置します。
struct GetHttp: View { let http_url: String = "https://mjeld.com/moji.txt" @ObservedObject var netHTTPClient1 = TNetHTTPClient() var body: some View { VStack{ Text("Get a string from the server.") TextField(self.http_url, text: self.$netHTTPClient1.responseString) .padding(.horizontal) HStack{ Button("Button1", action: { self.netHTTPClient1.get(aurl: self.http_url) }) Button("Button2", action: { self.netHTTPClient1.responseString = "" }) } Spacer() } } }
@ObservedObjectで先に作っていたクラスTNetHTTPClientを宣言します。TextFieldのtextは$netHTTPClient1.responseStringを設定しresponseStringが変更した場合TextFieldに反映されます。Button1をタップするとnetHTTPClient1.get(aurl: self.http_url)が実行されます。
実行し、Buttonを押すと上のようにWebサーバーの文字列を取得します。Webサーバー側にはUTF8のプレーンテキストファイルを置いています。
https://developer.apple.com/documentation/foundation/urlsession/1411554-datatask