Swift Siesta获取和发布

时间:2017-02-05 09:12:50

标签: swift3 siesta-swift

我是Siesta的新手。如何获取整个数组并传入我的模型?此外,我怎么能用params发帖?在他们的文档中我找不到任何这个。

2 个答案:

答案 0 :(得分:1)

我也是午睡的新手。我能够在http://bustoutsolutions.github.io/siesta/guide/requests/

找到有关请求的文档

基本上,您将设置资源,然后致电:

resource.request(.post, json: ["foo": [1,2,3]])

答案 1 :(得分:0)

您的问题过于复杂,因此我将尝试以一种简单的方式向您解释。

  1. Siesta提供了一种使用“自定义变压器”来映射模型的好方法。一种简单的方法是实现Swift 4+提供的Decodable协议:

让我们说我们要解码此JSON响应:

{
    "id": 1,
    "name": "Oswaldo",
    "email": "omaestra@gmail.com"
}

进入我们出色的User类,该类实现了可解码协议:

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类。

接下来,在我们的Siesta.Service类中,我们可以为特定资源配置自定义转换器:

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: $0.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是非常灵活且可自定义的框架,您可以找到多种配置服务和资源的方法。这只是实现您所要求的一种简单方法。


  1. 要使用参数发出POST请求,您可以在Service类中执行以下操作:

实施发出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.")
        })