Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用POST通过Ajax发送JSON字符串需要什么setRequestHeader?_Ajax_Json_Post - Fatal编程技术网

使用POST通过Ajax发送JSON字符串需要什么setRequestHeader?

使用POST通过Ajax发送JSON字符串需要什么setRequestHeader?,ajax,json,post,Ajax,Json,Post,全部, 我想使用带有POST的Ajax请求向我的服务器发送一个大的ish JSON字符串。我以前没有做过Ajax+POST(仅GET),所以我在网上查找了一些信息。让我感到困惑的是,一些参考资料说包括这三行: request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); request.setRequestHeader("Content-length", params.length); request

全部,

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

request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", params.length);
request.setRequestHeader("Connection", "close");
其他人只说使用第一种(
内容类型
)。那么,这三个是必要的吗?它们是做什么的?

当您“打开”对象时执行此操作:

request.open(“POST”,);
内容类型 这向服务器指示您在请求正文中发送的数据类型(即POST数据)。 问题
应用程序/x-www-form-urlencoded
中的值用于提交HTML表单,其中输入数据以键值形式发送,例如:

xmlHttp.send("firstName=bob&lastName=Smith&age=43")
这些值应为(也称为百分比编码),以防止任何特殊字符破坏格式。如果在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"}');
使用这种方式,您应该将内容类型设置为
application/json
,但大多数服务器都不会这样处理它,因为就HTTP请求而言,它只是文本数据。在服务器端,您需要访问原始POST数据才能获得JSON。大多数服务器端语言都允许您访问原始post数据

内容长度 与内容类型一样,设置内容长度是一种很好的做法。它告诉服务器您要发送多少数据,从而使服务器更容易知道何时收到所有数据。也就是说,如果没有设置,通常不会导致问题,但是W3文档声明应该使用它

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

总结 总之,不需要连接,应该使用内容长度<应该使用代码>内容类型,但根据服务器和服务器端代码的不同,可能不需要这样做


xmlHttp.send(“{”firstName:“bob”,“age:“43”}”);这将导致一个空的$_POST数组,您需要访问原始POST数据(googlephp原始POST数据)。您不能使用
$\u POST
,因为这是用于表单编码的数据,如'firstName=bob&age=43'。
xmlHttp.send('{"firstName":"bob","age":"43"}');