axios妙用:ios下支付宝小程序webview内嵌H5页面上传图片解决方案

这几天项目上遇到一个问题,就是使用webview的方式嵌入同一套H5页面代码,在微信小程序里可正常运行,在APP中可正常运行,但是在ios端支付宝小程序中所有传参为formdata形式的接口都会有问题,后端无法取到formdata中的数据,而安卓端是正常的。 翻阅了支付宝小程序官网上对webview内嵌H5上传图片的部分,发现写着大大的:不支持

看了许多网上的解决方案也都似乎没有解决方式,都是利用了webview和H5页面通信的方式来解决,可是我们的H5页面是嵌入到第三方的小程序里webview的,如果要修改webview的通信这种方式,势必要麻烦第三方来配合,且不说人家愿意与否,自己也会觉得不好意思。

还是不死心,想弄清楚安卓下和ios下传的参数区别到底在哪里,于是加了VConsole调试工具。 以下是安卓下的参数:

以下是ios下的参数:

又看了其他几个ios下传formdata参数的接口,参数都是统一的形式,被拆分成了:

{
    realFormData: {},
    appendData: [{...}]
}
复制代码

这个形式是对于传参加了一层封装,怪不得后端按照接口约定取不到值了。 既然找到这个原因,那能不能从参数入手呢? 忽然想起axios是可以在请求发送前对参数进行修改的,利用 transformRequest 配置项。

那可以先在该配置项中打印一下参数是不是已经被支付宝小程序加了那层封装,如果在这里看到的参数是已经被封装过的那就好办了,只要进行拆分,拆分为原本的数据格式,那就能按照拆分后的格式发送出去了。 经过测试,果然在transformRequest里已经是封装过的参数了。 并且重新组装参数后,后端可以正常接受参数,取值,返回正确数据了,太开心了!

最终解决方案如下:

原本调用接口传参方式,由传递formdata格式,改为直接传递普通数据,在transformRequest中组装formdata参数:

改为:

最后想问下,不知道为何ios下支付宝小程序对webview里H5传递formdata的参数会加一层封装,有明白的大佬吗? 而且官方文档里说不支持上传图片,是不是就因为这个封装的问题呢? 是不是只能用axios来hack这个问题呢?还有其他方式吗?

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 要在微信小程序中嵌入H5页面,并在H5页面中接收数据并请求,您可以使用以下步骤: 1. 在微信小程序中创建一个web-view组件,它允许您在小程序中显示H5页面。可以使用以下代码创建web-view组件: ```html <web-view src="{{url}}" bindmessage="onMessage"></web-view> ``` 其中,`src`属性用于指定要加载的H5页面的URL地址,`bindmessage`属性用于监听来自H5页面的消息。 2. 在H5页面中,您可以使用`postMessage`方法将数据发送回小程序。例如,您可以使用以下代码将数据发送回小程序: ```javascript var data = {foo: 'bar'}; window.parent.postMessage(data, '*'); ``` 其中,`data`是要发送的数据,`window.parent.postMessage`方法用于将数据发送回小程序。 3. 在微信小程序中,您可以使用`onMessage`方法来监听来自H5页面的消息,并在接收到消息后执行必要的操作。例如,您可以使用以下代码来监听来自H5页面的消息: ```javascript onMessage: function(event) { var data = event.detail.data; // 处理接收到的数据 } ``` 其中,`event.detail.data`表示从H5页面发送的数据。 4. 如果您需要在H5页面中向服务器发送请求并获取响应,可以使用标准的AJAX请求。例如,您可以使用以下代码向服务器发送POST请求: ```javascript var xhr = new XMLHttpRequest(); xhr.open('POST', '/path/to/api'); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { var response = JSON.parse(xhr.responseText); // 处理响应数据 } else { console.error(xhr.statusText); } } }; xhr.send(JSON.stringify(data)); ``` 其中,`/path/to/api`是您要访问的API的URL地址,`data`是您要发送的数据。在收到响应后,您可以使用`JSON.parse`方法将响应数据转换为JavaScript对象,并执行必要的操作。 ### 回答2: 微信小程序内嵌H5页面后,可以通过向H5页面传递数据和向服务器发送请求来实现数据的传递和处理。 首先,在微信小程序中,我们可以使用web-view组件来内嵌H5页面使用该组件时,可以通过src属性指定H5页面的URL地址。在H5页面中,可以通过window对象的location.search或者document.referrer来获取从小程序传递过来的数据。 其次,在H5页面中可以使用Ajax等技术向服务器发送请求获取数据。可以使用XMLHttpRequest对象或者使用第三方库比如axios来实现。在发送请求时,需要注意跨域问题,需要在小程序后台配置服务器域名白名单,并在H5页面的响应头中添加Access-Control-Allow-Origin字段。 在小程序中传递数据给H5页面可以通过URL参数,如: ``` web-view src="/pages/index/index?param1=value1&param2=value2" ``` 在H5页面中,可以通过window对象的location.search来获取URL参数,然后进行处理,如: ``` var params = location.search.slice(1).split("&"); var data = {}; params.forEach(function(item) { var arr = item.split("="); data[arr[0]] = arr[1]; }); console.log(data); ``` 在H5页面请求数据可以使用如下代码,以使用axios发送GET请求为例: ``` axios.get("http://example.com/api/data") .then(function(response) { console.log(response.data); }) .catch(function(error) { console.error(error); }); ``` 需要注意的是,在微信小程序使用H5页面时,需要通过合理的设计和安全措施来防止恶意代码的注入和数据的非法访问,确保小程序的数据安全和用户信息的保护。 ### 回答3: 微信小程序内嵌H5页面可以通过两种方式接受数据并发起请求。 一种方式是通过使用URL传参的形式将数据传递给H5页面,并在H5页面中解析URL参数来获取数据。在小程序内嵌H5页面时,可以通过`web-view`组件的`src`属性来指定H5页面的URL地址,可以在URL后面添加参数,如:`https://www.example.com/page?data=xxx`。在H5页面中,可以通过获取`location.search`来获取URL中的参数,再进行解析和使用。 另一种方式是通过JavaScript脚本在小程序H5页面之间进行双向通信,实现数据的传递和请求。在小程序中,可以通过`web-view`组件的`bindmessage`事件监听H5页面发送的消息,并通过`e.detail.data`获取传递的数据。H5页面可以通过`window.parent.postMessage`方法将数据发送给小程序,如:`window.parent.postMessage({data: 'xxx'}, '*')`。小程序页面收到消息后,可以根据需要进行处理,如发起请求等。 以上两种方式可以根据具体需求选择合适的方式来进行数据传递和请求,具体实现可以根据小程序H5页面的开发文档进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值