uniapp发起网络请求

1,516 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

前言

在uniapp中实现网络请求是如何实现的呢?在官方的API文档中的网络那一块就有个发起请求,如果想发起网络请求调用uni.request这个方法就ok了,在这个方法里去配置一些参数:接口地址请求的参数请求头等等。然后通过success回调就可以拿到返回的数据

图片.png

发起请求

创建了一个按钮并绑定了click事件,点击按钮的时候就去触发点击事件发起网络请求

get(){
    uni.request({
        url:'http://localhost:3000/search/hot/detail', //接口地址
        method:"GET", //请求类型,默认GET请求
        timeout:5000, //超时时间
        success(res) { //成功回调
            console.log('请求成功',res);
        }
    })
}

可以看到点击按钮时成功发起了网络请求,获取到了返回的数据

图片.png

当我们需要发起网络请求的时候需要请求参数可以通过配置data参数或者直接在url接口地址拼接上需要请求的参数,data最终发送给服务器的数据是String类型,如果传入的不是String类型会被转换成String类型,转换规则:

  • GET方法,会将数据转换为 query string,例如 {keywords:'海阔天空'} 转换后的结果是 keywords=海阔天空
  • POST方法且header['content-type']为 application/json 的数据,会进行 JSON 序列化
  • POST方法且header['content-type']为 application/x-www-form-urlencoded 的数据,会将数据转换为 query string
get(){
    uni.request({
        url:'http://localhost:3000/search',
        data:{ //设置data配置需要请求的参数
                keywords:'海阔天空'
        },
        success(res) {
                console.log('请求成功',res);
        }
    })
}

get(){
    uni.request({
        url:'http://localhost:3000/search?keywords=海阔天空', //url接口地址拼接请求参数
        success(res) {
                console.log('请求成功',res);
        }
    })
}

封装网络请求

在实际开发中,如果每一次发送请求请求地址,超时时间,请求头等这些重复的操作都写一遍,不仅浪费时间,维护性也不好,所以我们要对uni.request进行封装

但是获取网络请求的异步回调结果用的是callbck函数的方式,这是一个不好的现象,封装的每一层都要传入callback回调函数容易造成回调地狱,可以使用promise封装起来,就不用层层传入了,只要一直return到上一层,直到在page页面你需要回调结果了,再获取这个promise对象,再通过promise对象的then方法获取网络请求的结果

新建一个url.js和request.js。url.js导出服务器地址request.js封装网络请求

//url.js
export const Apiurl='http://localhost:3000/'

//request.js
import {Apiurl} from '@/common/js/url.js' //导入服务器地址

export function fdPost(url,data={}) {
    return new Promise((resolve, reject)=>{
        uni.request({
            url: Apiurl + url,
            method: 'POST',
            header: {'content-type':'application/x-www-form-urlencoded'},
            data: data,
            success: (res)=>{
                resolve(res.data);
            },
            fail: (err)=>{
                reject(err)
            }
        })
    })
}

封装好之后在main.js里挂载到vue实例上,就可以在page页面调用封装好的uni.request方法,可以看到成功发起了网络请求而且代码也简介了很多

//main.js
import {fdPost} from '@/common/js/request.js'
Vue.prototype.$post = fdPost

//page页面
get(){
    this.$post('search',{keywords:'海阔天空'}).then(res=>{
        console.log(res);
    })
}

2.gif