V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
mostkia
V2EX  ›  程序员

对于这类纯 json 参数的跨域 api,纯前端手段是否有可能拿到呢?

  •  
  •   mostkia · 2021-12-19 11:28:59 +08:00 · 3804 次点击
    这是一个创建于 1089 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是一个 api ,是 bing 的每日壁纸: https://cn.bing.com/HPImageArchive.aspx?n=1&format=js&idx=0

    打开后,前端得到的是一串匿名的 json 数据,没有赋值给任何变量,也没有输入到任何一个 callback 函数中,所以无法做到通过 jsonp 来得到数据,但直接通 ajax 来获取又会出现跨域报错,单纯靠前端有无办法利用这类 api 吗?

    或者换句话说,假设我在控制台输入一串纯 json 数据,没有复值和传入函数中,它是以什么形式存在于内存中的?还是说输入后就已经丢失了?

    25 条回复    2021-12-20 09:54:03 +08:00
    devliu1
        1
    devliu1  
       2021-12-19 11:41:14 +08:00
    主要是浏览器预设的安全限制,可以放到后端,写浏览器扩展,或者写个 cors 代理
    mostkia
        2
    mostkia  
    OP
       2021-12-19 11:52:44 +08:00
    @devliu1 嗯,不靠前端的方法脑子里一过就有很多种,比如说吧这个地址反向代理到自己的域名下,这就不跨域了,或者是 php CURL 解析后吐出来给前端用,不过这并不是我的期望解决方法,主要还是想看看大伙是不是还有更好的方法在前端上做到,目前看来是做不到的。感觉 jsonp 局限性很大啊,还是需要服务器提供支持才行,我要有控制权,我还不如直接在服务器端代码里允许跨域呢。
    renmu123
        3
    renmu123  
       2021-12-19 12:03:15 +08:00 via Android   ❤️ 1
    如果有,那你不就绕过跨域了?那跨域还有什么意义呢?
    thinkershare
        4
    thinkershare  
       2021-12-19 12:14:12 +08:00   ❤️ 1
    没有, 不要指望了, jsonp 本来就已经是不安全的, 你还想这样搞, 如果人家返回的东西变了, 直接对用户页面注入
    devliu1
        5
    devliu1  
       2021-12-19 12:15:06 +08:00   ❤️ 1
    所以结果是没有,有也是类后端的方法
    vance123
        6
    vance123  
       2021-12-19 12:31:34 +08:00   ❤️ 1
    架设代理服务器转发,或者魔改 webview 转发,没其它方法
    ch2
        7
    ch2  
       2021-12-19 12:39:35 +08:00   ❤️ 1
    别人的网站不想跟你合作,你就只能偷过来
    要不然我把 V2EX 内置到我自己的网站里,你们 cookie 我都能拿到,你觉得合适吗?
    mostkia
        8
    mostkia  
    OP
       2021-12-19 12:42:56 +08:00
    @ch2 一般也是使用公开的 api 啊,说偷不太合适吧。这种算偷,那爬虫算啥
    mostkia
        9
    mostkia  
    OP
       2021-12-19 12:44:23 +08:00
    感谢解答,我这边老老实实用后台方案解决吧,已感谢 @devliu1 @renmu123 @thinkershare @vance123 @ch2
    ch2
        10
    ch2  
       2021-12-19 12:46:49 +08:00
    @mostkia #8 换个词,转发过来
    xiadd
        11
    xiadd  
       2021-12-19 12:54:31 +08:00 via iPhone   ❤️ 1
    用 serverless cloudflare worker 应该可以
    shintendo
        12
    shintendo  
       2021-12-19 13:02:33 +08:00   ❤️ 2
    哪有纯前端手段突破跨域限制的,jsonp 也不是啊
    mostkia
        13
    mostkia  
    OP
       2021-12-19 13:06:22 +08:00
    @shintendo jsonp 算是历史遗留问题吧,阻止跨域 js 包调用可能很大一批站点都会故障,以后不知道会不会严格起来连这种调用也不被允许。
    Mutoo
        14
    Mutoo  
       2021-12-19 14:01:46 +08:00 via iPhone   ❤️ 1
    纯前端的解决方案是有的。可以用开放式反向代理服务去 ajax 这个请求。例如 https://cors-anywhere.herokuapp.com/corsdemo

    项目地址 https://github.com/Rob--W/cors-anywhere
    wangyu17455
        15
    wangyu17455  
       2021-12-19 14:30:47 +08:00   ❤️ 1
    用云函数做转发
    mostkia
        16
    mostkia  
    OP
       2021-12-19 15:31:13 +08:00
    @wangyu17455 @Mutoo 好的,感谢,有空会了解一下的
    MonoLogueChi
        17
    MonoLogueChi  
       2021-12-19 16:38:56 +08:00 via Android
    @Mutoo 这哪是纯前端的方案,也是后端代理,跨域是浏览器限制,所谓纯前端的方案在我的理解中是不能实现的,即使是能实现,也会被当做漏洞去修复。想要跨域,要么是后端代理(非特指运行在服务器上的后端,也包括相同工作原理的浏览器插件),要么是修改浏览器设置,要么是用客户端。
    Mutoo
        18
    Mutoo  
       2021-12-19 17:20:31 +08:00
    @MonoLogueChi 对开发者来说,如果你可以直接使用公共资源完成反向代理而不需要自己去架设后端,那我就认为它是纯前端可以完成的。

    而且这类资源还蛮多的 https://nordicapis.com/10-free-to-use-cors-proxies/
    liuhailiang
        19
    liuhailiang  
       2021-12-19 17:44:58 +08:00   ❤️ 1
    可以试试看 iframe 能不能解决,当前页隐藏一个 iframe 其中调用 api 获取数据写在隐藏域里。
    需要看下 iframe 和父 frame 如何相互获取数据
    很古老的时期前端会用 iframe 解决跨域问题
    justin2018
        20
    justin2018  
       2021-12-19 17:50:07 +08:00   ❤️ 1
    janxin
        21
    janxin  
       2021-12-19 18:22:01 +08:00   ❤️ 1
    浏览器 Extension
    mostkia
        22
    mostkia  
    OP
       2021-12-19 21:02:46 +08:00
    除了速度慢一些,没毛病 @Mutoo 随便试了 2 个项目:分别是 http://www.whateverorigin.org/和 https://allorigins.win/ 前者不支持 https 和 ajax 请求,后者直接支持 https 和 cors ,所以没提供 jsonp 支持输出依旧是原始数据,挺好的。对于懒癌或者不想折腾服务器配置的人的确几乎等于纯前端的方案了,但密集请求或者追求高稳定的服务,还是自己搭一个在本地比较靠谱。
    mostkia
        23
    mostkia  
    OP
       2021-12-19 21:06:00 +08:00
    @justin2018 可以,没毛病,都是类似的技术。但的确解决了问题。谢谢解答的朋友
    rpman
        24
    rpman  
       2021-12-19 22:57:06 +08:00   ❤️ 1
    如果有不走代理就能跨域的方法,那就是浏览器的安全性 bug
    SmiteChow
        25
    SmiteChow  
       2021-12-20 09:54:03 +08:00   ❤️ 1
    使用 extension 突破 我写了一个 https://github.com/DistPub/escape-cookie-samesite-policy 缺文档警告
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3189 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:39 · PVG 12:39 · LAX 20:39 · JFK 23:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.