我需要实现跨域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!!!');
}
});
}
和server-script,其中发送数据:
<?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,它是数组(0),$ _GET包含所有发送数据!
这里有什么问题?出了什么问题呢?
答案 0 :(得分:3)
您无法发出jsonp POST请求,jsonp只能通过GET完成,这就是为什么所有数据都在$ _GET中。
答案 1 :(得分:3)
JSONP无法通过POST请求工作。 JSONP由调用者生成带有url的脚本标记,希望生成一些脚本,根据需要调用传递数据的回调函数。如果你想要真正的跨域发布,你必须实现跨源资源共享(CORS)功能,以处理OPTIONS请求(可能与http://remysharp.com/2011/04/21/getting-cors-working/一样,但我承认,我甚至没有完全扫描它,我只是看着它看到可能的文件基本的,必要的功能)。
答案 2 :(得分:2)
由于您使用的是jsonp格式,因此您已发送JSON格式。在echo
数据之前尝试json_encode。
还要记住,当你进行跨域jsonp调用时,JSONP不是AJAX,它只是一个动态脚本元素。您无法使用动态脚本元素执行POST。没有地方可以放置POST
数据。所以你必须使用GET
方法。
另请注意,您可以使用以下格式
$.getJSON(url + "?callback=?", null, function(data) {
});