2017-09-03 88 views
1

我有一個使用Django Rest Framework的API設置。當通過cURL或HTTPie甚至可瀏覽的API訪問時,它工作正常。 API具有令牌認證,因此最初必須提供將返回令牌的憑證。使用HTTPie(甚至捲曲),你可以這樣做:使用Javascript訪問Django Rest框架API - 獲取令牌

http POST http://127.0.0.1:8000/api/v1/api-token-auth/ username="user1" password="testpassword" 

這將返回響應例如:

HTTP/1.0 200 OK 
Allow: POST, OPTIONS 
Content-Type: application/json 
Date: Sun, 03 Sep 2017 16:57:38 GMT 
Server: WSGIServer/0.2 CPython/3.6.1 
X-Frame-Options: SAMEORIGIN 

{ 
    "token": "fgfdgfdgfdgfdgd45345345lkjlj" 
} 

你會再取令牌和執行GET/PUSH /等等,像這樣:

http --json POST http://127.0.0.1:8000/api/v1/test/ test_text="Testing" 'Authorization: Token fgfdgfdgfdgfdgd45345345lkjlj' 

我一直在谷歌目前正在尋找了一段時間,並不能找到任何明確的答案爲以上兩行如何轉化成JavaScript?我如何(1)通過憑證來獲取令牌; (2)檢索令牌; (3)使用令牌發出GET和PUSH請求?

+1

你使用特定的框架/庫嗎? – bryan60

+0

Hi @ bryan60,我沒有使用任何特定的Javascript庫。我很高興使用任何JS庫完成工作。 – shaz

+0

您無法使用post方法在url中發送數據。您需要以標題中的鍵值對的形式傳遞憑證。 –

回答

2

我同意你應該使用Ajax。

你需要在你一開始Ajax調用應用程序:

var data = {username:'user',password:'password'} 

$.ajax({ 
     type: 'POST', 
     data: data, 
     url: 'http://your_url', 
     success: function(res){ 
       console.log(res) 
       $.ajaxSetup({ 
        headers: { 
        "token": res.token 
        } 
       }); 
     }, 
     error: function(error) { 
      callbackErr(error,self) 
     } 
    }) 

Haven`t測試,但想法是使用Ajax調用獲得令牌,並使用.ajaxSetup令牌保存到所有遵循ajax請求的頭文件。

的,你可以這樣做:

var data = {test_text="Testing"} 
$.ajax({ 
      type: 'POST', 
      data: data, 
      url: 'http://127.0.0.1:8000/api/v1/test/', 
      success: function(res){ 
        console.log(res) //answer of api call. 
        }); 
      }, 
      error: function(error) { 
       callbackErr(error,self) 
      } 
     }) 

或者這樣:

$.ajax({ 
      type: 'GET', 
      url: 'http://127.0.0.1:8000/api/v1/ANOTHER_TES/', 
      success: function(res){ 
        console.log(res) //answer of api call. 
        }); 
      }, 
      error: function(error) { 
       callbackErr(error,self) 
      } 
     }) 

改變呼叫的type參數來改變你的要求。

+0

謝謝@Tico,所以這段代碼返回的是一個很好的令牌,它回答了我的問題中的第1點和第2點,但是我不清楚令牌如何你可以給出一個基本的例子嗎?假設只有一個字段需要GET/PUSH:test_text。 – shaz

+0

非常好,我回答我的問題,非常感謝! – shaz

2

查看@ Tico的回答。

我該如何(1)通過憑證來獲取令牌; (2)檢索令牌; (3)使用令牌發出GET和PUSH請求?

$.ajax({ 
    type: 'POST', 
    data: { 
    username: "user1", 
    password: "testpassword" 
    }, 
    url: 'http://127.0.0.1:8000/api/v1/api-token-auth/', 
    success: function(res){ 
      $.ajaxSetup({ 
       headers: { 
       "token": res.token 
       }}); 
      $.ajax({ 
       type: 'POST', 
       data: { 
        test_text: "Testing" 
       }, 
       url: 'http://127.0.0.1:8000/api/v1/test/', 
       success: function(res){ 
        alert(res); 
       }}); 

    } 
}); 
+0

剛剛使用代碼返回:'Data:[object Object]'。但是,如果我做'alert(「Data:」+ data.token'我得到一個令牌返回。我如何檢索並將其存儲在一個變量,所以我可以稍後使用它?做'var atoken = data.token'產生一個空變量 – shaz

+0

你能告訴你響應對象的結構是什麼 –

1

作爲post,get或其他任何url調用都是異步調用。所以爲了保持程序流程併發布帖子請求,你需要使用js的promise功能,這將使你的post調用同步。 js promise description

var data = {username:'user',password:'password'} 

$.ajax({ 
     type: 'POST', 
     data: data, 
     url: 'http://your_url', 
     success: function(res){ 
       console.log(res) 
       $.ajaxSetup({ 
        headers: { 
        "token": res.token 
        } 
       }); 
     }, 
     error: function(error) { 
      callbackErr(error,self) 
     } 
    }) 

該代碼將正常工作,如果你使用這個在你的程序的開始,但這是異步的,讓它與你的程序,你需要使用承諾同步。 對於你的問題的第三部分,你需要這樣做...

$.ajax({ 
     type: 'GET', 
     url: 'http://your_url' + "/token=" + your_token, 
     success: function(res){ 
       console.log(res) 
     }, 
     error: function(error) { 
      callbackErr(error,self) 
     } 
    }) 
相關問題