al-liu / OCat-MobilePlatform

基于离线包的混合开发方案,提供后台(Java),客户端(iOS,Android)全栈的完整功能。
MIT License
51 stars 16 forks source link

这是针对开发模式下配置的代理,那如果是产品环境,怎么让相对路径的ajax请求知道自己的host #1

Open karosLi opened 4 years ago

al-liu commented 4 years ago

注释 vue.config.js 下 devServer 的配置,修改 network/config.js 下的 baseURL 地址。

karosLi commented 4 years ago

嗯,那这样的话,就会引入 axios 库了,并要使用 axios 的请求方式了,对于纯 XMLHTTPRequest,怎么做兼容呢。 另外 network/config.js 配置的 baseURL,是固定的端口号,这样的端口可能会被端上占用,就会导致请求发不出去。

karosLi commented 4 years ago

另外,既然你的这个项目是使用了 axios 作为网络库,那不用担心请求找不到的情况,但是启动一个localserver 是否还有必要?通过file协议也是可以加载本地相对路径的资源的。

al-liu commented 4 years ago

你如果说的是客户端载入的前端项目,网络请求因为涉及跨域,所以要使用js-native桥接库让原生代劳网络请求,至于为什么用本地 webserver 的方式,可以看这篇文章:https://juejin.im/post/5cd4fda8f265da03a00febe1#heading-3

karosLi commented 4 years ago

js-native 不是我们期望的,他有自身的限制,不能让前端共用一套代码,并且不能获取二进制数据。 跨域可以通过配置webview来允许 file 协议加载的文件去发送跨域请求。 [configuration setValue:@YES forKey:@"_allowUniversalAccessFromFileURLs"];

karosLi commented 4 years ago

假定是使用了 webserver,webserver 是怎么知道 ajax 真正的 host 是什么?

al-liu commented 4 years ago

解决跨域的方法是很多,但鉴于我们项目的请求报文和密码都使用了js无法提供的加密方式,通信的ssl验证也是自定义的,还有方便解决会话问题,所以是原生代劳网络请求。 但是如果你用本地webserver,还要ajax发请求,就用axios就可以,只要解决跨域问题,不过这种方式我未做验证。 你前面提到的纯 XMLHTTPRequest怎么做兼容,这个问题我没看明白。

karosLi commented 4 years ago

axios 应该是可以解决 baseURL 找不到的问题的,只不过这个 baseURL 是一个 localhost,不是真正期望的请求host,只是把请求转发到本地了,但是本地又要转发给谁呢? XMLHTTPRequest 我只是提下,可能的话, 可以 hook send 方法,拼接 localhost到前面,但是也会遇到找不到真正的 host,那也许可以在 hook send 之前主动设置一个请求头,头里存一个真正的 host

al-liu commented 4 years ago

baseURL 怎么会是 localhost 呢,你配置成后台服务地址就可以了,然后再解决涉及的跨域问题。

karosLi commented 4 years ago

那你这边的 ajax 请求的是一个完整的路径了,就需要后台配置跨域响应头了

al-liu commented 4 years ago

可以,不过我还是建议离线包下把请求交给客户端原生,改起来也很容易。

karosLi commented 4 years ago

交给客户端原生,那就需要 ajax 的 url (./getInfo)使用相对路径了,才会转到 local webserver 里面去,那 local webserver 得到是一个 http://localhost:88888/appid/getInfo 的一个请求,这样请求是找不到远程服务器的,所以是需要一个真正的 host,这也是我上面问你的问题。

karosLi commented 4 years ago

可以,不过我还是建议离线包下把请求交给客户端原生,改起来也很容易。

如果不会相对路径,你这边怎么把请求交给客户端去发,jsbridge 是可以发,但是不能支持二进制的场景,只能 json 数据交互,不能满足所有的场景,而且 jsbrdge 发送 api 对于 H5 是一种侵入。

al-liu commented 4 years ago

可以,不过我还是建议离线包下把请求交给客户端原生,改起来也很容易。

如果不会相对路径,你这边怎么把请求交给客户端去发,jsbridge 是可以发,但是不能支持二进制的场景,只能 json 数据交互,不能满足所有的场景,而且 jsbrdge 发送 api 对于 H5 是一种侵入。

jsbridge 不能叫对h5有侵入性,本来就是混合开发,而且原生和h5就是要通过桥接的方式相互补足各自的短板。你说的二进制等等问题都能通过原生配合解决。 你不想要“侵入性”,就别考虑离线包的方式了,就用webview做个壳套个线上h5得了。

karosLi commented 4 years ago

可以,不过我还是建议离线包下把请求交给客户端原生,改起来也很容易。

如果不会相对路径,你这边怎么把请求交给客户端去发,jsbridge 是可以发,但是不能支持二进制的场景,只能 json 数据交互,不能满足所有的场景,而且 jsbrdge 发送 api 对于 H5 是一种侵入。

jsbridge 不能叫对h5有侵入性,本来就是混合开发,而且原生和h5就是要通过桥接的方式相互补足各自的短板。你说的二进制等等问题都能通过原生配合解决。 你不想要“侵入性”,就别考虑离线包的方式了,就用webview做个壳套个线上h5得了。

嗯,我的意思是 jsbridge 发 api 需要前端配合的程度高,是一种成本。二进制的问题,可能你们没有遇到类似的问题,这里就不讨论了。