Как использовать Retrofit для Android для связи с облачной функцией Firebase? - PullRequest
0 голосов
/ 01 февраля 2020

Я бы хотел отправить запрос из моего Android приложения в Google Firebase с помощью функций Google.

Поэтому я определил API-интерфейс на стороне клиента, например:

interface MyApi {
    /**
     * Get the list of the pots from the API
     */
    @GET("/posts")
    fun getPosts(): Observable<List<Post>>

    @POST("/addUser")
    fun addUser(@Query("name") name: String, @Query("token") token: String): Observable<User>
}

В ModelView я отправляю запрос, используя RX Java, например:

subscription = Observable.fromCallable{ loveDateApi.addUser(name, token) }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe( { result -> println("Result: $result") },
                        {error -> println("Error: $error")})

Пользовательский объект, который я наблюдаю, выглядит следующим образом:

import androidx.room.Entity
import androidx.room.PrimaryKey
import com.google.gson.annotations.Expose

@Entity
data class User(
        @Expose
        @field:PrimaryKey
        val idUser: Int,
        @Expose
        val token: String,
        @Expose
        val name: String,
        @Expose
        val age: Int
)

Мой сетевой модуль, в котором я предоставляю Модернизация выглядит следующим образом (только выдержка):

´´´

@Provides
@Reusable
@JvmStatic
internal fun provideRetrofitInterface(): Retrofit {
    return Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
            .build()
}

´´´

На стороне сервера развернутая мной облачная функция Google выглядит так :

exports.addUser = functions.https.onRequest(async (request:any,response:any) => {

  // read parameters from request
  const name = request.query.name
  const token = request.query.token

  const data = {
    name: name,
    age: 30,
    token: token

  }

  // use add if no doc-ID is specified else use set
  const idUser = (await db.collection(collectionUser).add(data)).id

  const newData = {
    idUser: idUser,
  }

  const userRef = db.collection(collectionUser).doc(idUser)
  await userRef.update(newData)
  const newUserRef = await userRef.get()

  response.send(newUserRef.data())
})

Использование почтальона для отправки запроса в облачные функции работает, но, к сожалению, не в клиентском приложении.

Есть идеи?

1 Ответ

0 голосов
/ 01 февраля 2020

ОК, нашел решение. Я добавил метод blockingFirst () в части fromCallabe, так что это выглядит так:

subscription = Observable.fromCallable{ loveDateApi.addUser(name, token).blockingFirst() }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe( { result -> println("Result: $result") },
                        {error -> println("Error: $error")})

Знаете ли вы какие-нибудь альтернативные решения для экспертов Rx Java там? ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...