При синтаксическом анализе конструктора GQLReq типа Hasura.GraphQL.Transport.HTTP.Protocol.GQLReq ожидал объект, но получил String - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь сделать запрос к бэкенду Hasura, используя Flutter, Chopper и Built Value, и получаю следующую ошибку

> When parsing the constructor GQLReq of type Hasura.GraphQL.Transport.HTTP.Protocol.GQLReq expected Object but got String.,

Сервис Chopper

@ChopperApi(baseUrl: '/v1/graphql')
abstract class PostApiService extends ChopperService {
  @Post()
  Future<Response<BuiltPost>> get(@Body() String body);

  static PostApiService create(AuthHeaderProvider authHeaderProvider) {
    final client = ChopperClient(
      baseUrl: 'https://arrivee-app-test.herokuapp.com',
      services: [
        _$PostApiService(),
      ],
      converter: BuiltValueConverter(),
      interceptors: [
        HttpLoggingInterceptor(),
     //   HeadersInterceptor({'content-type': 'application/json'}),
        HeadersInterceptor({'Authorization':'Bearer token'})
      ],
    );
    return _$PostApiService(client);
  }
}

Я делаю запрос со следующим кодом

    var request = RequestModel((b) => b
  ..query = fetchAccommodations()
  ..variables = null
  ..operationName = 'AccommodationGet');

var response = await client.get(request.toJson());

RequestModel

    abstract class RequestModel
    implements Built<RequestModel, RequestModelBuilder> {
  String get query;

  @nullable
  String get variables;

  String get operationName;

  RequestModel._();

  factory RequestModel([updates(RequestModelBuilder b)]) = _$RequestModel;

  String toJson() {
    return json
        .encode(serializers.serializeWith(RequestModel.serializer, this));
  }

  static RequestModel fromJson(String jsonString) {
    return serializers.deserializeWith(
        RequestModel.serializer, json.decode(jsonString));
  }

  static Serializer<RequestModel> get serializer => _$requestModelSerializer;
}

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Обнаружена та же ошибка при попытке сделать простой HTTP-вызов POST для Hasura в Angular Dart (клиент GraphQL недоступен).

Я обнаружил, что строка Json должна быть встроена следующим образом:

   String query = """
      {
        account {
            id
          }
      }
    """;

    Map<String, dynamic> variables;

    if (query.trimLeft().split(' ')[0] != 'query') {
      query = 'query $docQuery';
    }

    var jsonMap = {'query': query, 'variables': variables};

    final _headers = {'Content-Type': 'application/json'};
    return _authHttpService.post(_apiUrl,
        headers: _headers, body: json.encode(jsonMap));

Надеюсь, это поможет всем, кто ищет ванильное решение для дротиков.

0 голосов
/ 12 апреля 2020

Мне удалось это решить. разместив здесь для дальнейшего использования. Я позволил чопперу выполнять преобразование из модели в строку вместо того, чтобы делать это вручную, здесь я изменил сигнатуру службы чоппера с:

 @Post()
  Future<Response<BuiltPost>> get(@Body() String body);

на

@Post()
Future<Response<BuiltPost>> get(@Body() RequestModel body);

и вызову услуга от:

 var request = RequestModel((b) => b
  ..query = fetchAccommodations()
  ..variables = null
  ..operationName = 'AccommodationGet');

var response = await client.get(request.toJson());

до

 var request = RequestModel((b) => b
      ..query = fetchAccommodations()
      ..variables = null
      ..operationName = 'AccommodationGet');

var value = await client.get(request);
...