在理解如何使用 flurl 在请求中传递编码数据时遇到了一些麻烦。我们有一个如下所示的 api:
https://servicename.com/domain/api/{identifier}?parameter=value
在某些特定情况下,我们的标识符包含正斜杠 /
我们正在使用以下代码构建请求:
var clientRequest = this.configuration.Client
.Request(this.configuration.RequestPath)
.AppendPathSegment(identifier)
.WithHeader("Requesting-System", "api");
我们称之为:
using (var response = await clientRequest.GetAsync(cancellationToken))
{
return await response.Content.ReadAsStringAsync();
}
现在。采用直接的方法,即使用正斜杠传入标识符;比方说 abc/123。上面的代码生成一个clientRequest,其路径为
https://servicename.com/domain/api/abc/123?parameter=value
预期会失败并出现 400 错误。因此,根据我们的 api 规范,解决方案是将正斜杠编码为 %2F,并将其传递到 url。值得庆幸的是,Flurl 在理论上通过允许 AppendPathSegment 方法中的可选参数使这变得非常容易,这将导致编码。所以我们修改上面的使用
.AppendPathSegment(identifier, true)
它生成一个路径为的clientRequest
https://servicename.com/domain/api/abc%2F123?parameter=value
正是我期望看到的。如果我使用邮递员调用此 URL,那么我可以看到我期望从 API 得到的正确响应。
但是,当我使用 GetAsync 方法(同上)调用它时,我仍然会收到 400 Sub-Resource notrecognized 错误;在我的日志中,我可以看到实际请求是
https://servicename.com/domain/api/abc/123?parameter=value
在服务调用过程中是否有 Flurl 解码 url 字符串的点?如果是这样,我如何传递 %2F ?
已经尝试过双重编码,让请求包含标识符abc%252F123。鉴于上述情况,我预计这将被解码为 abc%2F123,然后将其发送到我们的 API。但在这种情况下,不会发生解码,请求 url 是
https://servicename.com/domain/api/abc%252F123?parameter=value
非常感谢您的帮助。