1. 程式人生 > >在vue中使用axios實現跨域請求並且設定返回的資料的格式是json格式,而不是jsonp格式

在vue中使用axios實現跨域請求並且設定返回的資料的格式是json格式,而不是jsonp格式

在vue中使用axios實現跨域請求

需求分析:在專案中需要抓取qq音樂的歌曲列表的資料,由於要請求資料的地址url=https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg。從qq音樂的官網上可以看到該請求的請求頭中的referer中的域名是y.qq.com(傳送請求頁面的域名),而host的域名是c.y.qq.com(被請求頁面的域名),由於兩者不一樣,所以不能通過前端直接傳送請求給qq伺服器去拿資料。這時候需要伺服器做一個代理:即前端向其所在域的伺服器傳送一個請求,然後所在域的伺服器向qq音樂所在域的伺服器傳送請求,所在域的伺服器拿到資料後,然後返回給前端。

在vue中使用axios實現跨域請求。axios 是一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。

中文手冊

下面介紹如何利用axios實現代理

1、首先使用npm安裝axios到本地專案中

npm install axios --save

2、然後,在build/webpack.dev.conf.js中引入axois


3、在在build/webpack.dev.conf.js檔案中的devServer物件新增屬性函式before(app){}


完整的程式碼如下

before(app){
      // 由於請求的referer和host不同,所以前端不能拿到資料,需要後端做一個代理
      //  後端向有資料的服務端傳送請求,拿到資料,然後前端在向自己的伺服器請求那資料
      //  這裡使用axios實現ajax請求:axios是一個基於promise的HTTP庫,可以用於瀏覽器和node.js
      // 在瀏覽器建立XMLHttpRequest物件,從node.js建立http請求
      app.get('/api/getDiscList',(req, res) => {//這裡的路徑是給前端傳送請求的url
        let url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg
        // axios傳送get請求,可以自己配置config
        axios.get(url, {
          headers: {
            'referer': 'https://c.y.qq.com/',
            'host': 'c.y.qq.com',
          },
          //  params是即將與請求一起傳送的url引數,無格式物件/URLSearchParams物件
          params: req.quest
        }).then((response) => {
          res.json(response.data)  //返回資料
        }).catch((error) => {
          console.log(error)
        })
      })
    }

4、在前端書寫js程式碼

1)定義一個recommend.js檔案,內容如下

import axios from 'axios'
//獲取歌曲列表的資料
//由於這裡使用了代理請求,所以前端的請求要改成ajax請求
export function getDisList() {
  const url = '/api/getDiscList'
  const data = {
    picmid: 1,
    rnd: Math.random(),
    g_tk: 5381,
    jsonpCallback: 'getPlaylist',
    loginUin: '0',
    hostUin: 0,
    format: 'json',
    inCharset: 'utf8',
    outCharse: 'utf-8',
    notice: 0,
    platform: 'yqq',
    needNewCode: 0,
    categoryId: 10000000,
    sortId: 5,
    sin: 0,
    ein: 29
  }
  //使用ajax請求,這裡用axios
  return axios.get(url, {
    params: data
  }).then((res) => {
    //  成功返回一個Promise物件
    return Promise.resolve(res.data)
  }).catch((error) => {
    console.log(error)
  })
}

2)在recommend.vue檔案的<script>中書寫下面內容

<script>
import {getDisList} from '../../api/recommend'
export default {
  //  獲取資料
  created() {
    this._getDiscList()
  },
  methods: {
    //  獲取歌單列表的資料
    _getDiscList() {
      getDisList().then((res) => {
        console.log(res)
      })
    }
  }
}
</script>

5、在瀏覽器console.log()輸出的內容

'MusicJsonCallback({"code":0,"subcode":0,"message":"","default":0,"data":{"uin":0,"categoryId":0,"sortId":5,"sum":0,"sin":0,"ein":0,"list":[]}})'

即輸出的是jsonp的格式,即字串

6、將返回的資料設定成json的格式:由於返回的資料是字串,那麼可以對其進行擷取,在利用JSON.parse()將字串轉換成json的形式

<script>
import {getDisList} from '../../api/recommend'
export default {
  //  獲取資料
  created() {
    this._getDiscList()
  },
  methods: {
    //  獲取歌單列表的資料
    _getDiscList() {
      getDisList().then((res) => {
        console.log(res)
        let num1 = res.indexOf('(')
        let num2 = res.indexOf(')')
        let resultData = JSON.parse(res.substring(num1 + 1, num2))
        console.log(typeof(resultData))
        console.log(resultData)
      })
    }
  }
}
</script>

輸出如下


以上大概就是利用axios實現服務端的代理請求

相關推薦

vue使用axios實現請求並且設定返回資料格式json格式jsonp格式

在vue中使用axios實現跨域請求需求分析:在專案中需要抓取qq音樂的歌曲列表的資料,由於要請求資料的地址url=https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg。從qq音樂的官網上可以看到該請求的請求

vue使用axios實現請求

一、首先安裝npm安裝axios$ npm i axios -S二、配置vue-cli->config->index->proxyTableproxyTable: { "/api":{ target:"http://api.douban.com"

axios實現請求

在使用vue.js進行開發,我們會遇到跨域請求的情況,這裡記錄下自己所遇到的情況。 使用的是目前主流的axios進行請求,首先開啟config資料夾下的index檔案,在proxyTable裡面新增程式碼 proxyTable: { '/api': { t

vueaxios解決問題和攔截器使用

vue中axios不支援vue.use()方式宣告使用。 所以有兩種方法可以解決這點: 第一種: 在main.js中引入axios,然後將其設定為vue原型鏈上的屬性,這樣在元件中就可以直接 this.axios使用了 import axios fro

vue-cli項目本地代理實現請求

con 跨域 請求 AR url 本地 dex ams gin   使用 Vue-cli 創建的項目,開發地址是 localhost:8080,需要訪問非本機上的接口http://10.1.0.34:8000/queryRole。不同域名之間的訪問,需要跨域才能正確請求。跨

Vue前端服務代理實現請求資料

開發中請求真實伺服器資料,配置伺服器代理實現跨域。 vue-cli + webpack 構建的專案 再 ./config/index.js 檔案中配置 proxyTable: { '/api':{ target: 'http://請求的伺服器地址',

Vue實現請求

實現跨域請求有兩種方式: 1、fetch (1)在App.vue中使用created方法建立fetch,將域名及方法等建立,如下圖 (2)在config配置檔案中的index.js中的跨域區域中寫入如下程式碼: (3)完善資訊,將介面相應的需求補充完整

Vue前端配置代理實現請求

跨域的解決方法:         *設定讓伺服器允許跨域         *前端配置代理實現跨域請求 本文介紹前端配置代理實現跨域請求:  在專案config資料

vue-cli開發環境實現請求

前端開發時,請求後臺介面經常需要跨域,vue-cli實現跨域請求只需要開啟config/index.js,修改如下內容即可。 //例如要請求的介面url為http://172.3.2.1:8000/look/1 module.exports = {

Vue 2.x 如何利用proxyTable實現請求(反向代理)

在專案執行的時候嗎,不可缺少就是的設定反向代理的 詳細的文件 http-proxy-middleware 下載的官方的腳手架開啟檔案的build/dev-server.js 搜尋:(這個外掛官方

jQueryAjax+Spring MVC實現請求

          專案開發中,某個可獨立、也可整合的子業務模組需要向外開放相關API介面,先說下專案本身使用了jersery來實現RESTful webservice以名詞形式釋出API。有意思的

使用vue.js和axios解決請求問題

使用jsonp可以跨域請求,但是jsonp只能夠用get方式跨域。其他跨域方式大多都要伺服器支援。 使用vue.js和axios能解決get/post方式的跨域。但需要vue.js/node.js的基礎知識。具體操作如下: 1、使用vue-cli腳手架建立一

vue proxyTable 接口請求調試(五)

cau tsp {} war 遠程服務 調試 設置代理 row web 在不同域之間訪問是比較常見,在本地調試訪問遠程服務器。。。。這就是有域問題。 VUE解決通過proxyTable: 在 config/index.js 配置文件中 dev: { env:

利用jsonp實現請求

get p地址 doc ajax請求 -s tar 原理 安全策略 都是   同源策略,它是由Netscape提出的一個著名的安全策略。現在所有支持JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,域名,協議,端口相同。當一個瀏覽器的兩個tab頁中分別打開來 百

ajax獲取json數據及實現請求

cgi size 域名 3.2 方便 nap 不清楚 anti dex 最近想練習一下ajax獲取json數據 , 首先上網找一些在線的可用來測試的接口. -----------------------------------------------------這裏是接口分

[轉] 利用CORS實現請求

src 流程圖 exp 否則 expose 前端 eof 目前 star [From] http://newhtml.net/using-cors/ 跨域請求一直是網頁編程中的一個難題,在過去,絕大多數人都傾向於使用JSONP來解決這一問題。不過現在,我們可以考慮一下

Java Web應用支持請求

通過 sca info def gist time 並且 tomcat json 轉載:https://blog.csdn.net/lmy86263/article/details/51724221 由於工程合作開發的需要,後臺的應用要能支持跨域訪問,但是在這個跨域

django配置允許請求

apps ons token middle red href clas cors nbsp 對於django 安裝django-cors-headers,詳情請看官方文檔 pip install django-cors-headers    配置settings.py

八種方式實現請求

防範 erro create ati brush col html5新特性 ole als 瀏覽器的同源策略 ? 提到跨域不能不先說一下”同源策略”。 ? 何為同源?只有當協議、端口、和域名都相同的頁面,則兩個頁面具有相同的源。只要網站的 協議名protocol、 主

WebAPI實現請求

一、跨域問題的由來     目前專案實現前後端分離,所以就會那麼此時前端和後端分別在不同的伺服器上,此時就會涉及到跨域問題。再具體說明一下。 1.前後端未分離:原來我們的積分系統採用MVC框架,整個系統的前端以及後端邏輯都在一個解決方案中,此時我們稱之為前後端沒有分離。