【问题标题】:why url is not constructed as expected in GET request?为什么在 GET 请求中没有按预期构造 url?
【发布时间】:2014-05-28 19:55:54
【问题描述】:

我在 html 页面中有以下表单

<form name="input" action="sayHello1.jsp?param1=test1" method="get">
Username: <input type="text" name="user">
<input type="submit" value="Submit">
</form>

我在文本框中输入值“test”并提交。

我希望在浏览器中看到提交的 URL

http://localhost:8080/helloWorld/sayHello1.jsp?param1=test1&user=test

但我将网址视为

http://localhost:8080/helloWorld/sayHello1.jsp?user=test 

为什么会这样?

【问题讨论】:

  • 你用的是什么浏览器?这与 Java 无关。
  • 无论如何我都会使用隐藏值,但这并不能回答问题。

标签: web-applications browser httprequest get-request


【解决方案1】:

HTML specification 状态

当从元素提交者提交表单元素表单时 (通常是一个按钮),可选择设置脚本提交标志, 用户代理必须运行以下步骤:

[...]

  • 令查询为使用 application/x-www-form-urlencoded 编码算法,解释为 US-ASCII 字符串。

  • 让destination 是一个新的URL,它与动作相同,除了 它的组件被查询替换(添加一个 U+003F QUESTION MARK 字符 (?)(如果适用)。

基本上,它将现有的查询字符串替换为从表单参数生成的新查询字符串。

您的浏览器符合规范。

【讨论】:

  • +1。有趣的是,HTML 4 规范说 如果方法是“get”并且操作是 HTTP URI,则用户代理会获取操作的值,并附加一个“?”到它,然后附加表单数据集,使用“application/x-www-form-urlencoded”内容类型进行编码。 如果操作已经包含查询字符串,这显然会导致 URL 不正确,而我猜测在这种情况下行为是未定义的。 HTML5 规范更加清晰。
  • 但是通过发布请求,我看到了正确的网址,即“localhost:8080/helloWorld/sayHello1.jsp?param1=test1
  • @user3222249 如果您点击链接,GET 和 POST 会有不同的行为。对于 POST,浏览器保持原样。
【解决方案2】:

表单的实现似乎是重写查询字符串(而不是合并它)。要获得所需的行为,请在表单中添加 &lt;input type="hidden" name="param1" value="test1"&gt;,不要尝试向操作 URL 添加值。

根据this answer,我们应该预料到这种行为。

因此,您的浏览器将丢弃 URI 中现有的“?...”部分,并根据您的表单将其替换为新部分。

【讨论】:

  • 但这仅适用于 Get 请求,不适用于 POST。对吗?
  • 对。我认为 Sotirios 的答案(以及规范,以及我的答案中链接的答案)在这一点上很清楚。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 2018-04-24
  • 1970-01-01
  • 2018-09-03
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
相关资源
最近更新 更多