Swift 午睡和 post
Swift Siesta Get and post
我是 Siesta 的新手。我怎样才能得到整个数组并传递到我的模型中?此外,我如何 post 与参数?在他们的文档中我找不到任何这些。
我也是午睡新手。我能够在此处找到有关请求的文档 http://bustoutsolutions.github.io/siesta/guide/requests/
基本上你会设置你的资源然后调用:
resource.request(.post, json: ["foo": [1,2,3]])
你的问题太复杂了,我会尽量用简单的方式给你解释。
- Siesta 提供了一种使用自定义转换器映射模型的好方法。一种简单的方法是实现 Swift 4+:
提供的 Decodable 协议
假设我们要解码此 JSON 响应:
{
"id": 1,
"name": "Oswaldo",
"email": "omaestra@gmail.com"
}
进入我们伟大的 User
class,它实现了 Decodable 协议:
class User: Decodable {
var id: Int
var name: String
var email: String
private enum CodingKeys: String, CodingKey {
case id, name, email
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Int.self, forKey: .id
name = try container.decode(String.self, forKey: .name)
email = try container.decode(String.self, forKey: .email)
}
}
太棒了!现在我们可以将来自服务器的 JSON 响应解码为我们很棒的 User
class.
接下来,在我们的 Siesta.Service
class 中,我们可以为特定资源配置自定义转换器:
class API: Siesta.Service {
init() {
super.init(baseURL: "https://api.example.com")
// Some initial configuration
}
let myAPI = API()
// –––––– Global configuration ––––––
let jsonDecoder = JSONDecoder()
// –––––– Mapping from specific paths to models ––––––
// These all use Swift 4’s JSONDecoder, but you can configure arbitrary transforms on arbitrary data types.
configureTransformer("rest/user/") {
// Input type inferred because the from: param takes Data.
// Output type inferred because jsonDecoder.decode() will return User
try jsonDecoder.decode(User.self, from: [=12=].content)
}
// MARK: - Resources
var userResource: Siesta.Resource { return resource("rest/user/") }
}
最后,我们可以在 ViewController
:
中实现我们的资源
class UserViewController: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var emailLabel: UILabel!!
override func viewDidLoad() {
super.viewDidLoad()
myAPI.userResource
.addObserver(self)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
myAPI.userResource.loadIfNeeded()
}
}
extension UserViewController: ResourceObserver {
func resourceChanged(_ resource: Resource, event: ResourceEvent) {
let user: User? = resource.typedContent()
nameLabel.text = user?.name
emailLabel.text = user?.email
}
}
注意:Siesta 是一个非常灵活和可定制的框架,您可以找到多种方式来配置您的服务和资源。这只是实现您要求的一种简单方法。
- 要使用参数发出 POST 请求,您可以在
Service
class: 中执行类似的操作
实施发出 POST 请求的 update
方法。
func update(user: User, newName: String) -> Siesta.Request {
return usersResource
.child(user.id)
.child("update")
.request(.post, json: ["name": newName])
}
然后,在您的 ViewController
中,您可以调用方法来提交 POST
请求并评估其响应:
myAPI.update(user: user, newName: "NEW NAME")
.onSuccess({ (_) in
print("Successfully updated user's name.")
})
.onFailure({ (error) in
print("Error trying to update user's name.")
})
我是 Siesta 的新手。我怎样才能得到整个数组并传递到我的模型中?此外,我如何 post 与参数?在他们的文档中我找不到任何这些。
我也是午睡新手。我能够在此处找到有关请求的文档 http://bustoutsolutions.github.io/siesta/guide/requests/
基本上你会设置你的资源然后调用:
resource.request(.post, json: ["foo": [1,2,3]])
你的问题太复杂了,我会尽量用简单的方式给你解释。
- Siesta 提供了一种使用自定义转换器映射模型的好方法。一种简单的方法是实现 Swift 4+: 提供的 Decodable 协议
假设我们要解码此 JSON 响应:
{
"id": 1,
"name": "Oswaldo",
"email": "omaestra@gmail.com"
}
进入我们伟大的 User
class,它实现了 Decodable 协议:
class User: Decodable {
var id: Int
var name: String
var email: String
private enum CodingKeys: String, CodingKey {
case id, name, email
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(Int.self, forKey: .id
name = try container.decode(String.self, forKey: .name)
email = try container.decode(String.self, forKey: .email)
}
}
太棒了!现在我们可以将来自服务器的 JSON 响应解码为我们很棒的 User
class.
接下来,在我们的 Siesta.Service
class 中,我们可以为特定资源配置自定义转换器:
class API: Siesta.Service {
init() {
super.init(baseURL: "https://api.example.com")
// Some initial configuration
}
let myAPI = API()
// –––––– Global configuration ––––––
let jsonDecoder = JSONDecoder()
// –––––– Mapping from specific paths to models ––––––
// These all use Swift 4’s JSONDecoder, but you can configure arbitrary transforms on arbitrary data types.
configureTransformer("rest/user/") {
// Input type inferred because the from: param takes Data.
// Output type inferred because jsonDecoder.decode() will return User
try jsonDecoder.decode(User.self, from: [=12=].content)
}
// MARK: - Resources
var userResource: Siesta.Resource { return resource("rest/user/") }
}
最后,我们可以在 ViewController
:
class UserViewController: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var emailLabel: UILabel!!
override func viewDidLoad() {
super.viewDidLoad()
myAPI.userResource
.addObserver(self)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
myAPI.userResource.loadIfNeeded()
}
}
extension UserViewController: ResourceObserver {
func resourceChanged(_ resource: Resource, event: ResourceEvent) {
let user: User? = resource.typedContent()
nameLabel.text = user?.name
emailLabel.text = user?.email
}
}
注意:Siesta 是一个非常灵活和可定制的框架,您可以找到多种方式来配置您的服务和资源。这只是实现您要求的一种简单方法。
- 要使用参数发出 POST 请求,您可以在
Service
class: 中执行类似的操作
实施发出 POST 请求的 update
方法。
func update(user: User, newName: String) -> Siesta.Request {
return usersResource
.child(user.id)
.child("update")
.request(.post, json: ["name": newName])
}
然后,在您的 ViewController
中,您可以调用方法来提交 POST
请求并评估其响应:
myAPI.update(user: user, newName: "NEW NAME")
.onSuccess({ (_) in
print("Successfully updated user's name.")
})
.onFailure({ (error) in
print("Error trying to update user's name.")
})