我需要实现一个跨域的POST请求。使用此代码,在同一域中一切正常。但是当我将后端移动到另一个域时 - 一切都停止工作了!因此,可能会有错别字。仅当错误与跨域请求相关时,才能存在。我尝试使用 ajax 和 JSONP 发送 POST 请求:
function requestToServer(url, success, myObjects)
{
$.ajax({
type: "POST",
crossDomain: true,
dataType: 'jsonp',
jsonp: 'jsonp_callback',
url: url,
data: "arrObjects=" + JSON.stringify(myObjects),
success: function(data)
{
success(data);
},
error: function()
{
alert('Server connection error!!!');
}
});
}
和服务器脚本,其中发送数据:
<?php
header('Access-Control-Allow-Origin: '.$_SERVER['HTTP_ORIGIN']);
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Headers: Content-Type');
include 'connection.php';
$arrObjects = json_decode($_POST['arrObjects']);
$title = $arrObjects->title;
$msg = $arrObjects->msg;
$lat = $arrObjects->lat;
$lon = $arrObjects->lon;
$query = "INSERT INTO `geo_markers` (`id`, `title`, `description`, `lat`, `lon`)
VALUES (NULL, '{$title}', '{$msg}', '{$lat}', '{$lon}')";
$res = mysqlQuery($query);
echo $_GET['jsonp_callback'].'({"success":true});';
mysql_close();
?>
但 _POST 美元是空的。但 _GET 美元的价值为 _POST 美元。如果我使用 var_dump 检查 $_POST,它是 array(0),$_GET 包含所有发送数据!
这是怎么回事?会是出了什么问题?
你不能发出 jsonp POST 请求,jsonp 只能用 GET 来完成,这就是为什么所有数据都在 $_GET 中。
JSONP 在 POST 请求下不起作用。 JSONP 的工作原理是调用方生成一个带有 url 的脚本标记,希望根据需要生成一些脚本,使用传递的数据调用回调函数。 如果你想要真正的跨域发布,你必须实现跨域资源共享(CORS)功能来处理OPTIONS请求(也许就像 http://remysharp.com/2011/04/21/getting-cors-working/一样,但我承认,我什至没有完全扫描它,我只是查看了它,看看可能记录了基本的,必要的功能)。
由于使用的是 jsonp 格式,因此已发送 JSON 格式。 在echo
数据之前尝试json_encode。
还要记住,当您进行跨域 jsonp 调用时,JSONP 不是 AJAX,它只是一个动态脚本元素。您不能使用动态脚本元素进行 POST。没有地方放置POST
数据。因此,您将不得不使用GET
方法。
另请记住,您可以使用以下格式
$.getJSON(url + "?callback=?", null, function(data) {
});
阅读更多