1

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

这里有什么问题?可能是什么问题?

4

3 回答 3

3

你不能发出 jsonp POST 请求,jsonp 只能用 GET 完成,这就是为什么所有数据都在 $_GET 中的原因。

于 2013-01-27T07:39:53.463 回答
3

JSONP 不适用于 POST 请求。JSONP 的工作原理是调用者生成一个带有 url 的脚本标记,希望生成一些脚本,根据需要使用传递的数据调用回调函数。如果您想要真正的跨域发布,则必须使用处理 OPTIONS 请求的东西来实现跨域资源共享 (CORS) 功能(可能像http://remysharp.com/2011/04/21/getting-cors -working/,但我承认,我什至没有完全扫描它,我只是看了看它,看看它可能记录了基本的、必要的功能)。

于 2013-01-27T07:40:27.353 回答
2

由于您使用的是 jsonp 格式,因此您已发送 JSON 格式。在数据之前尝试json_encodeecho

还要记住,当您进行跨域 jsonp 调用时,JSONP 不是 AJAX,它只是一个动态脚本元素。您不能使用动态脚本元素进行 POST。没有地方放POST数据。所以你将不得不使用GET方法。

另请记住,您可以使用以下格式

$.getJSON(url + "?callback=?", null, function(data) {

});

阅读更多

于 2013-01-27T07:37:04.157 回答