Javascript 通过xmlhttprequest连接到API服务器时出现问题

Javascript 通过xmlhttprequest连接到API服务器时出现问题,javascript,xmlhttprequest,Javascript,Xmlhttprequest,我正在尝试创建一个简单的web应用程序,它将连接到它们的API,首先进行身份验证,然后检索经过身份验证的用户的书签。不幸的是,我一直在使用连接到他们的服务,因为我在这个领域真的没有经验 我在文档身份验证过程的第2步失败,该过程获取请求令牌 到目前为止,我得到的是: var url = "https://getpocket.com/v3/oauth/request"; var data = "consumer_key=censored&request_uri=foo.bar/success

我正在尝试创建一个简单的web应用程序,它将连接到它们的API,首先进行身份验证,然后检索经过身份验证的用户的书签。不幸的是,我一直在使用连接到他们的服务,因为我在这个领域真的没有经验

我在文档身份验证过程的第2步失败,该过程获取请求令牌

到目前为止,我得到的是:

var url = "https://getpocket.com/v3/oauth/request";
var data = "consumer_key=censored&request_uri=foo.bar/success";

function post(url, data, parameters){
    var request;
    try{
        request = new XMLHttpRequest();
    }catch(e){
        request = false;
    }
    if(request !== false){
        request.open("POST", url, true);
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        // request.setRequestHeader("Access-Control-Allow-Origin", "*");
        request.send(data);
        request.onreadystatechange = function(){
            console.log(request.responseText);
        };
    }else{
        console.log("Couldn't create a new XmlHttpRequest Object");
    }
}

post(url, data);
我知道现代浏览器会阻止跨域请求,但我不知道如何在不使用代理的情况下修复它。文档中没有提到任何东西(或者它提到了,但我不明白怎么说)。我知道通过JSONP我可以绕过这个问题,但我不知道如何判断他们的API是否支持这一点(或者如何实现它)。他们只提到了两个选项:

  • application/x-www-form-urlencoded(默认)
  • 应用程序/json
  • 这是我得到的错误:

    XMLHttpRequest cannot load https://getpocket.com/v3/oauth/request. Origin http://localhost is not allowed by Access-Control-Allow-Origin.
    

    编辑 我刚刚完成了创建json版本的尝试,看看这个版本是否有效,但似乎我(再次)做错了什么

    编辑编号2 我上传了一个现场演示,调试起来更容易我想我看到了几个问题:

    首先,XMLHttpRequest受到同源限制,因此这是由于同源原因而被拒绝访问的主要原因。您需要执行实际的表单post,而不是XMLHttpRequest。有关说明,请参见此处:


    其次,根据我在这里看到的Pocket doc,您需要发送
    redirect\u uri
    参数,而不是步骤2中的
    request\u uri
    参数,并且它需要是返回到您的应用程序的完整URL,而不是相对uri。

    我尝试了修复该问题,但现在我看不出有什么不同。我上传了一个现场演示,这样调试起来就容易多了guess@AdonisK. - 您可以在演示页面中描述如何解决此问题。那一页对我来说毫无意义。我不知道该按什么按钮来解决这个问题。你不需要按任何按钮,一旦打开页面,post()函数就会执行,错误结果会写入浏览器的javascript控制台。@AdonisK.-好的,看起来您需要将POST更改为不受相同来源限制的实际表单POST,而不是受相同来源限制的XMLHttpRequest。看看我在回答中添加了什么。@AdonisK.-不,请阅读我在回答中链接的另一篇SO帖子。要绕过相同来源的限制,您必须进行实际的表单提交,如中所示。不能使用AJAX。
    var url = "https://getpocket.com/v3/oauth/request";
    var data = {};
    data.comsumer_key = "censored";
    data.request_uri  = "foo.bar/success";
    
    function post(url, data, parameters){
        var request;
    
        try{
            request = new XMLHttpRequest();
        }catch(e){
            request = false;
        }
    
        if(request !== false){
            request.open("POST", url, true);
            request.setRequestHeader("Content-type", "application/json");
            request.setRequestHeader("X-Accept", "application/json");
            request.setRequestHeader("Access-Control-Allow-Origin", "*");
            request.send(JSON.stringify(data));
            request.onreadystatechange = function(){
                console.log(request.responseText);
            };
        }else{
            console.log("Couldn't create a new XmlHttpRequest Object");
        }
    }
    post(url, data);