V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
zhihaofans
V2EX  ›  JavaScript

jquery ajax 怎样跨域获取 json 数据

  •  
  •   zhihaofans · 2016-07-13 21:09:57 +08:00 via Android · 4719 次点击
    这是一个创建于 3084 天前的主题,其中的信息可能已经有所发展或是发生改变。
    21 条回复    2016-07-14 17:58:05 +08:00
    zhihaofans
        1
    zhihaofans  
    OP
       2016-07-13 21:10:48 +08:00 via Android
    试了网上的很多方法都不行,都提示不允许跨域
    explon
        2
    explon  
       2016-07-13 21:15:15 +08:00
    搜索 JSONP
    ousterljn
        3
    ousterljn  
       2016-07-13 21:17:16 +08:00
    zhihaofans
        4
    zhihaofans  
    OP
       2016-07-13 21:17:17 +08:00 via Android
    @explon jsonp 之前试了几次要么还是那样要么返回空白数据,不知道是不是参数错误
    LancerComet
        5
    LancerComet  
       2016-07-13 21:27:41 +08:00   ❤️ 2
    1. Ajax 默认支持浏览器发起跨域请求( XHR Level 2 标准,可参考 http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html ),只要服务器打开跨域权限就可以直接请求。

    服务器不允许跨域请求:


    服务器关闭跨域限制:


    2. JSONP.
    binux
        6
    binux  
       2016-07-13 21:36:57 +08:00
    需要对方支持
    0915240
        7
    0915240  
       2016-07-13 21:43:56 +08:00
    @LancerComet bingo! 服务端开启或者 jsonp
    iyaozhen
        8
    iyaozhen  
       2016-07-13 21:47:23 +08:00 via Android
    @LancerComet 其实就是要对方服务器支持。

    还有一种方法,自己服务器做中转。
    DoraJDJ
        10
    DoraJDJ  
       2016-07-13 21:49:16 +08:00
    @iyaozhen 哈哈,我当时想通过 Ajax 抓 B 站用户信息之后就发现不能跨域,结果写出了个 Project Ako 这个项目方便让我做中转。



    结果到现在还没真正投入实际环境中。
    zhihaofans
        11
    zhihaofans  
    OP
       2016-07-13 21:55:58 +08:00
    @LancerComet
    @binux
    我是调用一个 API ,所以就没办法服务端开启支持了 T_T

    @iyaozhen
    服务器中转的话,我一开始是这么做的,用 php ,但是因为我的服务器在日本,但 api 所在服务器却在国内再加上我基本上没怎么优化服务器所以中转就慢了很多,还有一个原因就是我怕服务器调用 api 太多次被封 ip(因为是个小型非盈利网站来的)


    @huntererer
    谢谢,我看一下
    zhihaofans
        12
    zhihaofans  
    OP
       2016-07-13 22:55:05 +08:00
    试了一下几个网址,发现好像我调用的这个 api 不知道为什么就是失败,其他的几个都可以,用浏览器打开 api 地址就可以返回数据
    zxwind
        13
    zxwind  
       2016-07-14 01:29:59 +08:00
    caixiexin
        14
    caixiexin  
       2016-07-14 07:48:22 +08:00 via Android
    如果对方服务端你不能改的话,只能通过自己的服务端做一层转发咯
    wzxjohn
        15
    wzxjohn  
       2016-07-14 08:37:08 +08:00 via iPhone
    @zhihaofans 用浏览器打开 API 地址完全不会导致跨域!这个测试对解决你的问题没有意义的。。。
    kiwi95
        16
    kiwi95  
       2016-07-14 08:56:19 +08:00 via Android
    如果能修改服务器那开 cors 是最方便的,如果不能就只能在自己的服务器 curl 代理一层
    qinxi
        17
    qinxi  
       2016-07-14 09:57:05 +08:00
    nginx 反向代理
    Aaron99
        18
    Aaron99  
       2016-07-14 10:41:35 +08:00 via Android
    jsonp
    zhihaofans
        19
    zhihaofans  
    OP
       2016-07-14 14:20:04 +08:00
    @wzxjohn
    我的意思是 跨域是成功了,但不知道为什么只有我用这个 API 时不返回数据,其他网址的都没问题
    finalspeed
        20
    finalspeed  
       2016-07-14 14:57:53 +08:00
    @Aaron99 第三方 API 不支持,然并卵....
    flydogs
        21
    flydogs  
       2016-07-14 17:58:05 +08:00
    jsonp
    服务器端和客户端都要修改。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4145 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:12 · PVG 12:12 · LAX 20:12 · JFK 23:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.