1. 程式人生 > >Vue使用axios傳送post請求,後端無法接收怎麼處理?(Djnago後臺)

Vue使用axios傳送post請求,後端無法接收怎麼處理?(Djnago後臺)

      今天終於解決了一個困擾很久的問題,在使用Vue進行前端專案的搭建時,通常採用axios作為資料傳輸的工具,我們會發現,使用get請求一切都正常,但是使用post請求,會發生一些奇怪的事情。這次我使用的是python的web框架django,但道理都是一樣的,我們可以通過修改前端來處理,也可以通過修改後端來處理。

一、我們先用GET方法寫一個小小的登陸請求:

下面是Vue前端的程式碼

loginsubmit(){
    console.log(this.UserName+this.UserPwd);
    axios.get("http://localhost:8000/baseapi/login",{
        params:{
            userid:"zhonghangAlex",
            password:"woaini123"
        }
    }).then((response)=>{
        let res = response.data;
        console.log(res);
        this.$router.push('/user/userindex')
    });
}

結果發現請求是正常的:

後臺的介面是這樣的:

def login(request):
    if request.method == 'POST':
        return HttpResponse('{"status":"0","message":"請使用GET請求","result":"null"}')
    elif request.method == 'GET':
        req_userid = request.GET.get('userid')
        req_password = request.GET.get('password')
        if req_userid and req_password:
            try:
                login_obj = models.T_user_info.objects.filter(userid = req_userid,password = req_password).first()
            except:
                return HttpResponse('{"status":"0","message":"使用者名稱或密碼錯誤","result":"null"}')
            else:
                request.session['userid'] = login_obj.userid
                request.session['power'] = login_obj.power
                return HttpResponse('{"status":"1","message":"登陸成功","result":{"power":"'+str(login_obj.power)+'"}}')
        else:
            HttpResponse('{"status":"0","message":"輸入有誤,請重新輸入","result":"null"}')

後臺可以獲取get請求的鍵值對,簡單而言:

?userid=zhonghangAlex&password=woaini123這樣的欄位傳送過去,後端進行鍵值對獲取,下面是後臺獲取資料的核心程式碼

req_userid = request.GET.get('userid')
req_password = request.GET.get('password')

一切都很正常,但是登陸的請求為了保障安全性,應該採用post,這個時候我們再看看會發生什麼?

二、使用POST方法寫一個登陸請求:

下面是Vue前端的程式碼:

loginsubmit(){
   console.log(this.UserName+this.UserPwd);
   axios.post("http://localhost:8000/baseapi/login",{
       userid:"zhonghangAlex",
       password:"woaini123"
   }).then((response)=>{
       let res = response.data;
       console.log(res);
       this.$router.push('/user/userindex')
   });

}

結果這個時候請求變成了這樣:

資料變成了類json進行傳輸而且資料請求的方式也發生了變化,上面變成了Request Payload

這個時候資料無法解析成?userid=zhonghangAlex&password=woaini123這樣的欄位,我們如果使用:

req_userid = request.POST.get('userid')
req_password = request.POST.get('password')

這樣的後臺資料獲取方式,就會發生異常,那麼應該如何處理呢?

三、兩種解決方案

(一)前端解決:

使用URLSearchParams傳遞引數,網上大多數都是這樣的方法:

import axios = import('axios');
let param = new URLSearchParams();
param.append("userid", "zhonghangAlex");
param.append("password", "woaini123");

axios.post('xxxxx', param).then(.....)

       果然我們傳遞的引數就正常了,後臺可以獲取到相應的鍵值對,但是使用這樣的方法有兩點壞處,第一個是前端請求每一個欄位都append會很麻煩,第二個就是這個物件它不相容IE和Edge甚至在360瀏覽器都會掛掉,我曾經嘗試過IE11版本都不行,提示這個物件缺失。所以我們最好的辦法就是在後端做一個處理!

(二)後端解決

      經過查閱大量的資料,我發現,正如我前面說過的,get請求傳送的是很標準的鍵值對,資料可以被後端解析,那為什麼後端不能解析json格式的post資料呢?按照這個思路我研究了下request的api,發現這個json是封裝到body中的,所以,在後端的呼叫應該使用body物件。話不多說,直接上程式碼:

def login(request):
    if request.method == 'GET':
        return HttpResponse('{"status":"0","message":"請使用post請求","result":"null"}')
    elif request.method == 'POST':
        req = json.loads(request.body)
        req_userid = req['userid']
        req_password = req['password']
        if req_userid and req_password:
            try:
                login_obj = models.T_user_info.objects.filter(userid = req_userid,password = req_password).first()
            except:
                return HttpResponse('{"status":"0","message":"使用者名稱或密碼錯誤","result":"null"}')
            else:
                request.session['userid'] = login_obj.userid
                request.session['power'] = login_obj.power
                return HttpResponse('{"status":"1","message":"登陸成功","result":{"power":"'+str(login_obj.power)+'"}}')
        else:
            HttpResponse('{"status":"0","message":"輸入有誤,請重新輸入","result":"null"}')

這就是後端處理的辦法,核心的程式碼是:

req = json.loads(request.body)
req_userid = req['userid']
req_password = req['password']

這樣req_userid和req_password就分別儲存了前端發來的資料。

在前端時間我使用node的時候也是一樣的,post請求的資料會封裝到request的body中,所以不管你採用什麼樣的語言寫後臺,這個問題總是可以在後臺解決的。