【问题标题】:Unable to make LinkedIn API calls from localhost with Axios无法使用 Axios 从 localhost 进行 LinkedIn API 调用
【发布时间】:2018-02-20 01:48:16
【问题描述】:

我正在尝试使用 axios get 请求访问linkedin 配置文件,这在 localhost 上不起作用,我收到以下错误

XMLHttpRequest 无法加载 https://api.linkedin.com/v1/people/~:(id,email-address)?format=json。 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:8030” 使用权。响应的 HTTP 状态代码为 401。

我可以使用react-linkedin-login 包获取访问令牌,获取访问令牌后我正在尝试以下代码

var linkedInUrl = `https://api.linkedin.com/v1/people/~:(id,email-address)?format=json`;
  var headers = {
    'Authorization': `Bearer ${accessToken}`,
    'Access-Control-Allow-Methods':'GET,PUT,PATCH,POST,DELETE',
    'Access-Control-Allow-Origin':'*',
    'Access-Control-Request-Headers':'Origin, X-Requested-With, Content-Type, Accept',
    'Content-Type':'application/x-www-form-urlencoded'
  };

  return (dispatch) => {
    axios.get(linkedInUrl, {headers}).then(({data}) => {
        console.log(data);
    }, (error) => {
        console.log(error);
    });
  }

我猜问题在于linkedin服务器如何接受请求,我认为它不允许本地主机拨打电话。在我在服务器上部署和运行之前,如何克服这一点来实际开发服务。

感谢您的帮助..

【问题讨论】:

标签: javascript cors linkedin linkedin-api


【解决方案1】:

这是因为浏览器限制称为“同源策略”,该限制会阻止从属于其他域的 URL 获取数据或向其发布数据。如果其他域支持跨域资源共享 (CORS),您可以绕过它,但看起来 LinkedIn 不支持,所以您可能会遇到麻烦。

解决此问题的一种方法是拥有一个可以将您的请求代理到 LinkedIn 的网络服务 - 那里没有域限制。

https://en.wikipedia.org/wiki/Same-origin_policy

https://en.wikipedia.org/wiki/Cross-origin_resource_sharing

【讨论】:

    【解决方案2】:

    尝试 jsonp 获取 CORS 请求 - 参考 - axios cookbook

    var jsonp = require('jsonp');
    jsonp(linkedInUrl, null, function (err, data) {
      if (err) {
        console.error(err.message);
      } else {
        console.log(data);
      }
    });
    

    编辑

    使用 jQuery 执行 JSONP 请求并设置标头

    $.ajax({url: linkedInUrl,
      type: 'GET',
      contentType: "application/json",
      headers: header, /* pass your header object */
      dataType: 'jsonp',
      success: function(data) {
        console.log(data);
      },
      error: function(err) {
        console.log('Error', err);
      },
    });
    

    【讨论】:

    • 是的,它做了一些事情,我没有收到 CORS 错误.. 但现在超时.. 将检查并通知您..
    • 尝试传递 {timeout: 0} 作为第二个参数,而不是 null- github.com/webmodules/jsonp#jsonpurl-opts-fn
    • 有什么方法可以传递标头,因为我需要添加具有此值“授权”的标头:Bearer ${accessToken}
    • 没有办法用jsonp库添加标题,所以你最好使用jquery
    【解决方案3】:

    https://cors-anywhere.herokuapp.com/ - 在 url 之前添加这个就可以了

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 2019-09-14
      • 1970-01-01
      • 2021-07-11
      相关资源
      最近更新 更多