post 如何在 swift 3 中将单个对象作为 http 请求中的参数
how to post single object as parameter in http request in swift 3
我也测试过这个link。给我错误的请求 (400)
使用本地库而不是 almafire
这里是 link 我脸颊
请给我投票
这是我的完整代码
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
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 响应中给我 "bad request" 错误。
主要问题是您的 JSON 为 longitude
使用了错误的密钥。您正在使用 longtide
,这显然不是您想要的。如果你使用 longitude
,它工作正常。
一些不相关的观察:
您正在做 do
-catch
,但没有 try
。您使用的 try?
不会抛出任何错误,如果出现问题,则只会抛出 returns nil
。因此没有什么可抓的。如果要捕获错误,请使用 try
,而不是 try?
。
你有一个奇怪的模型对象,其中你有私有属性,但是计算属性 get
和 set
私有 属性。如果您在自定义 getter 和 setter 中没有做任何有价值的事情,您应该完全丢失那些计算属性,因为这很复杂且效率低下。另外,下划线约定用于隐藏的私有属性,而不是您公开的属性。
可以推断您的 GoogleMap
方法是 return 由 toJSON
生成的 [String: Any]
。在 Swift 4 中,您可以使用 JSONEncoder
并使模型对象成为 Encodable
(或 Codable
),并且可以避免使用 toJSON
方法。只需将 GoogleMap
更改为 return 即可使用 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] }
}
我也测试过这个link。给我错误的请求 (400)
使用本地库而不是 almafire
这里是 link 我脸颊
请给我投票
这是我的完整代码
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
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 响应中给我 "bad request" 错误。
主要问题是您的 JSON 为 longitude
使用了错误的密钥。您正在使用 longtide
,这显然不是您想要的。如果你使用 longitude
,它工作正常。
一些不相关的观察:
您正在做
do
-catch
,但没有try
。您使用的try?
不会抛出任何错误,如果出现问题,则只会抛出 returnsnil
。因此没有什么可抓的。如果要捕获错误,请使用try
,而不是try?
。你有一个奇怪的模型对象,其中你有私有属性,但是计算属性
get
和set
私有 属性。如果您在自定义 getter 和 setter 中没有做任何有价值的事情,您应该完全丢失那些计算属性,因为这很复杂且效率低下。另外,下划线约定用于隐藏的私有属性,而不是您公开的属性。可以推断您的
GoogleMap
方法是 return 由toJSON
生成的[String: Any]
。在 Swift 4 中,您可以使用JSONEncoder
并使模型对象成为Encodable
(或Codable
),并且可以避免使用toJSON
方法。只需将GoogleMap
更改为 return 即可使用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] }
}