• uniapp 如何发送formData数据请求(全网最佳解决方案)


    1.首先想到的就是修改Content-Type

    Content-Type: 'application/x-www-form-urlencoded'

    1. uni.request({
    2.         url:URL.TASK_SYNC_VM, //仅为示例,并非真实接口地址。
    3.         data:formData,
    4.         method:"POST",
    5.         header: {
    6.            Authorization,
    7.            'Content-Type': 'application/x-www-form-urlencoded'
    8. }
    9.    }),

     Content-Type常见的四种类型:

    Content-Type的值form表单  Ajax(xhr)
    multipart/form-data可以通过enctype属性设置发送的数据形式为FormData时的默认值
    application/x-www-form-urlencoded默认。即未设置enctype属性时的默认值可以通过setRequestHeader方法设置
    application/json不支持。可以通过enctype属性设置,但提交时会自动转为application/x-www-form-urlencoded可以通过setRequestHeader方法设置
    text/plain可以通过enctype属性设置发送的数据形式为字符串时的默认值。包括JSON.Stringify方法返回的json字符串

    Content-Type

     2.传递formData类型的数据,使用fly.js

    1.  let formData = new Formdata()
    2.  Object.keys(data).forEach((index) => {
    3. formData.append(index, data[index])
    4.  })
    5.  console.log(formData.get('userId'));
    6. uni.request({
    7. url:URL.TASK_SYNC_VM, //仅为示例,并非真实接口地址。
    8. data:formData, //uni.request 不支持formData类型的数据
    9. method:"POST",
    10. header: {
    11. Authorization,
    12. 'Content-Type': 'multipart/form-data'
    13. }
    14. )}

     ps:uni.request 不支持formData类型的数据

     uni.app提供了支持formData类型的数据,但是是传文件的明显不符合我们的需求。

    1. uni.uploadFile({
    2. url,
    3. file, // 文件
    4. name, // 在FormData 中文件对应的属性名
    5. formData: data, // 除文件外其他所有数据,传对象,会默认转换为 FormData
    6. header: {
    7. token
    8. // 不需要手动指定 multipart/form-data ,本 API 默认 multipart/form-data
    9. // 手动指定需要计算 boundary 并拼接上
    10. },
    11. success: res => {
    12. },
    13. })

    然后找能支持发送formData类型数据的库 fly.js

    目前Fly.js支持的平台包括:Node.js 、微信小程序 、Weex 、React Native 、Quick App 和浏览器,这些平台的 JavaScript 运行时都是不同的

    安装fly: 

    npm install flyio
    1. let data = {
    2. 'userId': 'a85e5678-419d-4e8f-8da0-c961b4186333',
    3. 'package': 'io.changchun.app',
    4. 'taskId': 1,
    5. 'taskName': 'test2',
    6. // "injectObject":'{"url":"/pages/myMission/myMission"}'
    7. }
    8. let formData = new Formdata()
    9. Object.keys(data).forEach((index) => {
    10. formData.append(index, data[index])
    11. })
    12. fly.post(URL.TASK_SYNC_VM,{...formData},{headers:{
    13. Authorization,
    14. "content-type":"multipart/form-data"
    15. }})

    运行项目到浏览器 我们看到能正常发送formData类型请求

    fly.js的二次封装请参考:fly.js 的二次封装_流氓也是种气质 _Cookie的博客-CSDN博客

     我们接下来我们运行到真机上会遇到以下提示:FormData is not defined

    用为App的js运行在jscore下而不是浏览器里,没有浏览器专用的js对象,比如document、xmlhttp、cookie、window、location、navigator、localstorage、websql、indexdb、webgl等对象。

    FormData也是浏览器定制的对象,uniapp非H5端不支持

    3.解决app不支持FormData对象的问题,我们使用renderjs

     3.1 、renderjs的作用是什么?

    renderjs 主要服务于APP,因为uni-app为vue+js+html进行编写,整个是h5的技术栈。而app上并没有document等基础对象。那么,涉及到这些的前端类库就无法使用,例如html2、canvas、canvas2、image。而要用这些怎么办,这是用就出现了renderjs这种视图层工具来进行渲染。

    运行在视图层的js

    大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力(减少通讯损耗提升性能,例如一些手势或canvas动画的场景)

    在视图层操作dom,运行for web的js库(可以操作dom,意味着拥有window、document等这些全局变量,在app-vue的service层没有这些)

    详细语法使用可以参考以下文章:uniapp中使用renderjs_流氓也是种气质 _Cookie的博客-CSDN博客

    3.2 由于我们要避免new FormData,但是我们又要使用FormData类型数据发送请求故使用axios 配合renderjs,满足我们在H5和app端都能使用

    1. class="nav_title" @click="custom.taskSycn">test
    2. // 注意renderjs方法的调用custom.taskSycn() 不能加(),在H5能正常解析,但是在APP端无法正常解析
    3. <script module="custom" lang="renderjs"> // 定义renderjs 即视图层,这里面的语法及生命周期都和vue语法保持一致
    4. import axios from 'axios'
    5. export default {
    6. data() {
    7. return {}
    8. },
    9. methods: {
    10. handleClick() {
    11. console.log('9999');
    12. },
    13. taskSycn() {
    14. console.log('taskSycn++++');
    15. let Authorization = `9j8yMV b964c9635dcf5e0f9c50a6073bdb69d7`
    16. let data = {
    17. userId: "a85e5678-419d-4e8f-8da0-c961b4186333",
    18. package: "io.changchun.app",
    19. taskId: 1,
    20. taskName: "test21"
    21. // "injectObject":'{"url":"/pages/myMission/myMission"}'
    22. };
    23. axios
    24. .post("http://116.141.0.158:8083/mobile-portal/task/sync.vm", {
    25. ...data
    26. }, {
    27. headers: {
    28. Authorization,
    29. "Content-type": "multipart/form-data"
    30. }
    31. })
    32. .then(function (response) {
    33. console.log(response);
    34. })
    35. .catch(function (error) {
    36. console.log(error);
    37. });
    38. }
    39. }
    40. }
    41. script>
    42. <script> // 就是我们正常的uniapp js代码 即service层
    43. export default {
    44. data() {
    45. return {}
    46. },
    47. }
    48. script>

  • 相关阅读:
    Python单例模式(3种常用方式)
    使用多线程或异步技术提高图片抓取效率
    LeetCode621:任务调度器
    redis批量删除命令
    灰狼算法优化ICEEMDAN参数,四种适应度函数任意切换,最小包络熵、样本熵、信息熵、排列熵...
    shell 循环语句
    Selenium+Python自动化测试环境搭建
    2023探寻室内设计的新趋势与即将流逝的旧潮流
    linux中文件压缩和解压
    Oracle sqlnet.ora配置文件
  • 原文地址:https://blog.csdn.net/qq_37550440/article/details/126027839