使用Elasticsearch和Swift创建简单的mBaaS示例应用程序

首先

这篇文章是一个实验性的文章,旨在同时攻略Elasticsearch和Swift的Advent Calendar,一举两得。

这是Elasticsearch Advent Calendar 2014的第四天,同时也是Swift Advent Calendar 2014的第四天。

简而言之

为了推广Elasticsearch作为一种“数据存储”的用途而被广泛使用的服务器解析功能,最近我们尝试简单搭建它作为mBaaS服务器的流行趋势。

所有的逻辑都是在Swift端实现的,并直接访问Elasticsearch。

因此,我不建議將其用作正式環境,出於安全性的考慮。
如果要實際使用,需要在Swift和Elasticsearch之間添加Web應用程序,以避免經過身份驗證的快捷方式。
(如果可以創建Elasticsearch的插件,也可以在不使用Web應用程序的情況下完成。)

Screen Shot 2014-12-04 at 4.46.39.png

我在Elasticsearch的认证部分使用elasticsearch-auth。

此外,在Swift中,我们也使用了Alamofire和SwiftyJSON。

我用于这个实验的代码存放在tadyjp/ElasticSwift中。

版本信息
Elasticsearch 1.4.0
Swift版本1.1 (swift-600.0.56.1)

Screen Shot 2014-12-04 at 5.04.04.png
Screen Shot 2014-12-04 at 5.03.56.png

Elasticsearch的代码

没有!

所有索引的创建和搜索都是使用Swift语言进行实现的。

以下是Swift的代码。

在Swift中,对于Elasticsearch的搜索主要是以下代码。

        let res = Alamofire.request(.POST, "http://localhost:9200/twitter/tweet/_search?q=user:\(self.username)", parameters: nil, encoding: .JSON)
            .responseJSON { (_, _, json, _) -> Void in
                let sjson = JSON(json!)
                if let hits = sjson["hits"]["hits"].array {
                    var tweets = [] as [String]
                    for subJson: JSON in hits {
                        println(subJson["_source"]["message"].string!)
                        tweets.append(subJson["_source"]["message"].string!)
                    }
                    block(tweets)
                } else {
                    println("getTweets error")
                }
        }

只是简单地进行了一个JSON请求,所以没有什么困难之处。

user:<ユーザー名>

通过发出这个搜索查询,只提取出自己的投稿。

通过查询,只提取出自己的投稿。

由于查询,仅仅获取自己的投稿。

通过搜索查询,只选取自己的投稿。

需要付出功夫的是登录处理的部分。


    class func currentUser() -> ElasticUser? {
        let ud = NSUserDefaults.standardUserDefaults()
        if let username = ud.objectForKey("username") as? String {
            let token = ud.objectForKey("token") as String
            let user = ElasticUser(username: username, token: token)
            println("currentUser = \(username)")
            return user
        } else {
            return nil
        }
    }

    class func signUp(username: String, password: String, block: (user: ElasticUser?) -> ()) {
        let params = [
            "authenticator": "index",
            "username": username,
            "password": password,
            "roles": "[\"user\"]"
        ]

        println("signUp...")

        let res = Alamofire.request(.PUT, "http://localhost:9200/_auth/account", parameters: params, encoding: .JSON)
            .responseJSON { (_, _, json, _) -> Void in
                let sjson = JSON(json!)
                println(sjson["status"])
                if sjson["status"] == 200 {
                    self.logIn(username, password: password, { (user2: ElasticUser?) in
                        block(user: user2)
                    })
                }
        }
    }

    class func logIn(username: String, password: String, block: (user: ElasticUser?) -> ()) {
        let params = [
            "username": username,
            "password": password
        ]

        println("logIn...")

        let res = Alamofire.request(.POST, "http://localhost:9200/login", parameters: params, encoding: .JSON)
            .responseJSON { (_, _, json, _) -> Void in
                let sjson = JSON(json!)
                println(sjson["status"])
                if sjson["status"] == 200 {
                    let user: ElasticUser? = ElasticUser(username: username, token: sjson["token"].string!)
                    block(user: user)
                } else {
                    block(user: nil)
                }
        }
    }

由于初次登录没有登录信息,因此我们将请您创建一个用户使用elasticsearch-auth。
之后,您可以使用该用户名和密码登录,同时还会生成一个唯一的token,您可以将其保存在NSUserDefaults中,在下次访问时使用。

整理

只凭一小段客户端代码,便能运行使用了Elasticsearch无模式特性的模拟MBaaS。

希望这只是一个起点,能够超越兴趣范围,创造出新的应用的想法。

广告
将在 10 秒后关闭
bannerAds