写点什么

ajax 跨域问题

作者:加哥
  • 2021 年 11 月 11 日
  • 本文字数:1721 字

    阅读完需:约 6 分钟

ajax跨域问题

ajax 跨域问题

通过 ajax 访问“http://www.kuaidi100.com/query”,浏览器报错:


Access to XMLHttpRequest at 'http://www.kuaidi100.com/query?type=zhongtong&postid=78237558620256' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

GET http://www.kuaidi100.com/query?type=zhongtong&postid=78237558620256 net::ERR_FAILED


getStoreList = function(userId){    $.ajax({         type: "GET",         data: "type=zhongtong&postid=78237558620256",        dataType: "JSON",         headers:{'Content-Type':'application/json;charset=utf8'},        async: false,         url: "http://www.kuaidi100.com/query",        success: function(data) {            if (data.status == 'ok') {                    console.log(data);                } else {                    console.log(data.text);                }        }            });}
复制代码


禁止跨域政策(CORS policy):


  • 如果 A 站在域名a.com页面的 JavaScript 调用 B 站b.com的 API 时,将被浏览器拒绝访问,因为不满足同源策略;

  • 如果 A 站在域名a.com页面的 JavaScript 调用 A 站自己的 API 时,没有问题。


那就是 CORS,全称 Cross-Origin Resource Sharing,翻译过来就是:跨来源资源共享


是 HTML5 规范定义的如何跨域访问资源。如果 A 站的 JavaScript 访问 B 站 API 的时候,B 站能够返回响应头Access-Control-Allow-Origin: http://a.com,那么,浏览器就允许 A 站的 JavaScript 访问 B 站的 API。


注意到跨域访问能否成功,取决于 B 站是否愿意给 A 站返回一个正确的Access-Control-Allow-Origin响应头,所以决定权永远在提供 API 的服务方手中。廖雪峰官网:处理CORS


由于主动权在第三方,那么通过前端 javascript 访问是不允许的,可以通过后台代理的方式访问第三方接口,如下:


[note.js]


const express = require('express')const axios = require('axios').defaultvar cors = require('cors')
const app = express()app.use(cors()) // 允许跨域调用app.use(express.urlencoded({ extended: false}))app.use(express.json())


app.post('/proxy', async(req, res) => { const url = req.body.url const result = await axios.get(url) res.send(result.data)})
app.listen(3000, () => { console.log(`服务器运行在3000端口`)})————————————————版权声明:本文为CSDN博主「李壮士 」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_44303631/article/details/89139150
复制代码


jquery 请求:


<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <meta http-equiv="X-UA-Compatible" content="ie=edge">  <title>测试一下调用第三方API</title></head><body>  <script src="./lib/jquery.min.js"></script>  <script>    $(function() {      $.ajax({        type: "post",        url: "http://localhost:3000/proxy",        data: {          url: 'https://api.douban.com/v2/movie/in_theaters'        },        success: function (response) {          console.log(response)        },        error: function(err) {          console.log(err)        }      });    })  </script></body></html>————————————————版权声明:本文为CSDN博主「李壮士   」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/weixin_44303631/article/details/89139150
复制代码


不同的后端,处理跨域问题方案。链接地址

总结

  1. 这个问题取决于第三方 api 接口是否支持前端 javascript 请求,也就是说是否支持跨域请求,需要后台支持。

  2. 如果不支持,那么只能通过后台访问的方式,去请求第三方接口,再返回至浏览器。

用户头像

加哥

关注

还未添加个人签名 2019.02.11 加入

还未添加个人简介

评论

发布
暂无评论
ajax跨域问题