<p>来自 Mozilla 的文档:</p> <blockquote> 如果 URL 查询参数没有值,它是否有效?

当客户端直接连接到服务器时,客户端的 IP 地址 发送到服务器(通常写入服务器访问日志)。 但是如果客户端连接通过任何正向或反向

http://example.com/foo?bar这样的 URL 有效吗?

代理,服务器只能看到最终代理的 IP 地址,即 如果最终代理是一个 负载平衡器,它是与服务器相同的安装的一部分。

我在找一些官方文件的链接。一个简单的“是”或“不是”的回答不能解决轶事证据。

101835 次浏览

如果只是想检查参数是否存在,这是一种方法。

所以是的,任何东西在问号之后都是有效的。您的服务器可能会有不同的解释,但是 传闻而已,您可以看到一些语言将其视为一个布尔值,如果列出该值,则为 true。

使用 <iomanip>std::hex。如果你打印,只要发送到 std::cout,如果没有,然后使用 std::stringstream

std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );
感兴趣的 ps 是 std::oct(八进制)和 std::dec(回到十进制)。

你可以用 << "0x"或者任何你喜欢的东西来预先设置第一个 <<

您可能会遇到的一个问题是,这会产生表示它所需的确切数字量。你可以使用 setfillsetw来规避这个问题:

stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;

其他感兴趣的操纵是 std::oct(八进制)和 std::dec(回到十进制)。

您可能会遇到的一个问题是,这会产生表示它所需的确切数字量。你可以使用 setfillsetw来规避这个问题:

stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;

最后,我建议这样一个函数:

template< typename T >
std::string int_to_hex( T i )
{
std::stringstream stream;
stream << "0x"
<< std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}

我愿意:

int hex = 10;
std::string hexstring = stringFormat("%X", hex);

它们是完全有效的。你可以认为他们相当于一个肌肉发达的大块头,静静地站在暴徒信使的后面。这家伙没有名字,也不说话,但他的存在就传达了信息。

    看看来自 iFreilicht 的 那么答案和所需的模板头文件从这里 GIST 要点

  • 对 URI RFC 有效
  • 在另一个 URI 中)。

  • 服务器端框架/代码可能接受

3.4查询

查询组件包含非分层数据,这些数据与 路径组件中的数据(第3.3节) ,用于识别一个

URI RFC不强制要求查询字符串的格式。虽然查询字符串通常会携带名称-值对,但并不需要这样做(例如,它通常会包含另一个 URI)。

3.4查询

URI 方案和命名权限范围内的资源

查询组件包含非分层数据,这些数据与 路径组件中的数据(第3.3节) ,用于识别一个 URI 方案和命名权限范围内的资源 (如有的话)。

(如有的话)。

... 但是,作为查询组件

... 但是,作为查询组件 经常用于携带识别信息的形式 经常用于携带识别信息的形式 “ key = value”对和一个常用的值是对 “ key = value”对和一个常用的值是对 另一个 URI,..。

另一个 URI,..。

HTML 确定通过 HTTP GET 提交的表单应该将表单值编码为表单中的名称-值对”?Key1 = value1 & key2 = value2...”(正确编码)。查询字符串的解析取决于服务器端代码(例如 Javaservlet 引擎)。

HTML 确定通过 HTTP GET 提交的表单应该将表单值编码为表单中的名称-值对”?Key1 = value1 & key2 = value2...”(正确编码)。查询字符串的解析取决于服务器端代码(例如 Javaservlet 引擎)。

你不能确定你使用的是什么服务器端框架(如果有的话) ,但是你的服务器端框架可能会假设查询字符串总是在名称-值对中,并且它可能会被不是那种格式的查询字符串卡住(例如 ?bar)。如果解析查询字符串的是您自己的自定义代码,那么您只需确保处理该查询字符串格式。如果它是一个框架,那么您需要查阅您的文档或者简单地测试它,看看它是如何处理的。

isindex废弃了 HTML5的魔法 name

这个不被推荐的特性允许表单提交生成这样的 URL,进一步证明它对 HTML 是有效的。例如:

<form action="#isindex" class="border" id="isindex" method="get">
<input type="text" name="isindex" value="bar"/>
<button type="submit">Submit</button>
</form>

生成类型为:

?bar

标准: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

然而,如上所述,isindex已被弃用: https://stackoverflow.com/a/41689431/895245

如果条目的名称是“ isindex”,它的类型是“ text”,并且这是表单数据集中的第一个条目,那么添加结果值并跳过这个条目的其余子步骤,然后转到下一个条目(如果有的话) ,否则就是整个算法中的下一步。

Isindex 标志仅供遗留使用。符合 HTML 文档的表单不会生成需要用此标志集解码的有效负载。

最后一次使用 支持 isindex 是 HTML3。它在 HTML5中是为了提供更容易的向后兼容性。

只要看看我的解决方案,[1],我逐字 [2]从我的项目复制。我的目标是在我的实际需求中结合灵活性和安全性: [3]

  • 没有添加 0x前缀 : 呼叫者可以自行决定
  • 图书馆的支援

    库中对这种 URI 格式的支持各不相同,但有些库确实提供了遗留支持,以方便使用 isindex

  • 自动 宽度扣除: 少打字
  • Perl URI.pm(特殊支持)

  • 显式宽度 控件: 为格式化而扩大,(无损)为节省空间而缩小
  • 能够处理 long long
  • 有些库(如 Perl 的 URI)提供了解析这类结构的方法

    $uri->query_keywords
    $uri->query_keywords( $keywords, ... )
    $uri->query_keywords( \@keywords )
    Sets and returns query components that use the keywords separated by "+" format.
    

    Js url(没有特殊支持)

    作为另一个更为常见的例子,node.js采用正常的路由并简化解析

    • 一根绳子
    • 或者,键和值的对象(使用 parseQueryString)
  • 仅限于 整数类型: 通过无声转换避免意外
  • 大多数其他 URI 解析 API 都遵循类似的内容。

    • 类似的实现,但只返回查询的字符串
  • 没有硬编码限制
  • #include <string>
    #include <sstream>
    #include <iomanip>
    
    
    /// Convert integer value `val` to text in hexadecimal format.
    /// The minimum width is padded with leading zeros; if not
    /// specified, this `width` is derived from the type of the
    /// argument. Function suitable from char to long long.
    /// Pointers, floating point values, etc. are not supported;
    /// passing them will result in an (intentional!) compiler error.
    /// Basics from: http://stackoverflow.com/a/5100745/2932052
    template <typename T>
    inline std::string int_to_hex(T val, size_t width=sizeof(T)*2)
    {
    std::stringstream ss;
    ss << std::setfill('0') << std::setw(width) << std::hex << (val|0);
    return ss.str();
    }
    

    正如所有其他答案所描述的,它对于检查是完全有效的,特别是对于布尔类型的东西

    下面是一个按名称获取查询字符串的简单函数:

    function getParameterByName(name, url) {
    if (!url) {
    url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
    results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
    }
    

    [1] 基于 科内尔 · 基谢莱维奇的答案

    现在,如果想检查查询字符串是否存在,可以执行以下简单操作:

    var exampleQueryString = (getParameterByName('exampleQueryString') != null);
    
    [2] 只有德文 API 文档被翻译成英文。

    如果函数找不到查询字符串,则 exampleQueryStringfalse,否则为 true

    要查找这一点,正确的资源是 RFC6570。请参阅3.2.9节,其中示例中的空参数如下所示。

     Example Template     Expansion
    {&x,y,empty}       &x=1024&y=768&empty=