Apollo отправляет подписку как GET - PullRequest
1 голос
/ 05 июня 2019

моя техническая настройка выглядит следующим образом:

GraphQl через Apollo

AWS в качестве бэкэнда

Собственное приложение для Android, написанное на Kotlin

Запросы и мутации GraphQlработать без проблем.

У меня есть следующая проблема:

При создании подписки выполнение выдает GET вместо POST.В результате возникает ошибка бэкенда:

<-- 400 Bad Request aws.url/graphql (152ms)
Content-Type: application/json;charset=UTF-8
Content-Length: 135
Connection: close
Date: Wed, 05 Jun 2019 12:40:04 GMT
x-amzn-RequestId: id
x-amzn-ErrorType: MalformedHttpRequestException
X-Cache: Error from cloudfront
Via: 1.1 cloudfront.url (CloudFront)
X-Amz-Cf-Pop: pop
X-Amz-Cf-Id: id
{
 "errors" : [ {
   "message" : "Invalid request, `query` can't be null.",
   "errorType" : "MalformedHttpRequestException"
 } ]
}

Вот мой код:

Создание клиента:

val logger = HttpLoggingInterceptor()
        logger.level = HttpLoggingInterceptor.Level.HEADERS
        val blogger = HttpLoggingInterceptor()
        blogger.level = HttpLoggingInterceptor.Level.BODY
        val client = OkHttpClient.Builder()
                .addInterceptor(blogger)
                .authenticator(get())
                .build()
        ApolloClient.builder()
            .serverUrl(BuildConfig.backendUrl)
            .okHttpClient(client)
            .subscriptionTransportFactory(WebSocketSubscriptionTransport.Factory(BuildConfig.backendUrl, client))
            .build() as ApolloClient

Подписка

override suspend fun subscribeToVehiclePosition(vehicleId: String, listener: DataRegistration.Listener<SubscribeToVehicleSubscription.Data>): DataRegistration {
        val registration = RemoteDataRegistration()
        authenticatedClient.subscribe(SubscribeToVehicleSubscription.builder().id(vehicleId).build()).execute(object: ApolloSubscriptionCall.Callback<SubscribeToVehicleSubscription.Data> {
            override fun onFailure(e: ApolloException) {
                listener.onClose(e)
            }

            override fun onResponse(response: Response<SubscribeToVehicleSubscription.Data>) {
                val data = response.data()
                if (data != null) {
                    listener.onData(data)
                }
            }

            override fun onTerminated() {
                listener.onClose(IllegalStateException("Connection Terminated!!"))
            }

            override fun onCompleted() {
                listener.onCompleted()
            }
        })
        return registration
    }

Определение графика

subscription subscribeToVehicle($id: String!) {
    subscribeToCreateVehiclePositionLog(vehicleId: $id) {
        lat
        lng
        date
        tripId
    }
}

Схема

{
          "kind": "OBJECT",
          "name": "Subscription",
          "description": null,
          "fields": [
            {
              "name": "subscribeToCreateVehiclePositionLog",
              "description": null,
              "args": [
                {
                  "name": "vehicleId",
                  "description": null,
                  "type": {
                    "kind": "NON_NULL",
                    "name": null,
                    "ofType": {
                      "kind": "SCALAR",
                      "name": "String",
                      "ofType": null
                    }
                  },
                  "defaultValue": null
                }
              ],
              "type": {
                "kind": "OBJECT",
                "name": "VehiclePositionLog",
                "ofType": null
              },
              "isDeprecated": false,
              "deprecationReason": null
            }
          ],
          "inputFields": null,
          "interfaces": [],
          "enumValues": null,
          "possibleTypes": null
        },

Я битпотерял, почему подписка называется GET-вызовом.Кто-нибудь может мне помочь / знает, что здесь не так?

...