在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)

‘use strict‘

import axios from ‘axios‘
// import qs from ‘qs‘
import { Notification} from ‘element-ui‘  //使用elementui的提示显示
import { Loading } from ‘element-ui‘
import router from "../router";

let loading

function startLoading() {
  loading = Loading.service({
    lock: true,
    text: ‘加载中……‘,
    background: ‘rgba(0, 0, 0, 0.2)‘,
  })
}

function endLoading() {
  loading.close()
}

let needLoadingRequestCount = 0
export function showFullScreenLoading() {
  if (needLoadingRequestCount === 0) {
    startLoading()
  }
  needLoadingRequestCount++
}

export function tryHideFullScreenLoading() {
  if (needLoadingRequestCount <= 0) return
  needLoadingRequestCount--
  if (needLoadingRequestCount === 0) {
    // setTimeout(()=>{
    endLoading()
    // },1000)
  }
}
axios.interceptors.request.use(config => {
  showFullScreenLoading()
  return config
}, err => {
  return Promise.resolve(err)
})

axios.interceptors.response.use(response => {
  tryHideFullScreenLoading()
  if (response) {
    switch (response.data.code) {
      case 4011: //与后台约定登录失效的返回码,根据实际情况处理
        sessionStorage.removeItem(‘‘);
        sessionStorage.removeItem(‘‘);
        router.replace({
          path: ‘/‘
        })
    }
  }
  return response
}, err => {
  return Promise.resolve(err)
})

let base = ‘‘    // 接口地址

export const postRequest = (url, params,Func,isJson) => {   //url: 接口名 ,params: 参数 ,Func: 直接取得内容data,isJson:决定取哪种格式
  request(url, params,‘post‘,Func,isJson)
}
export const request = (url, params,method,Func,isJson) => {
  axios({
    method: method,
    url: `${base}${url}`,
    data: params,
    timeout: 6000,    // 格式的转化
    transformRequest: [function (data) {
      let ret = ‘‘
      for (let it in data) {
        if(isJson === 1 ){
          ret =  data[it]
        }else{
          ret += encodeURIComponent(it) + ‘=‘ + encodeURIComponent(data[it]) + ‘&‘
        }
      }
      return ret
    }],

    // 请求头携带信息,类型默认为form,键值模式,传参为1
    headers: {
      ‘Content-Type‘:  isJson === 1 ? ‘application/json‘ : ‘application/x-www-form-urlencoded‘,
      ‘authorization‘: sessionStorage.getItem(‘‘),
      ‘token‘: sessionStorage.getItem(‘token‘)
    }
  }).then(data=>{
    if (data.data.code === 200) {
      Func(data.data.data)
    }else if(data.data.code === 406){
      Notification.info({
        title: ‘错误‘,
        message: data.data.message
      })
    }else if(data.data.code === 4011){
      sessionStorage.removeItem(‘‘);
      sessionStorage.removeItem(‘‘);
      // window.location.href = ‘/‘
    }else if(data.data.code === 4012){
      request(‘‘,{
        ‘authorization‘: sessionStorage.getItem(‘‘),
        ‘refresh_token‘: sessionStorage.getItem(‘‘)
      },‘post‘,(res)=>{
        //缓存新的token
        console.log(res)
        let token = res.token;
        sessionStorage.setItem("token", token);
        request(url, params,method,Func);
      });

    }else if(data.data.code === 400 || data.data.code === 505 || data.data.code === 404|| data.data.code === 500){
      Notification.error({
        title: ‘错误‘,
        message: ‘网络异常‘
      })
    }else{
      Func1(data.data.code,data.data.message);
    }
  })
}
export const uploadFileRequest = (url, params) => {
  return axios({
    method: ‘post‘,
    url: `${base}${url}`,
    data: params,
    headers: {
      ‘Content-Type‘: ‘multipart/form-data‘,     //上传文件的传输格式
      ‘authorization‘: sessionStorage.getItem(‘userName‘),
      ‘token‘: sessionStorage.getItem(‘token‘)
    }
  })
}
// 方式1,
export const getRequest = (url, params,Func,isJson) => {
  request(url, params,‘get‘,Func,isJson)
}

// 方式2
export const getRequest = (url,params,Func) => {  return axios({    method: ‘get‘,    url: `${base}${url}`,    headers: {      ‘Content-Type‘: ‘multipart/form-data‘,      ‘authorization‘:sessionStorage.getItem(‘‘),      ‘token‘:sessionStorage.getItem(‘token‘)    }  }).then(data=>{    if (data.data.code === 200) {      Func(data.data.data)    }  })}
 

原文地址:https://www.cnblogs.com/panax/p/11088474.html

时间: 2024-11-10 14:28:07

在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)的相关文章

Swift &amp; Objc 在同一个项目中的使用

在WWDC大会中发布了Swift让人眼前一亮.终于加了很多的现代编程语言该有的东西.很早年以前玩C#3.0+的时候这些差不多类似的 已经用的烂熟的东西终于一点一点的在看Swift Programming Language的时候再唤醒. Swift较之于OC(Objective-C)在愈发上几乎是一门新的语言了,幸运的是Swift和OC都是出自苹果大家庭,还能在一张桌子上吃饭.也就是说在升级项目 的时候你可以考虑使用Swift开发新的功能,调用已有的部分或者被已有的部分调用.或者在Swift开发的

【RocketMQ】同一个项目中,同一个topic,可以通过不同的tag来订阅消息吗?

一.问题答案 是不可以的 而且后注册的会替换前注册的,MqConsumer2会替换MqConsumer,并且只结束tag-2的消息 /** * @date 2019/05/28 */ @Component @Slf4j public class MqConsumer implements MessageConsumer { @Override @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUI

解决vue项目eslint校验 Do not use &#39;new&#39; for side effects 的两种方法

import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ el: '#app', render: h => h(App), router }) 当使用eslint校验运行上面这段代码时(该代码在src/main.js文件中),会报错 ?  http://eslint.org/docs/rules/no-new  Do not use 'new' for side effect

QT断点续传(原理:需要在HTTP请求的header中添加Rang节,告诉服务器从文件的那个位置开始传输.格式为bytes 开始传输的位置)

//功能:    根据一个URL地址将数据保存到指定路径下,支持断点续传//参数:    url            --需要访问的URL地址//         SavePath       --需要保存的路径//DownedSize 已经下载的大小// totalSize 文件总大小//返回值:  ture --成功 false --失败bool HttpGet::DownFile(const QUrl &url,const QString &SavePath,int DownedS

MyEclipse10中两种FreeMarker插件的安装与配置

--------------------非原创 第一个插件是:freemarker-ideMyEclipce10.0中安装FreeMarker插件,这绝对是最简单的方法.步骤如下:(一)打开http://sourceforge.net/projects/freemarker-ide/files/ 下载最新版本,目前本人下载时最新版本是:freemarker-ide-0.9.14(二)将其解压,将hudson.freemarker_ide_0.9.14文件夹放入MyEclipse安装目录dropi

同一个项目中存在完全相同的包名和类名如何解决调用问题

项目中遇到有一个类,在两个jar包中都存在,而且类所在的包名和类名完全一致,解决办法有两种: 1.常用办法 清除项目中过时的那个jar包,推荐方式. 2.如果两个都不能清除,则在使用过程中动态指定加载的jar包即可.以rt.jar中javax.xml.ws.Service为例,代码如下 File file = new File("f:\\rt.jar"); URL url = file.toURI().toURL(); ClassLoader classLoader = new URL

application/json 与 application/x-www-form-urlencoded的简单比较

application/x-www-form-urlencoded 提交请求示例 curl -X POST 'http://localhost:8080/formPost' -d 'id=1&name=foo&mobile=13612345678' wireshark抓包结果 对应的服务端解析参数源码 //org.springframework.web.method.annotation.RequestParamMethodArgumentResolver#resolveName if (

在Activity中响应ListView内部按钮的点击事件的两种方法

转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在Adapter中响应? 对于这个问题,我最初给他的解答是,在Adapter中定义一个回调接口,在Activity中实现该接口,从而实现对点击事件的响应. 下班后思考了一下,觉得有两种方式都能比较好的实现:使用接口回调和使用抽象类回调. 正好可以复习一下接口和抽象类的区别,于是写了两个Demo: 1.

Spring中IoC - 两种ApplicationContext加载Bean的配置

说明:Spring IoC其实就是在Service的实现中定义了一些以来的策略类,这些策略类不是通过 初始化.Setter.工厂方法来确定的.而是通过一个叫做上下文的(ApplicationContext)组建来加载进来的.这里介绍两种Context组建的构件过程 前提条件:在Gradle工程的build.gradle文件中引入对Spring framework 的支持 repositories { mavenCentral() } dependencies { compile group: '