所以我想查看Firebase并尝试连接到Hackernews Firebase数据库。我正在使用com.google.firebase:firebase-server-sdk:3.0.3
sdk。
但我不知道为什么我被迫进入服务帐户。
@Bean
fun firebase(): DatabaseReference {
val options = FirebaseOptions.Builder()
.setDatabaseUrl("https://hacker-news.firebaseio.com/")
.setServiceAccount(this.javaClass.getResourceAsStream("/account.json"))
.build()
val app = FirebaseApp.initializeApp(options)
val instance = FirebaseDatabase.getInstance(app)
return instance.reference
}
为什么在这种情况下需要setServiceAccount?如果我把它留下来我得到以下例外:
Caused by: java.lang.IllegalStateException: Service Account must be provided.
at com.google.firebase.internal.Preconditions.checkState(Preconditions.java:173) ~[firebase-server-sdk-3.0.3.jar:na]
at com.google.firebase.FirebaseOptions.<init>(FirebaseOptions.java:129) ~[firebase-server-sdk-3.0.3.jar:na]
有没有办法用Java客户端匿名连接到Firebase?这个JsFiddle没有服务帐户:http://jsfiddle.net/firebase/cm8ne9nh/
如果我连接到我自己的项目,这项工作非常好。我确实为自己的项目提供了一个合适的服务帐户...
以为我可以用同样的方式连接Java。有任何想法吗 ?有没有办法使用Firebase Java API连接Hackernews?
不幸的是,Java SDK只有两种版本。 Java-Client-Android和Java-Server。这意味着,如果你想要纯客户端代码,你只能在android上使用它。这一直是可用客户端库的一个奇怪限制。
但是,您可以做的是将firebase提供的REST API包装为Java,使用HTTP请求执行所有操作,就像在任何客户端库中一样。
已经实现此功能的存储库示例如下:https://github.com/j-fischer/rest-on-fire
你可以使用那个,或者你可以使用自己的。但是,为了在没有服务帐户的情况下使用firebase,您必须使用REST Api或仅针对Android,iOS和Web编写的官方客户端库。
虽然在这里的文档中并不明显
https://github.com/HackerNews/API
我发现这个REST API不需要身份验证:
它可以在很多方面使用,包括使用Retrofit和Moshi并且不需要身份验证。
只是Kotlin的一个例子:
interface HackerNewsService {
@GET("search?tags=(story,show_hn,front_page)&hitsPerPage=500")
fun searchStories(@Query("query") q: String, @Query("numericFilters") filters: String, @Query("page") page: Int): Call<SearchResult>
}
val response = hackerNewsService.searchStories(keyword, "created_at_i>$after", 0).execute()
if (response.isSuccessful) {
val searchResult: SearchResult = response.body()!!
println("results! (${searchResult.hits.size}) $searchResult")
} else {
println("uh oh")
}