我正在尝试构建一个可以接受集合的变异。 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吗?
答案 0 :(得分:0)
我是graphQL的新手,因此假定我所犯的错误是在我的代码中。实际上,我得到的响应信息是给我所有我需要的信息。我发送的可变数据确实格式错误。
我发送了这个
{
"pupilReport": {
"pupilId" : 5,
"pupilMetricCollections": {
"pupilMetricCollection" : {
"pupilId" : 5
}
}
}
}
但是,priseMetricCollections是数组类型;所以我需要使用数组语法。以下工作正常;
{
"pupilReport": {
"pupilId" : 5,
"pupilMetricCollections": [
{
"pupilId" : 1
},
{
"pupilId" : 2
}
]
}
}
在这里,我最大的收获是相信GraphQL错误响应,并且别忘了寻找显而易见的东西!