代码之家  ›  专栏  ›  技术社区  ›  Sebi

HttpUtility。UrlEncode意外输出

  •  0
  • Sebi  · 技术社区  · 9 年前

    我正在尝试对url进行编码,以便HttpWebRequest可以使用&等字符;。

    所以谷歌让我想到这一点:

    url = HttpUtility.UrlEncode(url);
    

    但这使得整个url无法使用。我收到状态错误:来自Web服务器的操作无效。

    我在iam之前使用编码得到了这个url:

    http://jira-test.myServer.de/rest/api/2/search?jql=labels = "F&E"
    

    编码后我得到了这个:

    http%3a%2f%2fjira-test.brillux.de%2frest%2fapi%2f2%2fsearch%3fjql%3dlabels+%3d+%22F%26E%22
    

    我做错了什么?在我看来,它不应该在http等之后替换//…或者有其他方法来处理这个问题吗?

    信息:

    Uri.EscapeDataString();
    

    给了我同样的结果。

    1 回复  |  直到 3 年前
        1
  •  2
  •   Douglas    9 年前

    您应该只编码查询字符串的值,而不是整个URI:

    var uri = "http://jira-test.myServer.de/rest/api/2/search?jql=" +
              HttpUtility.UrlEncode("labels = \"F&E\"");
    
    // Result: http://jira-test.myServer.de/rest/api/2/search?jql=labels+%3d+%22F%26E%22
    

    正确的构造方法:

    // Construct query string using HttpValueCollection, which handles escaping:
    var queryString = HttpUtility.ParseQueryString(string.Empty);
    queryString.Add("jql", "labels = \"F&E\"");
    
    // Combine base URI with query string through UriBuilder:
    var uriBuilder = new UriBuilder("http://jira-test.myServer.de/rest/api/2/search");
    uriBuilder.Query = queryString.ToString();
    
    // Get string representation:
    string uri = uriBuilder.ToString();
    
    // Result: http://jira-test.myserver.de:80/rest/api/2/search?jql=labels+%3d+%22F%26E%22