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

2021-12-19 11:28:59 +08:00
 mostkia

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

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

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

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

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

而且这类资源还蛮多的 https://nordicapis.com/10-free-to-use-cors-proxies/
liuhailiang
2021-12-19 17:44:58 +08:00
可以试试看 iframe 能不能解决,当前页隐藏一个 iframe 其中调用 api 获取数据写在隐藏域里。
需要看下 iframe 和父 frame 如何相互获取数据
很古老的时期前端会用 iframe 解决跨域问题
justin2018
2021-12-19 17:50:07 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/823095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX