Javascript 跨域请求的jQuery PHP问题

Javascript 跨域请求的jQuery PHP问题,javascript,php,jquery,ajax,json,Javascript,Php,Jquery,Ajax,Json,我相信以前有人问过这个问题,但给出的答案不足以说明我的代码错在哪里。如果存在类似的问题,我道歉;我花了几个小时搜索,找不到解决方案 我用PHP构建了一个小型RESTful服务,将数据库信息引入我的站点。我能够成功地从浏览器和Fiddler进行调用,但是当我试图从$.ajax()请求数据时,我突然崩溃了。首先,让我发布PHP代码: 我在打电话http://api.horodyski.me class ApiController { protected $endpoint = '';

我相信以前有人问过这个问题,但给出的答案不足以说明我的代码错在哪里。如果存在类似的问题,我道歉;我花了几个小时搜索,找不到解决方案

我用PHP构建了一个小型RESTful服务,将数据库信息引入我的站点。我能够成功地从浏览器和Fiddler进行调用,但是当我试图从
$.ajax()
请求数据时,我突然崩溃了。首先,让我发布PHP代码:

我在打电话
http://api.horodyski.me

class ApiController
{
    protected $endpoint = '';
    protected $method = '';
    protected $verb = '';
    protected $args = Array();

    public function __construct($request)
    {
        header("Access-Control-Allow-Orgin: *");
        header("Access-Control-Allow-Methods: GET");
        header("Content-Type: application/json");

        $this->args = explode('/', rtrim($request, '/'));
        $this->endpoint = array_shift($this->args);

        if (array_key_exists(0, $this->args) && !is_numeric($this->args[0])) { $this->verb = array_shift($this->args); }

        $this->method = $_SERVER['REQUEST_METHOD'];

        if($this->method != 'GET')
            throw new Exception("Unexpected Header");
        $this->request = $this->_cleanInputs($_GET);               

    }

    public function processAPI()
    {
        $class = $this->endpoint."Controller";
        if(class_exists($class))
        {
            $controller = new $class();
            return $this->_response($controller->getAllItems());
        }
        return $this->_response("No Endpoint: ".$this->endpoint, 404);
    }

    private function _response($data, $status = 200)
    {
        header("HTTP/1.1 ".$status." ".$this->_requestStatus($status));
        // $data comes back from controller in JSON format.
        return json_encode($data);
    }

    private function _cleanInputs($data)
    {
        $cleanInput = Array();
        if(is_array($data))
            foreach($data as $k => $v)
                $cleanInput[$k] = $this->_cleanInputs($v);
        else
            $cleanInput = trim(strip_tags($data));
        return $cleanInput;
    }

    private function _requestStatus($code)
    {
        $status = array(
            200 => 'OK',
            404 => 'Not Found',
            405 => 'Method Not Allowed',
            500 => 'Internal Server Error',
        );
        return ($status[$code]) ? $status[$code] : $status[500]; 
    }
} 
我已经尝试实现返回
jsonp
的jQuery调用,这就是我遇到的问题

请求来自
http://horodyski.me/v2
。下面的代码显示正常的json返回类型:

<p class="test"></p>
    <script>
        $(document).ready(function () {
            $.ajax({
                url: "http://api.horodyski.me/skills",
                method: "GET",
                dataType: 'jsonp',
                success: function (data) {
                    $("p.test").text(data);
                },
                error: function (xhr, textStatus, error) {
                    debugger;
                }
            });
        });
    </script>

$(文档).ready(函数(){ $.ajax({ url:“http://api.horodyski.me/skills", 方法:“获取”, 数据类型:“jsonp”, 成功:功能(数据){ $(“p.test”)。文本(数据); }, 错误:函数(xhr、textStatus、error){ 调试器; } }); });
我在错误回调中得到以下信息:

textStatus=“parseerror”
error=“jQuery210008879405278902885\u 1396911952892未被调用”

再说一次,提琴手没有表现出任何错误——我已经没有主意了。我是不是在PHP方面没有正确地处理它,还是我的jQuery搞砸了?也许我需要编辑我的
.htaccess
文件来处理jQuery在jsonp调用中发送的回调参数?我有点不知所措了,有什么建议吗


我可以打电话给
http://horodyski.me/api/skills
它可以与常规json一起工作,但我仍然无法让CORS正常工作。

我会选择CORS替代品,这将规范化浏览器之间的大部分差异。我和他有过最好的经历。在客户端,它与库无关,您可以使用jQuery XHR或任何其他库而不做任何更改。

要使用
JSONP
您的API需要能够处理它:使用JSONP,API必须返回一个方法调用,并将
JSON
数据作为参数。要调用的方法名通常可以使用类似于
jsonp
的参数指定(具体实现取决于您)。例如SO API:(
useData
是这里的回调方法名)注意:JSONP和CORS是单独的方法。要理解为什么JSONP由于缺少回调函数而失败,请参阅上面的链接。但是发布的代码还有另一个问题,服务器端是为CORS设置的,客户端使用的是JSONP。选择一个并在两侧实施。我认为在服务器上设置CORS后,将客户端更改为使用CORS将是最简单的。问题是浏览器/jQuery端,而不是服务器。以下是针对CORS的jQueryAjax请求:这是向前迈出的一步。至少连接的双方都在尝试做相同的事情…对于
访问控制允许源站
尝试发回源站顶级URL(
http://somewhere.com
——存储javascript文件的主机名),而不是“*”。