Swagger传入多个查询字符串时报TypeError: NetworkError资源获取错误
问题表现
- Swagger调试接口时,同时传入2个可选查询字符串参数会抛出
TypeError: NetworkError when attempting to fetch resource错误 - 涉事接口共3个参数:1个路由必填参数,2个可选查询参数,仅两个可选查询参数同时传入时才会触发报错
- 完全相同的请求参数在Postman调试、直接通过浏览器地址栏发起请求时均可正常运行,无报错
涉事后端C# WebAPI代码
[HttpGet("{customerId}/campaign/ads")] public IActionResult GetAds([FromRoute] long customerId, [FromQuery] long? campaignId, [FromQuery] long? adGroupId) { var serviceResponse = _campaignService.GetAds(new GetAdsServiceRequest { CustomerId = customerId, CampaignId = campaignId, AdGroupId = adGroupId }); if (null == serviceResponse || serviceResponse.Count <= 0) return StatusCode((int)HttpStatusCode.NotFound); return StatusCode((int)HttpStatusCode.OK, serviceResponse.Select(googleAdsRow => new GetAdsHttpResponse { CustomerId = customerId, CampaignId = googleAdsRow.Campaign.Id, AdGroupId = googleAdsRow.AdGroup.Id, AdGroupAdAdId = googleAdsRow.AdGroupAd.Ad.Id, AdGroupAdAdName = googleAdsRow.AdGroupAd.Ad.Name, AdGroupAdAdType = googleAdsRow.AdGroupAd.Ad.Type.ToString() })); }
根因定位
这个问题是.NET平台下Swagger组件(Swashbuckle.AspNetCore)低版本的已知bug:当接口存在多个值类型的可空查询参数时,Swagger UI拼接请求URL的逻辑存在缺陷,会生成格式非法的请求地址,导致浏览器fetch请求直接抛出网络错误,请求根本没有发送到后端服务,因此Postman、直接浏览器访问这类不会触发Swagger URL拼接逻辑的场景完全正常。
修复方案
- 优先升级NuGet包
Swashbuckle.AspNetCore到最新稳定版本,官方已经在后续迭代中修复了多可空查询参数的URL拼接问题,绝大多数场景升级后即可直接恢复正常。 - 如果升级包后问题仍存在,显式给两个可空查询参数指定默认值、明确查询参数名称,避免OpenAPI schema生成歧义,修改后的接口签名参考如下:
[HttpGet("{customerId}/campaign/ads")] [Produces("application/json")] public IActionResult GetAds( [FromRoute] long customerId, [FromQuery(Name = "campaignId")] long? campaignId = null, [FromQuery(Name = "adGroupId")] long? adGroupId = null) { // 原有业务逻辑无需改动 var serviceResponse = _campaignService.GetAds(new GetAdsServiceRequest { CustomerId = customerId, CampaignId = campaignId, AdGroupId = adGroupId }); if (null == serviceResponse || serviceResponse.Count <= 0) return NotFound(); return Ok(serviceResponse.Select(googleAdsRow => new GetAdsHttpResponse { CustomerId = customerId, CampaignId = googleAdsRow.Campaign.Id, AdGroupId = googleAdsRow.AdGroup.Id, AdGroupAdAdId = googleAdsRow.AdGroupAd.Ad.Id, AdGroupAdAdName = googleAdsRow.AdGroupAd.Ad.Name, AdGroupAdAdType = googleAdsRow.AdGroupAd.Ad.Type.ToString() })); }
- 排查验证:修复后可打开浏览器开发者工具(F12)的网络面板,查看Swagger发出的请求URL格式是否为标准的
/{customerId}/campaign/ads?campaignId=xxx&adGroupId=xxx格式,确认无多余字符、路径参数错位问题即可。
内容的提问来源于stack exchange,提问作者omer.canyucel
相关产品推荐
相关产品推荐

