我也测试了这个链接。给我不好的要求(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响应中出错。
答案 0 :(得分:1)
主要问题是您的JSON使用了longitude
的错误密钥。你正在使用longtide
,这显然不是你想要的。如果您使用longitude
,则可以正常使用。
一些不相关的观察结果:
您正在执行do
- catch
,但没有try
。您正在使用不会引发任何错误的try?
,而只是在出现问题时返回nil
。因此没什么可抓的。如果您想捕获错误,请使用try
,而不是try?
。
您有一个好奇的模型对象,其中您拥有私有属性,但随后计算了get
和set
私有属性的属性。如果你没有在你的自定义getter和setter中做任何有价值的东西,你应该完全失去那些计算属性,因为这只是复杂和低效。此外,下划线约定用于隐藏的私有属性,而不是用于您公开的属性。
还可以推断,您的GoogleMap
方法正在返回[String: Any]
生成的toJSON
。在Swift 4中,您可以使用JSONEncoder
并制作模型对象Encodable
(或Codable
),并且可以避免使用toJSON
方法。只需更改GoogleMap
即可返回简单模型对象,然后可以使用JSONEncoder
进行编码。
所以,这让我们:
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] }
}