如何在Android上使用GraphQL与Retrofit?

8cdiaqws  于 2023-05-27  发布在  Android
关注(0)|答案(3)|浏览(200)

我是GraphQL的新手,但我已经使用Retrofit有一段时间了,它易于使用且快速。GraphQL在传递数据的方式上与REST API有很大的不同。关于在Android上使用GraphQL的教程真的不多,我只能找到这个视频(https://www.youtube.com/watch?v=P0uJHI7GjIc&t=1s),但里面没有真正的代码。
在我目前的代码中,我有一个端点,我设置如下:

final RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(endPoint)
                .build();
        T service = restAdapter.create(clazz);

然后我调用一个像这样的休息服务:

@GET("/users/{login}")
    Observable<Github> getUser(@Path("login") String login);

现在使用GraphQL,你只有一个基本URL,没有服务路径。另外,如果你是像userId=1这样的查询,那么你必须发送带有Body参数的Post:

operationName: arbitrary name ,
query: "{users(userid:$userId){username}}, 
variables: "{"userId":1}"

我只是不知道这怎么翻译为翻新

ltskdhd1

ltskdhd11#

为GraphQL构建查询和解析响应并不简单。如果你在宠物项目中使用这个,我建议你开始探索阿波罗。这个客户端正在认真开发,但你已经可以看看和玩它。
https://github.com/apollographql/apollo-android
到目前为止,我很喜欢与Apollo合作,他们的路线图上有一些不错的功能:RxJava集成、改造、订阅和AutoValue支持

crcmnpdw

crcmnpdw2#

在你的清单中添加

<uses-permission android:name="android.permission.INTERNET"/>

您的依赖项

// Kotlin Coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.4'

//OkHttp
implementation ("com.squareup.okhttp3:okhttp:3.12.12"){
  force = true //API 19 support
}
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.12'

//retrofit
implementation "com.squareup.retrofit2:retrofit:2.7.1"
implementation "com.squareup.retrofit2:converter-scalars:$2.7.1"

Java 8兼容性

android {

    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = "1.8"
    }
}

与服务

import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.Headers
import retrofit2.http.POST

interface GraphQLService {

    @Headers("Content-Type: application/json")
    @POST("/")
    suspend fun postDynamicQuery(@Body body: String): Response<String>
}

你可以创建一个对象

import retrofit2.Retrofit
import retrofit2.converter.scalars.ScalarsConverterFactory

object GraphQLInstance {

    private const val BASE_URL: String = "http://192.155.1.55:2000/"

    val graphQLService: GraphQLService by lazy {
        Retrofit
            .Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(ScalarsConverterFactory.create())
            .build().create(GraphQLService::class.java)
    }
}

在活动中,您可以创建此方法

private fun post(userId: String){
    val retrofit = GraphQLInstance.graphQLService
    val paramObject = JSONObject()
    paramObject.put("query", "query {users(userid:$userId){username}}")
    GlobalScope.launch {
        try {
            val response = retrofit.postDynamicQuery(paramObject.toString())
            Log.e("response", response.body().toString())
        }catch (e: java.lang.Exception){
            e.printStackTrace()
        }
    }
}

您可以检查the example in GitHubmy post
注意:如果需要突变应该改这一行

paramObject.put("query", "query {users(userid:$userId){username}}")

paramObject.put("query", "mutation {users(userid:$userId){username}}")
dpiehjr4

dpiehjr43#

这种方法对我很有效:

interface ApiService {
    @POST("myUrl")
    @Headers("Content-Type: application/json")
    suspend fun requestOtp(@Body requestData: GraphQlRequest): MyResponse
}

data class GraphQlRequest(
    val query: String,
    val variables: Map<String, Any>
)

val query = "query MyQuery { requestOTP(mobilePhone: \"0423130812\" ) { message } }"
val variables = emptyMap<String, Any>()

val request = GraphQlRequest(query, variables)
val apiService = retrofit.create(MyApiService::class.java)
val response = apiService.executeGraphQlQuery(request)

相关问题