如何使用GraphQL.Net和c#将集合传递给GraphQL突变?

时间:2019-04-30 07:37:54

标签: c# graphql graphql.net

我正在尝试构建一个可以接受集合的变异。 GraphQL服务器使用c#.net内核编写,并使用GraphQL.Net。

这是我的输入类型;

 /**
 * Method is  use to read google fit response and store in collection
 *
 * @param dataReadResult google fit response
 */
private void readResponse(DataReadResponse dataReadResult) {
    ArrayList<ActivityLogModel> activityLogModels = new ArrayList<>();

    if (dataReadResult.getBuckets().size() > 0) {
        for (int i = 0; i < dataReadResult.getBuckets().size(); i++) {
            ActivityLogModel activityLogModel = new ActivityLogModel();
            activityLogModel.setType(dataReadResult.getBuckets().get(i).getActivity());
            activityLogModel.setStartTime(dateTimeFormat.format(dataReadResult.getBuckets().get(i).getStartTime(TimeUnit.MILLISECONDS)));
            activityLogModel.setEndTime(dateTimeFormat.format(dataReadResult.getBuckets().get(i).getEndTime(TimeUnit.MILLISECONDS)));
            ArrayList<FitnessDataTypeModel> datasetModels = new ArrayList<>();


            for (int j = 0; j < dataReadResult.getBuckets().get(i).getDataSets().size(); j++) {

                if (dataReadResult.getBuckets().get(i).getDataSets() != null) {
                    FitnessDataTypeModel dataTypeModel = new FitnessDataTypeModel();
                    ArrayList<DataPointModel> dataPointModels = new ArrayList<>();
                    for (DataPoint dataPoint : dataReadResult.getBuckets().get(i).getDataSets().get(j).getDataPoints()) {





                        ArrayList<FieldModel> fieldModels = new ArrayList<>();
                        DataPointModel dataPointModel = new DataPointModel();
                        dataPointModel.setStartTime(dateTimeFormat.format(dataPoint.getStartTime(TimeUnit.MILLISECONDS)));
                        dataPointModel.setEndTime(dateTimeFormat.format(dataPoint.getEndTime(TimeUnit.MILLISECONDS)));
                        dataPointModel.setType(dataPoint.getDataType().getName());


                        for (Field field : dataPoint.getDataType().getFields()) {



                            FieldModel fieldModel = new FieldModel(field.getName(), "" + dataPoint.getValue(field));

                            fieldModels.add(fieldModel);

                        }
                        dataPointModel.setFieldModels(fieldModels);
                        dataPointModels.add(dataPointModel);
                    }
                    if (dataPointModels.size() > 0) {
                        dataTypeModel.setDataPointModels(dataPointModels);

                    }
                    datasetModels.add(dataTypeModel);

                }

            }

            activityLogModel.setActivityModel(datasetModels);

            activityLogModels.add(activityLogModel);
        }

    }

我使用GraphiQL尝试发布以下突变;

public class PupilReportInputType : InputObjectGraphType<PupilReport>
{
    public PupilReportInputType()
    {
        Name = "PupilReportInput";
        Field(pr => pr.PupilId);
        Field(pr => pr.PupilMetricCollections, type: typeof(ListGraphType<PupilMetricCollectionInputType>));
    }
}

具有以下变量;

mutation getPupilReportText($pupilReport: PupilReportInput!) {
  getPupilReportText(pupilReport: $pupilReport)
}

我得到的答复是;

{
  "pupilReport": {
    "pupilId" : 5,
    "pupilMetricCollections": {
      "pupilMetricCollection" : {
         "pupilId" : 5
      }
    }
  }
}

如果{ "errors": [ { "message": "Variable '$pupilReport.pupilMetricCollections[0]' is invalid. Unable to parse input as a 'PlayerMetricCollectionInput' type. Did you provide a List or Scalar value accidentally?", "extensions": { "code": "INVALID_VALUE" } } ] } 的{​​{1}}字段被删除,并且对变异变量进行了类似的调整,则查询的行为与预期的一样(不是错误)。类似地,如果我修改变量输入和PupilReportInputType,以使该字段只是PupilMetricCollections而不是PupilReportInputType,那么我可以使它们全部正常工作。

如何在PupilMetricCollectionInputType上传递收藏集?我需要某种ListGraphInputType吗?

1 个答案:

答案 0 :(得分:0)

我是graphQL的新手,因此假定我所犯的错误是在我的代码中。实际上,我得到的响应信息是给我所有我需要的信息。我发送的可变数据确实格式错误。

我发送了这个

{
  "pupilReport": {
    "pupilId" : 5,
    "pupilMetricCollections": {
      "pupilMetricCollection" : {
         "pupilId" : 5
      }
    }
  }
}

但是,priseMetricCollections是数组类型;所以我需要使用数组语法。以下工作正常;

{
  "pupilReport": {
    "pupilId" : 5,
    "pupilMetricCollections": [
      {
        "pupilId" : 1
      },
      {
        "pupilId" : 2
      }
    ]
  }
}

在这里,我最大的收获是相信GraphQL错误响应,并且别忘了寻找显而易见的东西!