При парсинге конструктора GQLReq типа Hasura.GraphQL.Transport.HTTP.Protocol.GQLReq ожидал Object, но получил String
Я пытаюсь сделать запрос к бэкэнду Hasura, используя Flutter, Chopper и Built Value, и получаю следующую ошибку
> When parsing the constructor GQLReq of type Hasura.GraphQL.Transport.HTTP.Protocol.GQLReq expected Object but got String.,
Чоппер сервис
@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 ответа
Обнаружена та же ошибка при попытке сделать простой HTTP-вызов POST для Hasura в Angular Dart (нет доступного клиента GraphQL).
Я обнаружил, что Json String нужно было построить следующим образом:
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));
Надеюсь, это поможет любому, кто ищет решение для ванильного дротика.
Мне удалось это решить. размещение здесь для дальнейшего использования. Я позволил chopper выполнить преобразование модели в строку вместо того, чтобы делать это заранее вручную, здесь я изменил подпись службы chopper с:
@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);