选择什么网络模块?

axios get请求传递json字符串 axios jsonp请求_json

jsonp

使用JSONP最主要的原因往往是为了解决跨域访问的问题.

JSONP的原理是什么呢?

JSONP的核心在于通过<script>标签的src来帮助我们请求数据. 原因是我们的项目部署在domain1.com服务器上时, 是不能直接访问domain2.com服务器上的资料的. 这个时候, 我们利用<script>标签的src帮助我们去服务器请求到数据, 将数据当做一个javascript的函数来执行, 并且执行的过程中传入我们需要的json. 所以, 封装jsonp的核心就在于我们监听window上的jsonp进行回调时的名称. 

jsonp封装

axios get请求传递json字符串 axios jsonp请求_json_02

 

axios get请求传递json字符串 axios jsonp请求_json_03

 

为什么选择axios?

在浏览器中发送 XMLHttpRequests 请求

在 node.js 中发送 http请求

支持 Promise API

拦截请求和响应

转换请求和响应数据 

安装:

npm install axios --save

axios请求方式

支持多种请求方式:

axios(config)

axios.request(config)

axios.get(url[, config])

axios.delete(url[, config])

axios.head(url[, config])

axios.post(url[, data[, config]])

axios.put(url[, data[, config]])

axios.patch(url[, data[, config]])

发送get请求演示

axios get请求传递json字符串 axios jsonp请求_网络请求_04

发送并发请求

使用axios.all, 可以放入多个请求的数组.

axios.all([]) 返回的结果是一个数组,使用 axios.spread 可将数组 [res1,res2] 展开为 res1, res2

// 2.axios发送并发请求
axios.all([axios({
  url: 'http://123.207.32.32:8000/home/multidata'
}), axios({
  url: 'http://123.207.32.32:8000/home/data',
  params: {
    type: 'sell',
    page: 5
  }
})]).then(results => {
  console.log(results);
  console.log(results[0]);
  console.log(results[1]);
})

// 3.使用全局的axios和对应的配置在进行网络请求
axios.defaults.baseURL = 'http://123.207.32.32:8000'
axios.defaults.timeout = 5000

axios.all([axios({
  url: '/home/multidata'
}), axios({
  url: '/home/data',
  params: {
    type: 'sell',
    page: 5
  }
})]).then(axios.spread((res1, res2) => {
  console.log(res1);
  console.log(res2);
}))

 常见的配置选项

axios get请求传递json字符串 axios jsonp请求_网络请求_05

axios的实例

使用

axios get请求传递json字符串 axios jsonp请求_json_06

 

axios封装

request.js

返回的是promise

axios get请求传递json字符串 axios jsonp请求_网络请求_07

所以,直接return就可以。 

import axios from 'axios'

export function request(config) {
  // 创建axios的实例
  const instance = axios.create({
    baseURL: 'http://123.207.32.32:8000',
    timeout: 5000
  })

  

  // 发送真正的网络请求
  return instance(config)
}

 main.js

import {request} from "./network/request";
import Vue from 'vue'
import App from './App'

import axios from 'axios'

Vue.config.productionTip = false

new Vue({
  el: '#app',
  render: h => h(App)
})
request({
  url: '/home/multidata'
}).then(res => {
  console.log(res);
}).catch(err => {
  // console.log(err);
})

如何使用拦截器?

axios提供了拦截器,用于我们在发送每次请求或者得到相应后,进行对应的处理。

axios get请求传递json字符串 axios jsonp请求_json_08

axios get请求传递json字符串 axios jsonp请求_json_09

 

axios get请求传递json字符串 axios jsonp请求_ios_10

 

拦截器可以做到:

axios get请求传递json字符串 axios jsonp请求_json_11

 响应拦截中完成的事情:

响应的成功拦截中,主要是对数据进行过滤。

axios get请求传递json字符串 axios jsonp请求_json_12

axios get请求传递json字符串 axios jsonp请求_ios_13

 

响应的失败拦截中,可以根据status判断报错的错误码,跳转到不同的错误提示页面。

axios get请求传递json字符串 axios jsonp请求_ios_14

export function request(config) {
  // 1.创建axios的实例
  const instance = axios.create({
    baseURL: 'http://123.207.32.32:8000',
    timeout: 5000
  })

  // 2.axios的拦截器
  // 2.1.请求拦截的作用
  instance.interceptors.request.use(config => {
    // console.log(config);
    // 1.比如config中的一些信息不符合服务器的要求

    // 2.比如每次发送网络请求时, 都希望在界面中显示一个请求的图标

    // 3.某些网络请求(比如登录(token)), 必须携带一些特殊的信息
    return config
  }, err => {
    // console.log(err);
  })

  // 2.2.响应拦截
  instance.interceptors.response.use(res => {
    // console.log(res);
    return res.data
  }, err => {
    console.log(err);
  })

  // 3.发送真正的网络请求
  return instance(config)
}