调用GraphQL接口出现Cannot read property 'concat' of null错误排查
问题:.NET序列化GraphQL请求体后调用接口报"Cannot read property 'concat' of null"错误
问题背景
我在Postman中使用以下GraphQL查询作为请求体调用接口时可正常运行:
query Sessions( $appID: ID!, $newestCursor: String, $oldestCursor: String, $cursor: String, $date: Float, $filters: [SessionFilter!], $groupedFilters: [[SessionFilter!]!], $retentionMonths: Int, $disablePagination: Boolean, $sourceAppID: String, $exactCount: Boolean) { app(id: $appID, sourceAppID: $sourceAppID) { appID sessionInfo ( newestCursor: $newestCursor, oldestCursor: $oldestCursor, cursor: $cursor, date: $date, filters: $filters, groupedFilters: $groupedFilters, retentionMonths: $retentionMonths, disablePagination: $disablePagination, exactCount: $exactCount) { sessions { browserInfo { href useragent platform __typename } deviceInfo { deviceName deviceType manufacturer release __typename } user { name email userID isAnonymous __typename } location { country region city ip __typename } activity { videoTime start end href __typename } date id duration eventCount hasIntercomShow hasZendeskShow isDeleted __typename } cursor newestCursor nextCursor prevCursor sessionOffset sessionCount isEstimatedCount scanInfo { count total horizon __typename } __typename } __typename } }
但通过.NET代码将包含该查询的requestModel序列化为JSON后发起请求,收到以下错误:
"errors": [ { "message": "Cannot read property 'concat' of null", "locations": [ { "line": 4, "column": 5 } ], "path": [ "app", "sessionInfo" ], "extensions": { "code": "INTERNAL_SERVER_ERROR" } } ]
我的.NET代码如下:
var jsonSettings = new JsonSerializerSettings(); jsonSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); var body = JsonConvert.SerializeObject(requestModel, jsonSettings); //requestModel contains the query var content = new StringContent(body, Encoding.UTF8, "application/json"); var response = await SendRequest(method, uri, content, token);
问题分析
这个错误的核心原因是:GraphQL服务端在处理filters或groupedFilters这类数组类型的参数时,收到了null值,而服务端内部代码尝试对null执行concat操作,从而抛出异常。
Postman中能正常运行,是因为你可能没有显式传递这两个参数(服务端会使用默认的空数组),或者传递了空数组[];但.NET序列化时,如果requestModel中对应的filters或groupedFilters属性为null,会直接序列化为null并发送给服务端,这不符合服务端的预期。
解决方案
方案1:初始化数组参数为空数组
在构建requestModel时,确保filters和groupedFilters属性即使没有过滤条件,也初始化为空数组,而不是null:
// 示例:初始化requestModel的数组属性 requestModel.Filters = new List<SessionFilter>(); requestModel.GroupedFilters = new List<List<SessionFilter>>();
方案2:修改JSON序列化配置,忽略null值属性
调整序列化设置,让Newtonsoft.Json忽略值为null的属性,这样这些参数不会出现在请求体中,服务端会使用默认的空数组:
var jsonSettings = new JsonSerializerSettings(); jsonSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 添加这行配置,忽略null值的属性 jsonSettings.NullValueHandling = NullValueHandling.Ignore; var body = JsonConvert.SerializeObject(requestModel, jsonSettings); var content = new StringContent(body, Encoding.UTF8, "application/json"); var response = await SendRequest(method, uri, content, token);
方案3:对比Postman请求体,确保结构一致
打印.NET序列化后的body内容,和Postman中正常请求的请求体做对比,确认参数的格式(比如数组参数是null还是空数组,或者是否被省略),保证两者结构完全一致。
内容的提问来源于stack exchange,提问作者Fakhar Ahmad Rasul
相关产品推荐
相关产品推荐

