跨域请求,但POST为空

时间:2013-01-27 07:28:29

标签: php javascript ajax cross-domain jsonp

我需要实现跨域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包含所有发送数据!

这里有什么问题?出了什么问题呢?

3 个答案:

答案 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) {

});

Read more