写html5 遇到的ajax请求跨域问题,访问本地数据库问题

            最近经理要求把app做成html5 版本的。我用的apicloud (没遇到什么特别难的问题)做好后给经理看,然后说不是他想要的效果,他想要的是不要打包成apk形式的html5项目(就是纯网页版的项目)。好吧大部分东西都白忙活了。

于是我就改吧,还好前面做的页面大部分还可以用。可是问题就在第一天就出现了,网络请求 ajax跨域问题(以前没做过网页版的项目),我是直接拿android用的接口,用$.ajax,请求网络。好吧,如你们所想,直接死亡。第一个接口是post请求,不管怎样弄,状态返回为0,改为$.post,还是不行,同样的错误。网上各种查资料,看博客,弄了一天终于明白了是ajax请求跨域问题。好吧地二天继续,在网上找了很多方法,本来不准备改服务器接口的东西,但是显然不行。要解决这个问题还真要服务端加东西,我用的其中一个方法就是在服务端加上了

 Response.Headers.Add("Access-Control-Allow-Origin", "*");
            Response.Headers.Add("Access-Control-Allow-Methods", "POST,GET");

这两句后就ok了,客户端什么也不用改,该传的参数照样传。OK,post请求就这样解决了。

你认为这样就完了?怎么可能,还有get请求呢,出了一个坑还有一个坑等着你。get遇到了个什么情况呢,get遇到的是我这般传的headers消息头(参数有点多)服务端获取不到,特么的崩溃了。好吧,最后是在无赖了,加在请求路径后边吧。有可能有人会问我为什么不把接口都写成post请求呢,原因是我有个get请求是访问文件下载一个zip的数据库。

  

跨域问题解决了,前面说到了下载了一个数据库,下面的问题就围绕到下载的数据库。

前面说到了,我是下载的一个数据库的压缩包,在访问数据库之前要解压压缩包吧。好吧我就去网上查html访问文件系统,找了一个File System API只支持Chrome浏览器,然后找到了一个 JSZip 和 JSZipUtils 库,开始没注意依样画葫芦都写好了。可是问题来了,访问不了我下载的数据库的文件,完全没反应,后来我在google上找到了一番翻译过来的官方文档,写了一句话,大概是这样:浏览器不能访问本地文件系统,file system api 是浏览器自身创建的一个沙盒,file system api 所有操作都在沙盒中进行。

我看明白后完全懵了,我又去问了另外一个经理,一个做了接近20年软件开发的大神(公司的什么技术性难题都是靠他解决),他给我明确回答,浏览器不能访问本地文件系统,除非安装插件。安装插件,怎么可能,不现实,不说客户问题,就安全性而言不可能,浏览器还有差异化。好吧这条路反正是断了。只有不下载解压包,下载完整的数据库来进行数据库操作吧


再来说说访问本地数据库,我在网上找到了一个web sql (已经弃用,chrome浏览器暂时还支持)和 indexdb。

先来说一说web sql,首先一句话,他也是坑。web sql 访问的地址是浏览器映射的缓存地址,我把自己下载的数据库放在要访问的文件夹中。他打开数据库的语句是:

var db = openDatabase('LocationInfo', '', '', 3 * 1024 * 1024);参数依次是“访问数据库名字,版本号,数据库描述语句,指定允许访问大小”。你以为这样就可以访问到数据库了吗,对的,访问不了。经过我和我旁边同事的研究,每次新建一个数据库,浏览器映射的缓存地址下就会产生一个序列号,发现必须要在database自带数据库中注册一个序列号,一个数据库对应一个序列号(1.2.3。。。)(后面我们们有去研究怎么代码实现注册序列号),然后映射的缓存地址文件夹里的数据库名字就是序列号,才能访问数据库,当然,访问数据库的时候数据库名字还是填你的数据库名字,而不是序列号。是不是很坑。好吧,说实话,我放弃了。

到这里,你们是不是会想到我提到的另一个数据库呢,他会不会好些呢。然而并不是这样,具体我研究的经过就不废话了,经过研究,发现indexdb是以对象存储的,而不是我们普遍的关系型数据库,这可就尴尬了。


小白一枚,有什么错的地方望指正。一点小小的经验,分享给你们

你可能感兴趣的:(HTML5)