URL 添加 order_id 和 description 参数时报错
支付老李
结论
不要手动拼接查询字符串。把 API 地址设为基础 URL,再通过 RestSharp 的查询参数接口添加 currency、order_id 和 description。RestSharp 会处理 &、空格和中文等需要进行 URL 编码的字符。
var orderId = $"{DateTime.Now.Year}{Helper.Settings.NyTal(4)}";
var client = new RestClient("http://api.blabla.net");
var request = new RestRequest("subscriptions");
request.AddQueryParameter("currency", "dkk");
request.AddQueryParameter("order_id", orderId);
request.AddQueryParameter("description", "Medlemskab");
最终请求 URL 的形式如下:
http://api.blabla.net/subscriptions?currency=dkk&order_id=20261234&description=Medlemskab
其中,order_id 的具体值取决于 NyTal(4) 的返回内容。
原代码的问题
原来的写法在参数值只有简单字母和数字时未必会报错,但有两个隐患。
首先,description 变量中混入了参数名和分隔符:
var description = "&description=Medlemskab";
这会把 URL 结构和参数值混在一起。如果描述中出现空格、&、+ 或中文,生成的 URL 可能无效,服务器也可能错误拆分参数。
其次,下面这行代码的结果取决于 NyTal(4) 的返回类型:
var order = DateTime.Now.Year + Helper.Settings.NyTal(4);
如果 NyTal(4) 返回整数,这里执行的是数值加法。例如:
2026 + 1234 == 3260
如果需要得到 20261234,应明确使用字符串拼接:
var orderId = $"{DateTime.Now.Year}{Helper.Settings.NyTal(4)}";
如果必须手动构造 URL
应分别编码每个参数值,不要把 &description= 放进变量:
var orderId = $"{DateTime.Now.Year}{Helper.Settings.NyTal(4)}";
var description = "Medlemskab";
var url =
"http://api.blabla.net/subscriptions" +
"?currency=" + Uri.EscapeDataString("dkk") +
"&order_id=" + Uri.EscapeDataString(orderId) +
"&description=" + Uri.EscapeDataString(description);
var client = new RestClient(url);
如果描述中包含空格,例如:
var description = "Årligt medlemskab";
编码后会得到类似这样的查询参数:
description=%C3%85rligt%20medlemskab
注意事项
- 第一个查询参数前使用
?,后续参数之间使用&。 - 只编码参数值,不要对整个 URL 调用
Uri.EscapeDataString()。 - 如果
order_id有固定格式,应使用字符串保存,尤其是可能包含前导零时。 - 如果接口要求 HTTPS,应将地址改为
https://。是否必须使用 HTTPS,以该支付 API 的实际要求为准。 - RestSharp 不同版本的构造函数和执行方法可能略有差异,但都可以通过
AddQueryParameter()添加查询参数。 - 调试器中出现
%20、%C3%85等内容通常只是正常的 URL 编码,并不表示 URL 有误。
备注:内容仅供参考。
