3

全部,

我想使用带有 POST 的 Ajax 请求向我的服务器发送一个大的 JSON 字符串。我之前没有做过 Ajax+POST(只有 GET),所以我在网上查找了一些信息。让我感到困惑的是,一些资源说包括这三行:

request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", params.length);
request.setRequestHeader("Connection", "close");

其他人只说使用第一个(Content-type)。那么,这3个有必要吗?他们在做什么?

4

2 回答 2

4

内容类型

这向服务器表明您在请求正文中发送的数据类型(即 POST 数据)。您问题application/x-www-form-urlencoded中的值用于提交 HTML 表单,其中输入数据以键值形式发送,例如:

xmlHttp.send("firstName=bob&lastName=Smith&age=43")

这些值应该是URL 编码(又名百分比编码),以防止任何特殊字符破坏格式。如果你在 POST 请求中发送这种类型的数据而不设置内容类型,大多数服务器都会检测到数据类型并无论如何都会处理它。设置它是一种很好的做法(不要产生歧义),即使它并不总是必需的。

JSON 数据可以作为 发送application/x-www-form-urlencoded,您只需使用一个键并将值设置为 JSON。

myData={"firstName":"bob","age":"43"}

上面的 JSON 应该是 URL 编码的,在 Javascript 中你可以使用encodeURIComponent(),我在示例中没有对其进行编码,目的是使它在这里可读。这是发送 POST 数据的最常见格式,大多数服务器端语言会自动将键值对解析为原生数组或某种结构。

或者,您可以将 JSON 作为请求正文直接发送,不带密钥或其他数据标签。例子:

xmlHttp.send('{"firstName":"bob","age":"43"}');

使用这种方式,您应该将 Content-type 设置为application/json但同样,大多数服务器将在没有它的情况下处理它,因为就 HTTP 请求而言,它只是文本数据。在服务器端,您需要访问原始 POST 数据以获取 JSON。大多数服务器端语言都可以让您访问原始帖子数据。

内容长度

与内容类型一样,最好设置内容长度。它告诉服务器您正在发送多少数据,因此服务器更容易知道何时收到所有数据。也就是说,如果没有设置它通常不会引起问题,但是 W3 文档声明它应该被使用。

连接:关闭

发送close连接标头向服务器表明您不支持,或者不想对请求使用持久连接。服务器可能会用一个Connection: Keep-alive标头进行响应,这并不告诉客户端保持连接打开,它只是向客户端指示它支持持久连接持久连接允许对多个请求重用相同的 TCP 连接,而不是为每个请求打开和关闭。无需在 ajax 请求中设置此标头。如果您不设置它,浏览器将自行决定并设置它。

概括

总而言之,Connection不需要,Content-length应该使用。Content-type应该使用,但取决于服务器和服务器端代码,它可能不需要。

于 2013-06-19T21:36:28.530 回答
0

您在“打开”请求对象时执行此操作:

request.open("POST", <url>);
于 2013-06-08T03:29:06.833 回答