使用Elasticsearch和Swift创建简单的mBaaS示例应用程序
首先
这篇文章是一个实验性的文章,旨在同时攻略Elasticsearch和Swift的Advent Calendar,一举两得。
这是Elasticsearch Advent Calendar 2014的第四天,同时也是Swift Advent Calendar 2014的第四天。
简而言之
为了推广Elasticsearch作为一种“数据存储”的用途而被广泛使用的服务器解析功能,最近我们尝试简单搭建它作为mBaaS服务器的流行趋势。
所有的逻辑都是在Swift端实现的,并直接访问Elasticsearch。
因此,我不建議將其用作正式環境,出於安全性的考慮。
如果要實際使用,需要在Swift和Elasticsearch之間添加Web應用程序,以避免經過身份驗證的快捷方式。
(如果可以創建Elasticsearch的插件,也可以在不使用Web應用程序的情況下完成。)
我在Elasticsearch的认证部分使用elasticsearch-auth。
此外,在Swift中,我们也使用了Alamofire和SwiftyJSON。
我用于这个实验的代码存放在tadyjp/ElasticSwift中。
版本信息
Elasticsearch 1.4.0
Swift版本1.1 (swift-600.0.56.1)
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。
希望这只是一个起点,能够超越兴趣范围,创造出新的应用的想法。