开发者社区> 问答> 正文

ajax跨域获取数据?报错

现有一API接口,使用jsonp调用该接口,返回格式依然为json格式不是函数类型,所有无法获取数据,请问各位大佬还有没有其他的解决办法,网上搜有人用getjson可以解决,但是测试依然报错,求助,API地址为:http://cdn.apc.360.cn/index.php?c=WallPaper&a=getAllCategoriesV2&from=360chrome,请各位大佬指正
 

展开
收起
爱吃鱼的程序员 2020-06-07 16:31:53 514 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB
                        <p>服务端解决方案,就是在响应头中写入如下几个参数:</p>
    

    Access-Control-Allow-Origin    值为 "*"或者其它域名
    Access-Control-Allow-Methods    值为"GET,POST,OPTIONS,DELETE,PUT,HEAD"
    Access-Control-Allow-Credentials    值为"true"

                            就是不想用服务端处理,想在客户端处理
                        
    
                        <p>当前的解决方案,跨域请求都需要服务端配合的,jsonp方式,是需要服务器支持的,你这个接口,服务器有特别的参数或者请求头指定返回类型吗,或许有指定jsonp返回类型的方法,如果可以修改服务器的话,楼上的方法就可以加CORS跨域,不需要对接口数据进行更改,如果服务器不支持,只能加中转服务器了</p>
    
                    
    
                        <p>如果是你调用他们的接口,让他们改成jsonp挺难的,你可以从JAVA代码中请求接口,然后再把数据返回给前端就行了</p>
    
                    
    
                        <p>自己在服务端封一层,绕过跨域;其他方式都不太好使,页面是人家的,也不能通过变更页面参数和内容来绕过跨域</p>
    
                    
    
                        <p>反向代理走起</p>
    
    upstream apachephp  {
        server cdn.apc.360.cn:80;
    }
    
    server {
        listen 80;
        server_name  apc.360.1008.com;
     
        access_log  /var/log/nginx/apc.360.access.log;
        error_log  /var/log/nginx/apc.360.error.log;
        root   html;
        index  index.html index.htm index.php;
     
        location / {
            proxy_pass  http://apachephp;
            proxy_redirect     off;
            proxy_set_header   Host             cdn.apc.360.cn;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_max_temp_file_size 0;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
    	
    	add_header Access-Control-Allow-Origin *;
    	add_header Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE,PUT,HEAD;
    	add_header Access-Control-Allow-Credentials true;
       }
    }
    
    
    # 这个接口  360 有检查其他的头信息  curl 不过的,用浏览器玩儿

     

                        <p>如果api服务器不在你那儿,可以尝试楼上的反向代理方案,如果api服务器是你自己的,可以修改服务端,修改的方式参照顶楼是没问题的,但是唯一要注意的是,服务端在吐数据的时候,一定要带上callback,因为jsonp的格式是由一个【回调函数调用一串json】组成,如:callback( {json} )  </p>
    
                    
    
                        <div class='ref'><h4>引用来自“溪涧顽石”的评论</h4><p>反向代理走起</p>
    
    upstream apachephp  {
        server cdn.apc.360.cn:80;
    }
    
    server {
        listen 80;
        server_name  apc.360.1008.com;
     
        access_log  /var/log/nginx/apc.360.access.log;
        error_log  /var/log/nginx/apc.360.error.log;
        root   html;
        index  index.html index.htm index.php;
     
        location / {
            proxy_pass  http://apachephp;
            proxy_redirect     off;
            proxy_set_header   Host             cdn.apc.360.cn;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_max_temp_file_size 0;
            proxy_connect_timeout      90;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;
    	
    	add_header Access-Control-Allow-Origin *;
    	add_header Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE,PUT,HEAD;
    	add_header Access-Control-Allow-Credentials true;
       }
    }
    
    
    # 这个接口  360 有检查其他的头信息  curl 不过的,用浏览器玩儿

     

                            回复<a class="referer" target="_blank">@sunkejava</a> :  服务中转也是把请求往后放,本质上个反向代理一样~  一个是配置,一个是自己写~ 还不如撸个反向代理安生.
                        
    
                            很多服务都需要负载均衡,加个代理你还可以顺便把负载均衡做了,哈哈。
    
    2020-06-07 16:32:12
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载