SwiftUI: как сделать POST запрос к серверу, возвращающему json
import SwiftUI
struct infoS: Codable,Hashable{
let name:String
let image: String
let id:String
}//эта структура должна точно соответствовать возвращаемому json
struct reqS: Codable,Hashable{
let id:Int
let name: String
}// это передаваемый json методом post
class ApiView:ObservableObject{
@Published var infoSite:[infoS] = []
func fetch(){
let param:reqS = .init(id: 1, name: "jack")//запрос
guard let url = URL(string:"https://image.su/dataCC") else{return}
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
do {request.httpBody=try JSONEncoder().encode(param)
} catch let error {print(error.localizedDescription)}
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let task = URLSession.shared.dataTask(with: request) {(data,response,error) in guard let data = data, error == nil else {return}
// Covert to JSON
do{let infoSite = try JSONDecoder().decode([infoS].self,from: data)
DispatchQueue.main.async {self.infoSite=infoSite}
}catch{print(error)}
}
task.resume()
}
}
А вот так можно использовать данные этого view
struct ContentView: View {
@StateObject var apiView = ApiView()
var body: some View {
ForEach(apiView.infoSite,id:\.self){infoS in
if(infoS.id=="1") {
Text("\(infoS.name)")
}}
}
}
И просто запрос без передачи параметров (например, для получения фото)
private func fetchData(){guard let url = URL(string: urlString) else {return}
let task = URLSession.shared.dataTask(with: url) { data, _, _ in self.data = data}
task.resume()}}
