C#中动态拼接参数调用GetAsync API返回Bad Request问题
C#动态拼接URL调用GetAsync返回Bad Request的解决办法
问题场景
动态拼接参数生成Uri调用GetAsync时返回Bad Request:
Uri URL = new Uri($"https://authenticom.azure-api.net/dv-delivery/v1/delivery/?requestId={requestId}&pageSize={pageSize}"); HttpResponseMessage response = client.GetAsync(URL).Result;
但将生成的URL字符串硬编码后调用却能正常执行:
HttpResponseMessage response = client.GetAsync("https://authenticom.azure-api.net/dv-delivery/v1/delivery/?requestId=1994bb2d-afc3-4323-b7da-c2c695dd4307&pageSize=100").Result;
问题原因
直接通过字符串插值拼接URL参数时,若参数包含特殊字符(如空格、&、=、中文等),会导致URL格式不符合规范。虽然Uri构造函数会做部分编码处理,但这种手动拼接方式容易遗漏编码步骤,最终生成的URL因参数未正确编码被服务端判定为无效请求。
解决方案
方案1:用QueryHelpers构建带参数的URL(推荐.NET Core/.NET 5+使用)
借助Microsoft.AspNetCore.WebUtilities.QueryHelpers可以安全地添加查询参数,自动处理编码:
using Microsoft.AspNetCore.WebUtilities; var baseUrl = "https://authenticom.azure-api.net/dv-delivery/v1/delivery/"; var queryParams = new Dictionary<string, string> { { "requestId", requestId }, { "pageSize", pageSize.ToString() } }; var url = QueryHelpers.AddQueryString(baseUrl, queryParams); HttpResponseMessage response = client.GetAsync(url).Result;
方案2:用UriBuilder构建URL(兼容.NET Framework)
通过UriBuilder和HttpUtility.ParseQueryString来管理查询参数,自动完成编码:
using System.Web; var builder = new UriBuilder("https://authenticom.azure-api.net/dv-delivery/v1/delivery/"); var query = HttpUtility.ParseQueryString(builder.Query); query["requestId"] = requestId; query["pageSize"] = pageSize.ToString(); builder.Query = query.ToString(); Uri url = builder.Uri; HttpResponseMessage response = client.GetAsync(url).Result;
方案3:手动编码参数后拼接
如果需要手动拼接,先对每个参数进行URL编码:
string encodedRequestId = Uri.EscapeDataString(requestId); string encodedPageSize = Uri.EscapeDataString(pageSize.ToString()); Uri url = new Uri($"https://authenticom.azure-api.net/dv-delivery/v1/delivery/?requestId={encodedRequestId}&pageSize={encodedPageSize}"); HttpResponseMessage response = client.GetAsync(url).Result;
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

