Ajax GET请求正常运行。但我必须使用POST,因为我希望发送更多的数据,对GET来说太多了。
环境:Apache 2,Debian 9(从头开始),jQuery 3.2.1,没什么特别的。
我将问题解决了这段代码:
客户端
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="de">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Ajaxtest</title>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
</head>
<body>
<script language="JavaScript">
<!--
$.ajax({
url: 'ajaxtest2.php',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
type: 'POST',
data: {testdata: 'here I am'},
success: function (resp) {
console.log(resp);
},
});
-->
</script>
</body>
</html>
服务器
<?php
ini_set('error_reporting', E_ERROR);
header('Content-type: application/json');
header('HTTP/1.1 200 OK');
print json_encode(
array(
'method'=>$_SERVER['REQUEST_METHOD'],
'get'=>$_GET['testdata'],
'post'=>$_POST['testdata'])
);
exit();
?>
通过GET发送ajax调用时我只会更改
type: 'POST'
到
type: 'GET'
这在控制台上给了我这个结果:
{方法:“获取”,获取:“我在这里”,发布:null}
这就是你所期望的。
但是当我通过POST调用时,我得到:
{method:“POST”,get:null,post:null}
服务器理解POST请求但不提供任何值。
我尝试了不同的方法来包含目标网址,正如一些人所建议的那样具有相同的结果
url: 'ajaxtest2.php'
url: './ajaxtest2.php'
url: './ajaxtest2.php/'
他们都没有区别:$ _POST保持空白。
我还在服务器上记录了 get_defined_vars(),但$ _POST保持为空,并且在转储变量中的任何地方都没有'的痕迹。 。 / p>
没有.htaccess混合网址重写等。 我还能做什么?
答案 0 :(得分:1)
我的评论的长期答案是有效的:
您尝试使用contentType:
将数据发送到服务器application/json; charset=utf-8
而不是发送POST数据的默认和规范:
application/x-www-form-urlencoded; charset=UTF-8
在服务器端,它没有将contentType作为表单帖子,而是作为application/json
。这意味着没有数据放入$ _POST变量供php使用。
GET是一个不同的故事,因为该数据位于URL中,而不是在正文中。
对于ajax调用,编码类型应始终为utf-8,因此这也不是问题。
您通常不希望将json数据发送到 这样的服务器 。它只适用于将数据发送到期望在接受时解析的原始json数据的应用程序。对于PHP服务器,它需要“表单数据”(否则您需要阅读php://input
,请参阅下面的底部参考URL。)
希望有助于消除困惑。
更多信息: http://api.jquery.com/jquery.ajax/(contentType信息) https://forum.jquery.com/topic/ajax-with-contenttype-application-json(上一篇文章很有帮助)