当我一直得到 401 时,如何使用标题删除 axios?

Posted

技术标签:

【中文标题】当我一直得到 401 时,如何使用标题删除 axios?【英文标题】:How to axios DELETE with header when I'm getting 401 all the time? 【发布时间】:2020-04-07 04:23:59 【问题描述】:

我在使用 axios 调用 DELETE 时遇到问题。当我尝试通过邮递员删除实体时,一切正常,从我的 axios 我可以发布/获取/修补实体,但即使传递 null 而不是有效负载,删除也会抛出 401。已经尝试了很多变化,但没有积极的结果。

最好的问候!

 return new Promise((resolve, reject) => 
                let id=payload.id;
                let url="http://localhost:8080/cars/"+id
                let config = 
                    headers: 
                        "Authorization": "Bearer "+localStorage.getItem('token'),
                        "Content-Type": "application/json",
                        "Access-Control-Allow-Origin": "*"
                      
                      

                axios.delete(url, payload, config)
                .then((data,status) => 
                    if(status === 200)
                        resolve(true);
                    
                )
                .catch(error=> 
                    reject(error);
                )
            

【问题讨论】:

401 未授权意味着您的 localStorage.getItem('token') 返回对后端无效的令牌。 问题可能出在您的后端代码中。 auth 中间件返回 401。检查令牌是否与请求一起传递 我的后端看到的是 null 而不是 token。我不知道为什么,只有在这种情况下,因为同时发送补丁/获取等其他请求效果很好,并且存在令牌...... 【参考方案1】:

我明白了!在这种情况下,axios 请求应该是这样的,因为这种方法中的 axios 可能有不同的方法来暴露他的标头或类似的东西,我不知道..但是如果你像这样传递所有东西,那么它会起作用。这就像在删除方法(url,数据)中只允许 2 个对象,其中数据可能包含标题,而不是像 post/delete/patch 方法中允许的 3 个对象,其中(url,有效负载,标题)是允许的

return new Promise((resolve, reject) => 
                    let id=payload.id;
                    let url="http://localhost:8080/cars/"+id
                    let token=localStorage.getItem('token')
                   axios.delete(url,headers:Authorization:'Bearer '+token, 'Content-Type':'application/json', 'Access-Control-Allow-Origin':'*')
                    //axios.delete(url, payload, config)
                    .then((data,status) => 
                        if(status === 200)
                            resolve(true);
                        
                    )
                    .catch(error=> 
                        reject(error);
                    )
                ); 

【讨论】:

【参考方案2】:

如果您查看https://restfulapi.net/http-status-codes/,您会看到 401 代表“未经授权”,这意味着您的 localStorage.getItem('token') 正在返回您的后端无法接受的内容,请尝试检查它返回的内容确定一切都很好。

【讨论】:

我的后端看到 null 而不是 token(由控制器中的简单 sout 打印)。我不知道为什么,仅在这种情况下,因为我同时发送的其他请求(例如我正在发送的补丁/获取)效果很好,并且存在令牌...仅在删除时不存在... 你可以检查localStorage本身,也许在这种情况下,可以删除令牌或其他东西。 令牌存在于本地存储中 但是现在我可以将我的补丁请求与删除请求进行比较,并且补丁请求令牌存在于请求标头中,但删除请求中没有..我不明白【参考方案3】:

即使我在本地存储中有令牌,我也收到了 401 响应。但添加后

“内容类型”:“应用程序/json”

到我的标题我得到了 200 OK。希望对你也有帮助。

axios.delete(`yourURL`, 
      headers: 
        'Content-Type': 'application/json',
        'Authorization': `Bearer $localStorage.getItem("your_token")` 
      
    )

【讨论】:

以上是关于当我一直得到 401 时,如何使用标题删除 axios?的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net 6 授权。我有能力向客户端发送 JWT,但是当我尝试访问我的端点时,我得到 401。非常困惑

如何识别 ionic 和 ios 上的 401 和 408(超时)错误?

如何修复PUT Invoke-RestMethod中的“401 Unauthorized”错误(试图替换存储过程)

Smack 错误未授权(401)

如何使用 vue axios 在 laravel 中解决 401 未授权响应

护照-jwt sequelize 401 总是