【问题标题】:Javascript: submit form specyfing content typeJavascript:提交表单指定内容类型
【发布时间】:2015-02-14 14:01:16
【问题描述】:

我使用此代码提交表单

var form = $("#some-form");
form.attr("action", url);
form.attr("method", "post");
form.attr('target', '_blank');
form.submit();

问题是发送的请求有Content-Type: application/x-www-form-urlencoded,它(如here所述)将\n形式的文本区域中的字符编码为%0D%0A,在服务器端解码为\r\n,造成很多麻烦。

我希望服务器接收\n,所以我需要另一个内容类型。

所以,问题是:

  • 我应该使用什么内容类型?
  • 我应该如何更改我的 javascirpt 以使用该内容类型?

编辑

我试过enctype="multipart/form-data",但它以同样的方式编码换行符。

【问题讨论】:

  • 唯一的其他内容类型是 multipart/form-data 但这是用于发布文件的。
  • 为什么需要在服务器上将换行符编码为\n?
  • 系统的一些其他组件不接受\r\n。即使不是这种情况,当前的行为也很糟糕,因为传输组件 (HTTP) 限制了最终用户的表达能力:用户无法将“foo\rbar\r\n”插入到表单中,以便服务器接收到准确的价值。

标签: javascript jquery forms http content-type


【解决方案1】:

使用xmlHTTPrequest (AJAX)

它是异步的,将数据提交到页面。另外,您可以指定标题。 \n 应该以 \n 的形式到达带有 AJAX 的服务器上。

var request = new XMLHttpRequest;
request.method = "post";
request.open(request.method, [url] , true); //true is asynchronous

//this part here matters. regular form data with charset UTF-8
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded ; charset=UTF-8");
request.setRequestHeader("Connection", "close");

request.onreadystatechange = [trackingfunction]; //You can see which data is returned from the post.

request.send([arg]); //send the post arguments here!

这似乎在我的机器上工作。将数据保存到文件中,记事本不会将\n 注册为换行符。 LF 转换为 CR LF 时应该是这样的

【讨论】:

  • 在我的情况下,AJAX 不是一个选项,我想在新选项卡中提交表单。
  • @Bartosz Marcinkowski 你能帮我澄清一下在新标签中提交的内容吗?
  • AJAX 表示我的请求是用 Javascript 构造的,响应由 Javascript 处理。提交表单意味着(在我的情况下)Javascript 告诉浏览器提交表单(就像用户单击表单的提交按钮一样),然后响应包含 HTML,而不是 JSON 数据,并且(在我的case) 浏览器在新选项卡中打开收到的 HTML。
  • 其实Ajax最初是为了接收xml而设计的。 JSON 也是可能的。但是,您可以在服务器上构建一个页面,将 HTML 发送回并使用 AJAX 将其加载到新选项卡中?通过控制 html 输出客户端的额外好处,有效地做同样的事情。
  • 我必须用表单数据手动填充 JSON 并修改我的服务器端视图以接受 JSON 而不是 POST 数据。那不一样。
猜你喜欢
  • 2014-07-01
  • 1970-01-01
  • 2012-03-23
  • 2019-03-21
  • 2013-02-24
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多