1

我在服务器端定义了一个查询

public TradeQuery(ITradeService tradeservice)
    {
        Name = nameof(TradeQuery);
        Field<ListGraphType<TradeType>>("trades", resolve: r => { return tradeservice.GetTrades(); });
    }

当我从 GraphiQL 客户端调用时,我得到了正确的响应。来自 GraphiQL 的请求是

{
  tradeQuery {
    trades {
      id
      price
      quantity
     
    }
  }
}

并得到回应

{"data": {
    "tradeQuery": {
      "trades": [
        {
          "id": 3,
          "price": 600,
          "quantity": 600
        },
        {
          "id": 4,
          "price": 100,
          "quantity": 100
        }]}}}

但是当我尝试使用GraphQLHttpClient它调用相同的查询时,它返回为 null 在下面的代码中,我在availableTrades对象中得到了 null 值。

 string apiEndpoint = "https://localhost:44342/graphql";

            var graphQLClient = new GraphQLHttpClient(new GraphQLHttpClientOptions { 
                EndPoint = new Uri (apiEndpoint)
            }, new NewtonsoftJsonSerializer());

            var tradeQuery = @"{
                              tradeQuery{
                               trades {
                                id
                                price
                                quantity}}}";
            GraphQLRequest graphQLRequest = new GraphQLRequest(tradeQuery);
            var tradeQueryResponse = await graphQLClient.SendQueryAsync<TradeQuery>(graphQLRequest);
            var availableTrades = tradeQueryResponse.Data.Trades;

响应类型TradeQuery对象定义如下

 public class TradeQuery
        {
            public List<Trade> Trades { get; set; }
        }

你能指导一下可能出了什么问题吗?

4

1 回答 1

0

万一其他人遇到这个问题,我今天花了几个小时尝试反序列化查询结果的所有不同组合,并且使用动态是返回任何内容的唯一方法。我最终通过执行以下操作找到了解决方法。

先决条件

您需要两个 nuget 包才能正常工作:

  1. GraphQL.Client.Abstractions
  2. GraphQL.Client.Serializer.SystemTextJson;

而不是使用new GraphQLHttpClient(apiEndpoint, new NewtonsoftJsonSerializer());

利用new GraphQLHttpClient(apiEndpoint, new SystemTextJsonSerializer());

查询格式

您需要像我在这里所做的那样,通过给它一个别名来格式化您的查询。我有一个名为fakeLogin的查询,但通过预先添加数据:我现在为此查询的结果提供了数据的别名。

GraphQLRequest loginRequest = new GraphQLRequest
{               
    Query = @"
    {
        data:fakeLogin
        {
            token
        }
    }"
};

发送查询和消费结果

现在您的请求已创建,您现在需要以以下格式发送查询:

LoginToken responseData = _graphQlClient.SendQueryAsync(loginRequest, () => new { Data = new LoginToken()}).Result.Data.Data;
于 2021-08-03T15:05:04.470 回答