Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript访问Django Rest框架API-获取令牌_Javascript_Django_Django Rest Framework - Fatal编程技术网

使用Javascript访问Django Rest框架API-获取令牌

使用Javascript访问Django Rest框架API-获取令牌,javascript,django,django-rest-framework,Javascript,Django,Django Rest Framework,我有一个使用Django Rest框架的API设置。当通过cURL或HTTPie甚至可浏览的API进行访问时,它工作良好。API具有令牌身份验证,因此最初您必须提供将返回令牌的凭据。使用HTTPie(甚至curl),您可以执行以下操作: http POST http://127.0.0.1:8000/api/v1/api-token-auth/ username="user1" password="testpassword" 这将返回一个响应,例如: HTTP/1.0 200 OK Allow

我有一个使用Django Rest框架的API设置。当通过cURL或HTTPie甚至可浏览的API进行访问时,它工作良好。API具有令牌身份验证,因此最初您必须提供将返回令牌的凭据。使用HTTPie(甚至curl),您可以执行以下操作:

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/etc,如下所示:

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

我已经在谷歌上搜索了一段时间了,对于上面两行如何翻译成Javascript,我找不到任何明确的答案?如何(1)通过凭证获取令牌;(2) 检索令牌;(3) 使用令牌发出GET和PUSH请求?

我同意您应该使用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)
       }
   })
还没有测试过,但想法是使用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)
           }
       })

更改调用的
类型
参数以更改您的请求

post、get或任何其他url调用都是异步调用。因此,为了维护程序流程并发出post请求,您需要使用js的promise特性,这将使您的post调用同步。

如果您在程序开始时使用此代码,则此代码可以正常工作,但这是异步的,要使其与您的程序同步,您需要使用promise。 对于你问题的第三部分,你需要这样做

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

您使用的是特定的框架/库吗?您好@bryan60,我没有使用任何特定的Javascript库。我很乐意使用完成任务的JS库。您不能使用post方法在url中发送数据。您需要在标头中以键值对的形式传递凭据。使用jQuery,它易于使用,功能丰富provided@AbhishekParmar非常感谢您的评论,但是我该如何使用jquery来实现这一点呢?从语法上看,它是什么样子的?谢谢@Tico,所以这段代码返回了一个令牌,它回答了我问题中的第1点和第2点,非常好。但我不清楚该令牌如何用于发出GET或PUSH请求。你能举个基本的例子吗?假设只有一个字段可以获取/推送到:test_text。很好,我想这回答了我的问题。非常感谢!
$.ajax({
       type: 'GET',
       url: 'http://your_url' + "/token=" + your_token,
       success: function(res){
               console.log(res)
       },
       error: function(error) {
           callbackErr(error,self)
       }
   })