如何发送带有查询字符串的 URL 作为查询字符串

Posted

技术标签:

【中文标题】如何发送带有查询字符串的 URL 作为查询字符串【英文标题】:How do I send a URL with Query Strings as a Query String 【发布时间】:2012-05-12 22:50:54 【问题描述】:

我正在执行从一个页面到另一个页面的重定向以及从第二个页面到第三个页面的另一个重定向。我有第一页的信息,第二页没有使用,但必须转移到第三页。是否可以将第三页的 URL 及其查询字符串作为查询字符串发送到第二页。这是一个例子:

Response.Redirect("MyURL1?redi=MyURL2?name=me&ID=123");

我的问题是作为查询字符串发送的 URL 有两个查询字符串变量,那么系统如何知道 & 之后的内容是第二个 URL 的第二个变量而不是第一个 URL 的第二个变量?谢谢。

【问题讨论】:

您是否考虑过为此使用 Session 变量? 【参考方案1】:
using System.IO;
using System.Net;

static void sendParam()


    // Initialise new WebClient object to send request
    var client = new WebClient();

    // Add the QueryString parameters as Name Value Collections
    // that need to go with the HTTP request, the data being sent
    client.QueryString.Add("id", "1");
    client.QueryString.Add("author", "Amin Malakoti Khah");
    client.QueryString.Add("tag", "Programming");

    // Prepare the URL to send the request to
    string url = "http://026sms.ir/getparam.aspx";

    // Send the request and read the response
    var stream = client.OpenRead(url);
    var reader = new StreamReader(stream);
    var response = reader.ReadToEnd().Trim();

    // Clean up the stream and HTTP connection
    stream.Close();
    reader.Close();

【讨论】:

【参考方案2】:

您必须对作为参数传递到重定向 URL 中的 URL 进行编码。像这样:

MyURL = "MyURL1?redi=" + Server.UrlEncode("MyURL2?name=me&ID=123");

这将创建一个没有双 '?' 的正确 url和 '&' 字符:

MyURL1?redi=MyURL2%3fname%3dme%26ID%3d123

参见 MSDN:HttpServerUtility.UrlEncode Method

要从此编码的 url 中提取重定向 url,您必须使用 HttpServerUtility.UrlDecode 再次将其转换为正确的 url。

【讨论】:

URL 解码/编码定义不明确。每个操作系统/浏览器/服务器都有自己的怪癖。 .Netv1.1 和 .Netv2.0 之间的实现发生了变化,所以我建议遵循@JulioHM 的建议,并对需要在查询参数中的 URL 使用 base64。 bytes.com/topic/asp-net/answers/… 您提到的HttpServerUtility.UrlDecode 可以通过网络表单中的HttpContext.Current.Server.UrlDecodeServer.UrlDecode 访问。你也可以使用静态HttpUtility.UrlDecode【参考方案3】:

我发现在发送之前在 Base64 中编码查询字符串参数很有帮助。在某些情况下,当您需要发送各种特殊字符时,这会有所帮助。它不会产生好的调试字符串,但它会保护您发送的任何内容不与任何其他参数混合。

请记住,解析查询字符串的另一方也需要解析 Base64 才能访问原始输入。

【讨论】:

按照建议,在 C# 中使用 base64 - Convert.FromBase64String、Convert.ToBase64String 和 System.Text.Encoding.ASCII.GetString。在 javascript 中也需要它并使用 btoa 和 atob【参考方案4】:

您的查询字符串应如下所示:

MyURL1?redi=MyURL2&name=me&ID=123

检查:http://en.wikipedia.org/wiki/Query_string

你应该有一个?符号和所有参数用 & 连接。如果参数值包含特殊字符,只需UrlEncode 他们。

【讨论】:

这看起来像是 MyURL1 的三个查询字符串。我希望 name 和 ID 是 MyURL2 的查询字符串。 然后在重定向之前访问当前 QueryString 并将参数传递给下一个 QueryString(您感兴趣的那些)。 @DovMiller 我只是说 QueryString 应该是什么样子。这取决于您如何获取要传递到下一个地址的 QueryString - 它只是一个字符串 - 因此您可以使用子字符串等,或者只访问 QueryString 字典中的参数值。也许,我不完全理解你想要达到的目标。

以上是关于如何发送带有查询字符串的 URL 作为查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

Kentico 是不是允许带有问号的查询字符串?

如何使用 $.ajax 发送 JSON 而不是查询字符串?

如何将查询字符串作为获取参数快速发送

在JAX-RS中的查询参数中转义`%`符号

如何使用带有字符串作为输入的where子句编写select查询?

带有查询字符串的 Laravel 路由 url