【问题标题】:Get data from URL with parameters Swift使用参数 Swift 从 URL 获取数据
【发布时间】:2019-04-06 10:17:52
【问题描述】:

我需要从 url 获取数据。 例如,使用邮递员,如果我尝试使用我的私人url = "http://127.0.0.1/MyWebService/api/fetch_image.php" 获取请求并添加参数: id_key -> id_team 价值 -> 2 软件将此返回给我:

{"image_team":[{"id":1,"img_path":"http://localhost/MyWebService/images/Schermata.png","id_team":2},{"id":2, "img_path":"http://localhost/MyWebService/images/Schermata.png","id_team":2},{"id":3,"img_path":"http://localhost/MyWebService/images/Schermata .png","id_team":2}]}

现在我在 Swift 中编写了这些类:

class ClassJsonTeam: Codable {

private var teams: [JsonTeam]

init(teams: [JsonTeam]) {
    self.teams = teams
}

func getTeams()-> [JsonTeam]{
    return(self.teams);
}

func setTeams(teams:[JsonTeam]){
    self.teams = teams;
}

}

class JsonTeam: Codable {
private let id: Int
private var name: String
private var member: Int

init(id: Int, name: String, member: Int) {
    self.id = id
    self.name = name
    self.member = member
}

func getId()->Int{
    return(self.id);
}

func setId(id:Int){
    self.member = id;
}

func getName()->String{
    return(self.name);
}

func setName(name:String){
    self.name = name;
}

func getMembers()->Int{
    return(self.member);
}

func setMembers(members:Int){
    self.member = members;
}    
}

问题是:如何在课堂上提出请求并保存日期?

(我使用的是 Swift 4)

【问题讨论】:

    标签: json swift parsing


    【解决方案1】:

    抱歉,这是可怕的 objective-c-ish 代码。

    你显然希望你的类中有常量,所以声明常量,而且在几乎所有情况下你根本不需要类

    struct Response: Decodable {
        let teams: [Team]
    
        private enum CodingKeys : String, CodingKey { case teams = "image_team" }
    }
    
    struct Team: Decodable {
        let id: Int
        let imagePath: URL
        let teamID: Int
    
        private enum CodingKeys : String, CodingKey { case id, imagePath = "img_path", teamID = "id_team" }
    }
    

    就是这样。没有其他的。没有奇怪的公共吸气剂和私人二传手。处理 (De)codable 时没有初始化程序。如果你使用 swiftier 键,你可以完全省略 CodingKeys 声明。密钥imagePath 甚至可以解码为URL

    最后:没有尾随分号!

    要读取数据,请使用传统的URLSession

    let url = URL(string: "http://127.0.0.1/MyWebService/api/fetch_image.php")!
    let dataTask = URLSession.shared.dataTask(with: url) { data, response, error in
        if let error = error { 
           print(error) 
           return 
        }
        do {
            let result = try JSONDecoder().decode(Response.self, from: data!)
            print(result)
        } catch {
            print(error)
        }
    }
    dataTask.resume()
    

    例如,要添加参数,您必须在 URL 中附加 query

    http://127.0.0.1/MyWebService/api/fetch_image.php?id_team=2
    

    但这取决于您的后端。

    【讨论】:

    • 此外,我建议您解开 url 而不要使用 bang 运算符。另外,还可以去掉let dataTask,在大括号末尾使用.resume()。
    • @FloWy 如果 URL 是一个字面常量并且您知道它是有效的,那么强制展开它并没有错。省略let dataTask 是个人喜好问题?
    • 我完全同意,但在我看来这是不好的做法。如果您是团队中唯一的人,那没关系,但如果您有一个包含多个团队的大型项目,最好打开 URL。
    • @FloWy 我强烈怀疑在团队中从事大型项目的人会在这里问这样的问题?
    • 一切皆有可能:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多