所有
我想使用带有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个必要吗?他们做了什么?
答案 0 :(得分:4)
这向服务器指示您在请求正文中发送的数据类型(即POST数据)。
问题application/x-www-form-urlencoded
中的值用于提交HTML表单,其中输入数据以键值形式发送,例如:
xmlHttp.send("firstName=bob&lastName=Smith&age=43")
值应为URL Encoded(也称为编码百分比),以防止任何特殊字符破坏格式。如果您在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
标头进行响应,该标头不会告诉客户端保持连接打开,它只是向客户端指示它支持Persistent Connections。 Persistent connections允许为多个请求重用相同的TCP连接,而不是为每个请求打开和关闭。无需在ajax请求中设置此标头。如果您没有设置它,浏览器将决定并自行设置它。
总结一下,不需要Connection
,应该使用Content-length
。应该使用Content-type
,但根据服务器和服务器端代码,可能不需要它。
答案 1 :(得分:0)
您在“打开”request对象时执行此操作:
request.open("POST", <url>);