Ajax API 调用 Access-Control-Allow-Origin。来源不允许访问[重复]

问题描述 投票:0回答:1

我已经阅读了我能找到的关于该主题的所有可能的链接,但我仍然无法让它工作。

我正在向 API(在另一个域上)发出 AJAX 请求(从我的域),但我在控制台日志中得到的只是(显然我已经修改了排除任何域等):

XMLHttpRequest 无法加载 https://[APIPROVIDER]/something.json?options。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问来源“http://[MYDOMAIN].com”。

这是我的代码:

$(document).ready(function() {
function step1(){
    $.ajax({
        url: 'getit.php',
        method: 'get',
        dataType : 'json',
        success: function(data){
            step2(data.url);
        },
        error: function(jqXHR, status, error) {
            console.log(error);
        }
    });
}
function step2(url){
    $.ajax({
        url: url,
        type: 'get',
        dataType : 'json',
        success: function(data){
            console.log(data);
        },
        error: function(xhr, status, error) {
            console.log(error);
        }
    });
}
step1();
});

我已经尝试过,

ajaxSetup
(设置标题),但没有帮助。
我试过了,
headers: { 'Access-Control-Allow-Origin': '*' }

我已经尝试过
crossDomain: true

我尝试删除
dataType : 'json'

就像我说的,这慢慢让我发疯。主要是因为这是阻止我继续前进并提出回应的唯一因素。而且距离如此之近,无论我做什么,我都会不断收到该错误。我读过几篇关于 CORS、标题中的 Access-Control-Allow-Origin 的文章。我仍然不明白为什么会出现此错误。

非常感谢这里的任何帮助! /绝望

javascript jquery ajax access-control
1个回答
0
投票

我不得不承认,我对 AJAX 的整个 CORS/Access-Control-Allow-Origin 仍然有点困惑(根据我的理解,这是客户端使用 jQuery 调用的结果。即因为服务器端域名不再“有效”)。但我最终使用 PHP 代理让它工作。这就是我最终得到的结果(对于我自己的符号,以及其他遇到同样问题的人)。

注意!“关键”部分是针对我自己的需求的(我只是想向可能对这一切不熟悉的人完整地展示代码)。也就是说,这里要解决的问题是代理部分,在服务器端进行调用并使用正确的标头发送请求。

jQuery/AJAX

$(document).ready(function() {
    function step1(){
        $.ajax({
            url: 'key.php', //get the API key. Remember to check path for key
            method: 'get',
            dataType : 'json',
            success: function(data){
                step2(data.key); //start step2 and send the key
            },
            error: function(jqhxr, status, error) {
                console.log(error);
            }
        });
    }
    function step2(key){
        var apiCall = '[APIURL]';
        $.ajax({
            beforeSend: function(jqxhr, settings) { //send request via PHP proxy. Remember to check path for proxy
                settings.url = 'proxy.php?r=' + encodeURIComponent(settings.url);
            },
            url: apiCall,
            type: 'get',
            dataType : 'json',
            data: {
                apikey: key
            },
            success: function(data){
                // do something with response
            },
            error: function(xhr, status, error) {
                console.log(error);
            }
        });
    }
    step1(); //initiate everything
});

PHP 获取密钥

<?php
    require_once('[MY_ABS_PATH_ON_SERVER]/key.php'); //Store API Key outside of public domain for security purposes
?>

PHP 密钥(在服务器上可公开访问的文件夹之外)

<?php
    $key = '[MY_API_KEY]';

    $arrvars = array(
        'key' => $key
    );

    echo json_encode($arrvars);
?>

PHP 代理

<?php

    $url = $_GET["r"];

    $ch = curl_init($url);
    $options = array(
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_RETURNTRANSFER => true
    );
    curl_setopt_array( $ch, $options );
    $response = curl_exec($ch);
    curl_close($ch);    

    header("Content-Type: application/json; charset=utf-8");
    header("Access-Control-Allow-Headers: X-Requested-With");
    header("Access-Control-Allow-Methods: GET, OPTIONS");
    header("Access-Control-Allow-Origin: [MYDOMAIN]");


    echo($response);
?>

我想我只是需要睡一会儿......我已经盲目地盯着这件事太久了。

© www.soinside.com 2019 - 2024. All rights reserved.