You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Specflow中URL查询参数JSON编码失效,GET API请求返回400错误求助

在Specflow中正确编码GET请求的JSON查询参数

问题核心

你碰到的400错误,本质是对整个JSON结构做了全量URL编码(比如把{}转成%7B%7D这类),但后端只需要对JSON里的特殊字符(比如双引号")转义,得保留[]{}:,这些JSON结构符号。

举个对比:

  • 错误编码结果(全量转义):
    %7B%22SearchBy%22%3A%22title%22%2C%22SearchOperator%22%3A%22contains%22%2C%20%22SearchValue1%22%3A%22Testing%22%7D
    
  • 正确编码结果(仅转义双引号):
    [{"Searchby":"title","searchOperator":"contains","filterValue1":"testing"}]
    

对应浏览器可识别的目标URL就是你需要的:

/endpointapi?SearchOptions=[{%22Searchby%22:%22title%22,%22searchOperator%22:%22contains%22,%22filterValue1%22:%22testing%22}]

具体解决方案(Specflow步骤定义中实现)

方法1:手动精准转义双引号

构建好搜索选项的JSON后,只把双引号替换成URL编码的%22,其他结构符号不动:

// 1. 构建搜索选项对象,支持equal/in/like/contains等操作符
var searchOption = new 
{
    Searchby = "title",
    searchOperator = "contains", // 按需替换为equal/in/like
    filterValue1 = "testing"
};

// 2. 序列化为原始JSON字符串
string rawJson = JsonConvert.SerializeObject(new[] { searchOption });

// 3. 仅转义双引号,保留JSON结构
string encodedSearchParam = rawJson.Replace("\"", "%22");

// 4. 拼接最终请求URL
string requestUrl = $"/endpointapi?SearchOptions={encodedSearchParam}";

方法2:局部编码+手动保留数组结构

不对整个数组编码,只对单个JSON对象编码,再手动包裹[]:

var searchOption = new 
{
    Searchby = "category",
    searchOperator = "in", // in操作符示例,对应多值场景
    filterValue1 = "electronics,home"
};

string rawJsonObject = JsonConvert.SerializeObject(searchOption);
// 编码单个JSON对象,再套进数组里
string encodedParam = $"[{Uri.EscapeDataString(rawJsonObject)}]";
string requestUrl = $"/endpointapi?SearchOptions={encodedParam}";

方法3:用HttpClient的工具类自动处理

如果用HttpClient发起请求,直接用HttpUtility.ParseQueryString构建参数,它会自动处理正确的编码逻辑:

var queryParams = HttpUtility.ParseQueryString(string.Empty);
var searchOptions = new List<object>
{
    new 
    {
        Searchby = "id",
        searchOperator = "equal",
        filterValue1 = "12345"
    }
};

// 序列化后直接赋值,工具类会自动处理双引号编码
queryParams["SearchOptions"] = JsonConvert.SerializeObject(searchOptions);

// 拼接完整URL
string baseUrl = "/endpointapi";
string fullUrl = $"{baseUrl}?{queryParams.ToString()}";

// 带Token发起请求
var request = new HttpRequestMessage(HttpMethod.Get, fullUrl);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "你的有效Token");
var response = await httpClient.SendAsync(request);

验证注意事项

  • 编码后要确认[]{}:,这些符号都保留原样,只有双引号变成%22
  • 不管是equal、in还是like操作符,只需要修改searchOperator字段的值,编码逻辑不用改
  • Postman测试时,直接在Params的Value里输入原始JSON数组(比如[{"Searchby":"title","searchOperator":"contains","filterValue1":"testing"}]),它会自动帮你处理正确编码,不用手动转义

内容的提问来源于stack exchange,提问作者GPs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:49:50