如何在swift 3中将单个对象作为参数发布在http请求中

时间:2018-04-11 14:43:33

标签: ios swift post swift3

我也测试了这个链接。给我不好的要求(400)

使用本机库而不是almafire

这是链接我的脸颊 send object as parameter

请投票给我

这是我的完整代码

guard let url=URL(string: "http://test.com/google/getAddress") else{return}

let parameters=GoogleMap()

var requst=URLRequest(url: url)
requst.httpMethod="POST"
requst.addValue("application/json", forHTTPHeaderField: "Content-Type")
requst.httpMethod="POST"
guard let httpbody=try? JSONSerialization.data(withJSONObject: parameters, options: []) else{return}

requst.httpBody=httpbody

print(url)

let _=URLSession.shared.dataTask(with: requst) { (data, response, error) in
    if let data=data{

        do{
            let json=try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)

            print(json)
        }
        catch{

            print(error)
        }
    }
    }.resume()
    }

我的模特课

class Model {

    private var latitude:Double?
    private var longitude:Double?

    var _latitude:Double{
        get{
            return latitude!
        }
        set{
            latitude=newValue
        }
    }

    var _longitude:Double{

        get{
            return longitude!
        }
        set{
            longitude=newValue
        }
    }

    func toJSON() -> [String: Any] {
        return [ "latitude": latitude as Any, "longtide": longitude as Any]
    }

}

我已经测试过字典但是服务器给了我"错误的请求" JSON响应中出错。

1 个答案:

答案 0 :(得分:1)

主要问题是您的JSON使用了longitude的错误密钥。你正在使用longtide,这显然不是你想要的。如果您使用longitude,则可以正常使用。

一些不相关的观察结果:

  1. 您正在执行do - catch,但没有try。您正在使用不会引发任何错误的try?,而只是在出现问题时返回nil。因此没什么可抓的。如果您想捕获错误,请使用try,而不是try?

  2. 您有一个好奇的模型对象,其中您拥有私有属性,但随后计算了getset私有属性的属性。如果你没有在你的自定义getter和setter中做任何有价值的东西,你应该完全失去那些计算属性,因为这只是复杂和低效。此外,下划线约定用于隐藏的私有属性,而不是用于您公开的属性。

  3. 还可以推断,您的GoogleMap方法正在返回[String: Any]生成的toJSON。在Swift 4中,您可以使用JSONEncoder并制作模型对象Encodable(或Codable),并且可以避免使用toJSON方法。只需更改GoogleMap即可返回简单模型对象,然后可以使用JSONEncoder进行编码。

  4. 所以,这让我们:

    let url = URL(string: "http://test.com/google/getAddress")!
    
    var request = URLRequest(url: url)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    let coordinate = Coordinate(latitude: 34.05222, longitude: -118.242) // set this however you want
    request.httpBody = try! JSONEncoder().encode(coordinate)
    
    URLSession.shared.dataTask(with: request) { data, _, error in
        guard let data = data, error == nil else {
            print(error ?? "Unknown error")
            return
        }
    
        do {
            let responseObject = try JSONSerialization.jsonObject(with: data)
            print(responseObject)
        } catch let parseError {
            print(parseError)
        }
    }.resume()
    

    您的模型对象仅限于:

    struct Coordinate: Codable {
        var latitude: Double
        var longitude: Double
    }
    

    或者,如果您确实需要它作为参考类型,请class

    class Coordinate: Codable {
        var latitude: Double
        var longitude: Double
    
        init(latitude: Double, longitude: Double) {
            self.latitude = latitude
            self.longitude = longitude
        }
    }
    

    如果你被困在Swift 3中,那么继续制作一本字典,但我会把它[String: Double],例如。

    let url = URL(string: "http://ipinbar.net:8080/google/getAddress")!
    
    var request = URLRequest(url: url)
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    let coordinate = Coordinate(latitude: 34.05222, longitude: -118.242) // set this however you want
    request.httpBody = try! JSONSerialization.data(withJSONObject: coordinate.dictionary)
    
    URLSession.shared.dataTask(with: request) { data, _, error in
        guard let data = data, error == nil else {
            print(error ?? "Unknown error")
            return
        }
    
        do {
            let responseObject = try JSONSerialization.jsonObject(with: data)
    
            print(responseObject)
        } catch let parseError {
            print(parseError)
        }
    }.resume()
    

    struct Coordinate {
        var latitude: Double
        var longitude: Double
    
        var dictionary: [String: Double] { return ["latitude": latitude, "longitude": longitude] }
    }