axios 封裝和使用

固然不限於此種寫法,還有其餘的寫法可網上搜索axios封裝參考
//api/axios.jsios

import axios from 'axios'
import {message} from 'antd'ajax

export default function ajax(url, data={}, type='GET') {json

return new Promise((resolve, reject) => {axios

let promise
// 1. 執行異步ajax請求
if(type==='GET') { // 發GET請求
  promise = axios.get(url, { // 配置對象
    params: data // 指定請求參數
  })
} else { // 發POST請求
  promise = axios.post(url, data)
}
// 2. 若是成功了, 調用resolve(value)
promise.then(response => {
  resolve(response.data)
// 3. 若是失敗了, 不調用reject(reason), 而是提示異常信息
}).catch(error => {
  // reject(error)
  message.error('請求出錯了: ' + error.message)
})

})api

}跨域

// api/index.js
/*
要求: 能根據接口文檔定義接口請求
包含應用中全部接口請求函數的模塊
每一個函數的返回值都是promisepromise

基本要求: 能根據接口文檔定義接口請求函數
*/
import jsonp from 'jsonp'
import {message} from 'antd'
import ajax from './ajax'瀏覽器

// const BASE = 'http://localhost:5000'
const BASE = ''
// 登錄
/*
export function reqLogin(username, password) {
return ajax('/login', {username, password}, 'POST')
}*/
export const reqLogin = (username, password) => ajax(BASE + '/login', {username, password}, 'POST')服務器

// 獲取一級/二級分類的列表
export const reqCategorys = (parentId) => ajax(BASE + '/manage/category/list', {parentId})antd

// 添加分類
export const reqAddCategory = (categoryName, parentId) => ajax(BASE + '/manage/category/add', {categoryName, parentId}, 'POST')

// 更新分類
export const reqUpdateCategory = ({categoryId, categoryName}) => ajax(BASE + '/manage/category/update', {categoryId, categoryName}, 'POST')

// 獲取一個分類
export const reqCategory = (categoryId) => ajax(BASE + '/manage/category/info', {categoryId})

// 獲取商品分頁列表
export const reqProducts = (pageNum, pageSize) => ajax(BASE + '/manage/product/list', {pageNum, pageSize})

// 更新商品的狀態(上架/下架)
export const reqUpdateStatus = (productId, status) => ajax(BASE + '/manage/product/updateStatus', {productId, status}, 'POST')

/*
搜索商品分頁列表 (根據商品名稱/商品描述)
searchType: 搜索的類型, productName/productDesc
*/
export const reqSearchProducts = ({pageNum, pageSize, searchName, searchType}) => ajax(BASE + '/manage/product/search', {
pageNum,
pageSize,

})

// 搜索商品分頁列表 (根據商品描述)
/*export const reqSearchProducts2 = ({pageNum, pageSize, searchName}) => ajax(BASE + '/manage/product/search', {
pageNum,
pageSize,
productDesc: searchName,
})*/

// 刪除指定名稱的圖片
export const reqDeleteImg = (name) => ajax(BASE + '/manage/img/delete', {name}, 'POST')

// 添加/修改商品
export const reqAddOrUpdateProduct = (product) => ajax(BASE + '/manage/product/' + ( product._id?'update':'add'), product, 'POST')
// 修改商品
// export const reqUpdateProduct = (product) => ajax(BASE + '/manage/product/update', product, 'POST')

// 獲取全部角色的列表
export const reqRoles = () => ajax(BASE + '/manage/role/list')
// 添加角色
export const reqAddRole = (roleName) => ajax(BASE + '/manage/role/add', {roleName}, 'POST')
// 添加角色
export const reqUpdateRole = (role) => ajax(BASE + '/manage/role/update', role, 'POST')

// 獲取全部用戶的列表
export const reqUsers = () => ajax(BASE + '/manage/user/list')
// 刪除指定用戶
export const reqDeleteUser = (userId) => ajax(BASE + '/manage/user/delete', {userId}, 'POST')
// 添加/更新用戶
export const reqAddOrUpdateUser = (user) => ajax(BASE + '/manage/user/'+(user._id ? 'update' : 'add'), user, 'POST')

/*
json請求的接口請求函數
*/
export const reqWeather = (city) => {

return new Promise((resolve, reject) => {

const url = `http://api.map.baidu.com/telematics/v3/weather?location=${city}&output=json&ak=3p49MVra6urFRGOT9s8UBWr2`
// 發送jsonp請求
jsonp(url, {}, (err, data) => {
  console.log('jsonp()', err, data)
  // 若是成功了
  if (!err && data.status==='success') {
    // 取出須要的數據
    const {dayPictureUrl, weather} = data.results[0].weather_data[0]
    resolve({dayPictureUrl, weather})
  } else {
    // 若是失敗了
    message.error('獲取天氣信息失敗!')
  }

})

})
}
// reqWeather('北京')
/*
jsonp解決ajax跨域的原理
1). jsonp只能解決GET類型的ajax請求跨域問題
2). jsonp請求不是ajax請求, 而是通常的get請求
3). 基本原理
瀏覽器端:

動態生成<script>來請求後臺接口(src就是接口的url)
  定義好用於接收響應數據的函數(fn), 並將函數名經過請求參數提交給後臺(如: callback=fn)

服務器端:

接收到請求處理產生結果數據後, 返回一個函數調用的js代碼, 並將結果數據做爲實參傳入函數調用

瀏覽器端:

收到響應自動執行函數調用的js代碼, 也就執行了提早定義好的回調函數, 並獲得了須要的結果數據

*/

相關文章
相關標籤/搜索