如何避免在 RestSharp 中转义字符?

How to avoid escaping character in RestSharp?

我正在编写一个小型应用程序,它通过 REST API 将数据发送到服务器,就像简单的 URL 调用一样。我使用 RestSharp 库来执行此操作。我的问题是,我发送的某些数据字符串包含 / 字符。 我不能让角色保持原样,因为调用的 URL 将无效。但是当我用 %2F 替换它时(然后在服务器端翻译回),RestSharp 再次替换 % 字符,给出 %252F。由于服务器缺少反斜杠,Rest 调用失败。

我有 searched the web 但没有找到解决此问题的有效方法。您知道如何在不使用不同的库并自己重写的情况下解决它吗?此外,不使用反斜杠也不是一个选项。

我的代码在这里:

using RestSharp;  //Version 104       

private string RestRequest(string URL, RestSharp.Method Method)
{
    var Client = new RestClient();
    Client.Authenticator = new HttpBasicAuthenticator(ID, Password);
    var Request = new RestRequest(URL, Method);
    IRestResponse Response = Client.Execute(Request);
    return Response.Content;
}

传递给函数的样本URL:

htp://localhost:8080/api/jsonws/knowledge-base-portlet.kbarticle/add-kb-article/portlet-id/1_WAR_knowledgebaseportlet/parent-resource-class-name-id/20704/parent-resource-prim-key/20200/title/SomeTitle/url-title/%2FTitle/content/SomeContent

在窥探了 Resharper 的 Github 问题后,像这样 one,看来你必须使用 RestRequest.AddURLSegment()。使用 RestSharp v. 104.0.0

进行测试
var url = "http://localhost:4422/api/jsonws/knowledge-base-portlet.kbarticle/add-kb-article/portlet-id/1_WAR_knowledgebaseportlet/parent-resource-class-name-id/20704/parent-resource-prim-key/20200/title/SomeTitle/url-title/{segment}/content/SomeContent";

var Client = new RestClient();
var Request = new RestRequest(url,Method.GET);
Request.AddUrlSegment("segment", "%2Ftitle");

我不知道你是否可以传递多个参数。如果不能,最简单的情况是按 %2F 拆分并连接多个参数。像这样:

private string RestRequest(string URL, RestSharp.Method Method)
{
    var Client = new RestClient();

    string requestUrl;

    bool hasBackslashArgument = ParseEncodedBackSlash(URL, out requestUrl);

    RestRequest request;
    if (hasBackslashArgument)
    {
        request = new RestRequest(requestUrl, Method);
        request.AddUrlSegment("segment", "%2F");
    }
    else
    {
        request = new RestRequest(URL, Method);
    }

    IRestResponse response = Client.Execute(request);
    return response.Content;
}

private bool ParseEncodedBackSlash(string url, out string preformattedString)
{
    preformattedString = null;

    var urlSegments = url.Split(new string[] { "%2F" }, StringSplitOptions.None);

    if (urlSegments.Length == 0) return false;

    preformattedString = string.Join("{segment}", urlSegments);
    return true;
}