【知识】Uni-app-学习笔记 04

简介: 【知识】Uni-app-学习笔记 04

5、网络请求


在uni中可以调用uni.request方法进行请求网络请求


uni.request


在各个小程序平台运行时,网络相关的 API 在使用前需要配置域名白名单。


参数说明


image.pngimage.png


method 有效值


必须大写,有效值在不同平台差异说明不同。


image.png


success 返回参数说明


image.png


data 数据说明


最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String。转换规则如下:


  • 对于 GET 方法,会将数据转换为 query string。例如 { name: 'name', age: 18 } 转换后的结果是 name=name&age=18
  • 对于 POST 方法且 header['content-type']application/json 的数据,会进行 JSON 序列化。
  • 对于 POST 方法且 header['content-type']application/x-www-form-urlencoded 的数据,会将数据转换为 query string。


示例


uni.request({
    url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
    data: {
        text: 'uni.request'
    },
    header: {
        'custom-header': 'hello' //自定义请求头信息
    },
    success: (res) => {
        console.log(res.data);
        this.text = 'request success';
    }
});


返回值


如果希望返回一个 requestTask 对象,需要至少传入 success / fail / complete 参数中的一个。例如:


var requestTask = uni.request({
    url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
    complete: ()=> {}
});
requestTask.abort();


如果没有传入 success / fail / complete 参数,则会返回封装后的 Promise 对象:

Promise 封装


通过 requestTask,可中断请求任务。


requestTask 对象的方法列表


image.png


示例


const requestTask = uni.request({
    url: 'https://www.example.com/request', //仅为示例,并非真实接口地址。
    data: {
        name: 'name',
        age: 18
    },
    success: function(res) {
        console.log(res.data);
    }
});
// 中断请求任务
requestTask.abort();


Tips

  • 请求的 headercontent-type 默认为 application/json
  • 避免在 header 中使用中文,或者使用 encodeURIComponent 进行编码,否则在百度小程序报错。
  • 网络请求的 超时时间 可以统一在 manifest.json 中配置 networkTimeout
  • H5 端本地调试需注意跨域问题,参考:调试跨域问题解决方案
  • 注意由于百度小程序iOS客户端,请求失败时会进入fail回调,需要针对百度增加相应的处理以解决该问题。
  • 注意小程序端不支持自动保持 cookie,服务器应避免验证 cookie。如果服务器无法修改,也可以使用一些模拟手段,比如这样的工具github.com/charleslo1/… 可以请求时带上 cookie 并将响应的 cookie 保存在本地。
  • H5端 cookie 受跨域限制(和平时开发网站时一样),旧版的 uni.request 未支持 withCredentials 配置,可以直接使用 xhr 对象或者其他类库。
  • 根据 W3C 规范,H5 端无法获取 response header 中 Set-Cookie、Set-Cookie2 这2个字段,对于跨域请求,允许获取的 response header 字段只限于“simple response header”和“Access-Control-Expose-Headers”(详情
  • uni-app 插件市场有flyio、axios等三方封装的拦截器可用
  • 低版本手机自身不支持 ipv6,如果服务器仅允许 ipv6,会导致老手机无法正常运行或访问速度非常慢
  • localhost、127.0.0.1等服务器地址,只能在电脑端运行,手机端连接时不能访问。请使用标准IP并保证手机能连接电脑网络
  • debug 模式,安卓端暂时无法获取响应头,url中含有非法字符(如未编码为%20的空格)时会请求失败
  • iOS App第一次安装启动后,会弹出是否允许联网的询问框,在用户点击同意前,调用联网API会失败。请注意判断这种情况。比如官方提供的新闻模板示例(HBuilderX新建项目可选择),会判断如果无法联网,则提供一个错误页,提示用户设置网络及下拉刷新重试。
  • 良好体验的App,还会判断当前是否处于飞行模式(参考)、是wifi还是3G(参考
  • 部分安卓设备,真机运行或debug模式下的网速,低于release模式很多。
  • 使用一些比较小众的证书机构(如:CFCA OV OCA)签发的 ssl 证书在安卓设备请求会失败,因为这些机构的根证书不在系统内置根证书库,可以更换其他常见机构签发的证书(如:Let's Encrypt),或者配置 sslVerify 为 false 关闭 ssl 证书验证(不推荐)。
  • 单次网络请求数据量建议控制在50K以下(仅指json数据,不含图片),过多数据应分页获取,以提升应用体验。


发送get请求


<template>
  <view>
    <button @click="sendGet">发送请求</button>
  </view>
</template>
<script>
  export default {
    methods: {
      sendGet () {
        uni.request({
          url: 'http://localhost:1000/user/getAll',
          success(res) {
            console.log(res)
                        console.log('我成功发送了请求')
          }
        })
      }
    }
  }
</script>


发送post请求


<template>
  <view>
    <button @click="sendPost">发送请求</button>
  </view>
</template>
<script>
  export default {
    methods: {
      sendPost () {
        uni.request({
          url: 'http://localhost:1000/user/getAll',
                    data: {
                 text: 'uni.request'
            },
                    method: 'POST',
          success(res) {
            console.log(res.data)
                        console.log('我成功发送了Post请求')
          }
        })
      }
    }
  }
</script>


相关文章
|
缓存 前端开发 JavaScript
第三章(概念篇) 微前端架构模式
第三章(概念篇) 微前端架构模式
297 0
|
移动开发 小程序 JavaScript
uni-app 跨端开发注意事项
uni-app 跨端开发注意事项
574 0
|
JSON 自然语言处理 JavaScript
JavaScript代码优化利器:从ES5到ES6(一)
JavaScript代码优化利器:从ES5到ES6
|
存储 前端开发
前端开发:Async/Await的使用详解
在ES7之前,了解到Promise是ES6为了解决异步回调而产生的解决方案,避免出现回调地狱(Callback Hell),那么ES7为什么又提出了新的Async/Await标准?问题答案就是:Promise虽然解决了异步嵌套的怪圈,使用表达清晰的链式表达;但是如果在实际开发过程中有些地方有大量的异步请求的时候,而且流程复杂嵌套的情况下,检查相关代码会发现一个比较尴尬。
1628 1
前端开发:Async/Await的使用详解
|
移动开发 JavaScript 小程序
uView Tabs 标签
uView Tabs 标签
376 0
|
分布式计算 大数据 调度
MaxCompute产品使用问题之如何解决UDF针对数据每行操作,而XGBoost需要对数据整体操作的问题
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
132 1
|
SQL 存储 关系型数据库
MySQL主从同步延迟原因与解决方法
MySQL主从同步延迟原因与解决方法
1386 0
|
安全 Serverless 网络安全
阿里云云效产品使用问题之如何拉取自建Git(未开放公网访问)中的代码
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
缓存 JavaScript 前端开发
若依框架---脚手架讲解
若依框架---脚手架讲解
372 0
|
Java 关系型数据库 数据库连接
Spring Boot 学习研究笔记(八) - Spring Data JPA与Hibernate区别及配置(2)
Spring Boot 学习研究笔记(八) - Spring Data JPA与Hibernate区别及配置
664 0