【问题标题】:Issue connecting to API server via xmlhttprequest通过 xmlhttprequest 连接到 API 服务器的问题
【发布时间】:2023-03-06 18:54:01
【问题描述】:

我正在尝试创建一个简单的Pocket 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 是否支持(或如何实现它)。他们只提到了 2 个选项:

  1. application/x-www-form-urlencoded(默认)
  2. 应用程序/json

这是我得到的错误:

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

pocket v3 API

编辑

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

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);

编辑编号 2

我上传了一个现场演示here,我想调试起来会更容易

【问题讨论】:

    标签: javascript xmlhttprequest


    【解决方案1】:

    我发现了几个问题:

    首先,XMLHttpRequest 受到同源限制,因此这是您因同源原因而被拒绝访问的主要原因。您需要做一个实际的表单发布,而不是 XMLHttpRequest。解释见这里:Why is $.post() subject to same-origin policy, but submitting a form with method='POST' okay?

    其次,根据我在此处看到的 Pocket 文档 http://getpocket.com/developer/docs/authentication,您需要在第 2 步中发送 redirect_uri 参数,而不是 request_uri 参数,并且它需要是返回应用程序的完整 URL,而不是相对 URI。

    【讨论】:

    • 我尝试修复它,但我现在没有发现任何不同。我上传了一个现场演示here,我想调试起来会更容易
    • @AdonisK。 - 您可能会在演示页面中描述如何解决此问题。那一页对我来说毫无意义。我不知道用什么按钮来推动这个问题。
    • 你不需要推送任何东西,一旦你打开页面,post()函数就会被执行,错误结果会写在你浏览器的javascript控制台中。
    • @AdonisK。 - 好的,看起来您需要将 POST 更改为不受同源限制的实际表单帖子,而不是受同源限制的 XMLHttpRequest。看看我在答案中添加了什么。
    • @AdonisK。 - 不。阅读我在答案中链接到的其他 SO 帖子。要绕过相同的来源限制,您必须像form.submit() 那样进行实际的表单提交。你不能使用 AJAX。
    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2017-05-06
    • 2019-06-27
    相关资源
    最近更新 更多